Question

I'm trying to create a custom point cache format for Houdini and 3D Max. I have managed to send geometry data between both programs using a custom ascii and xml file. The file is just a list of vectors for every frame of animation. I am basically looping throught the vectors from the file and setting the objects position in Houdini and Max when ever the frame changes. The problem is that it if there is more than 500 vectors for every frame then it starts going too slow. I dont know if there is a more efficent way to read the vectors from the file.

I am currently using Python and Maxscript but am thinking of moving to C++ and using a custom binary file but dont think thats gonna make much difference.Below is the Python code from houdini using an xml file which seems to be a little quicker than the ascii file.

import os
import xml.etree.ElementTree

#XML file
if hou.frame() == 1:
    filePath = os.path.abspath("F:\My Documents\Work\University\Year 3\Final Majour Project\Output_Test.xml")
    xmlFile = xml.etree.ElementTree.parse(filePath)

# This code is called when instances of this SOP cook.
geo = hou.pwd().geometry()

# Add code to modify the contents of geo.
def moveObjectDef():
    sceneTime = int(hou.frame()) #Current frame time
    frameTag = xmlFile.findall('frame')
    frameValue = frameTag[sceneTime].get('currentFrame')
    frame = int(frameValue.rstrip('f'))

    objectTag = xmlFile.findall('frame/object')
    objectVertAmount = objectTag[frame].get('vertcount')

    vertsTagList = list(objectTag[frame].getiterator('verts'))

    for v in range(int(objectVertAmount)): #Looping through vert list
        vert = eval(vertsTagList[v].text)
        hou.node('/obj/geo1/newop1').geometry().points()[v].setPosition([vert[0],vert[2],vert[1]]) #Setting point poistion

moveObjectDef()

Xml file layout

<?xml version="1.0"?>
<root>
 <frame currentFrame="0f">
  <object transform="(matrix3 [1,0,0] [0,1,0] [0,0,1] [-74.0923,-1.78125,0])" vertcount="482">
   <verts>[-74.0923,-1.78125,25.9382]</verts>
   <verts>[-74.0923,3.27904,25.4398]</verts>...
   .............
Was it helpful?

Solution

c++ is extremely fast compared to maxscript.

If you ask me that is the only way to go.

I've written several exporters \ importers that works with ascii\xlm, both in maxscript and c++, and c++ plugin for this is the way to go if you want speed. Also writing to\ reading as binary makes it even faster.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top