2011-08-11 4 views
0

Houdini 및 3D Max에 대한 사용자 정의 포인트 캐시 형식을 만들려고합니다. 사용자 정의 ascii 및 xml 파일을 사용하여 두 프로그램간에 형상 데이터를 보낼 수있었습니다. 이 파일은 애니메이션의 모든 프레임에 대한 벡터 목록 일뿐입니다. 기본적으로 파일에서 벡터를 반복하고, 프레임이 변경 될 때마다 Houdini 및 Max에서 객체 위치를 설정합니다. 문제는 모든 프레임에 대해 500 개 이상의 벡터가있는 경우 너무 느리게 시작된다는 것입니다. 파일에서 벡터를 읽는 더 효율적인 방법이 있는지 나는 모른다.사용자 정의 파일에서 지오메트리 데이터를 빠르게 읽는 방법

저는 현재 Python과 Maxscript를 사용하고 있지만 C++로 이동하고 사용자 정의 이진 파일을 사용하려고 합니다만 별다른 차이가 없을 것이라고 생각합니다. 아래 코드는 houdini의 파이썬 코드로 약간의 것 같습니다. 아스키 파일보다 빠릅니다.

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에 쓰는 것이 더 빠릅니다.

관련 문제