0

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

私は現在 Python と Maxscript を使用していますが、C++ に移行してカスタム バイナリ ファイルを使用することを考えていますが、それで大きな違いが生じるとは思いません。ファイル。

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

1 に答える 1

0

c++ は、maxscript に比べて非常に高速です。

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

maxscriptとc++の両方で、ascii\xlmで動作するいくつかのエクスポーター\インポーターを作成しました。速度が必要な場合は、このためのc++プラグインが最適です。また、バイナリとして書き込みを行うと、さらに高速になります。

于 2011-08-12T09:54:40.517 に答える