Самый быстрый способ прочитать данные геометрии из пользовательского файла - PullRequest
0 голосов
/ 11 августа 2011

Я пытаюсь создать собственный формат кэширования точек для Houdini и 3D Max. Мне удалось отправить данные геометрии между обеими программами, используя пользовательские файлы ASCII и XML. Файл представляет собой просто список векторов для каждого кадра анимации. Я в основном зацикливаю векторов из файла и устанавливаю положение объектов в Гудини и Максе, когда меняется кадр. Проблема в том, что если в каждом кадре более 500 векторов, он начинает работать слишком медленно. Я не знаю, есть ли более эффективный способ чтения векторов из файла.

В настоящее время я использую Python и Maxscript, но думаю о переходе на C ++ и использовании собственного двоичного файла, но не думаю, что в этом будет большая разница. Ниже приведен код Python из houdini с использованием XML-файла, который кажется немного быстрее. чем файл ASCII.

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

1 Ответ

0 голосов
/ 12 августа 2011

c ++ чрезвычайно быстр по сравнению с maxscript.

Если вы спросите меня, это единственный путь.

Я написал несколько экспортеров \ импортеров, которые работают с ascii \ xlm, как в maxscript, так и в c ++, и в плагине c ++, для этого есть способ, если вам нужна скорость. Кроме того, запись в \ читая как двоичный файл делает это еще быстрее.

...