2011-08-11 17 views
0

Houdiniと3D Maxのカスタムポイントキャッシュフォーマットを作成しようとしています。カスタムasciiとxmlファイルを使用して、両方のプログラム間でジオメトリデータを送信することができました。このファイルは、アニメーションの各フレームのベクトルの一覧に過ぎません。私は基本的にファイルからベクトルをループし、フレームが変わるとHoudiniとMaxでオブジェクトの位置を設定しています。問題は、フレームごとに500以上のベクトルがある場合、遅すぎることになります。私はファイルからベクトルを読み取るより効率的な方法があるかどうかはわかりません。カスタムファイルからジオメトリデータを読み込むための最も速い方法

私は現在PythonとMaxscriptを使用していますが、C++に移動してカスタムバイナリファイルを使用することを考えていますが、少し違いがあるようなxmlファイルを使用してhoudiniのPythonコードが大きく違います。アスキーファイルよりも速い。

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ファイルのレイアウト

<?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>... 
    ............. 

答えて

0

C++のMAXScriptに比べて非常に高速です。

あなたが私に尋ねるなら、それは唯一の方法です。

私はmaxscriptとC++の両方でascii \ xlmで動作するいくつかのexporters \ importersを書いています。このためのC++プラグインは、速度を望むなら移動する方法です。 バイナリとして\ readingに書き込むことでさらに高速になります。

関連する問題