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