2017-02-22 6 views
1

Привет всем, У меня возникла проблема при манипулировании сфальсифицированной сеткой в ​​Panda3D. Я загрузил модель сетки, которая имеет модификатор якоря, состоящий из двух сопряженных костей (один для ладони, один для коллекции из четырех пальцев, а именно индекс, середина, кольцо и мизинец), который выглядит так: original unchanged hand model; затем я трансформирую последнюю кость (сустав), чтобы сложить четыре пальца внутрь, используя метод «controlJoint» актера. Коды здесь:Доступ к положениям вершин сфальцованной модели после поворота угла его сустава в Panda3D

self.handActor = Actor(r'/d/3DModels/TestHand.egg') 
self.handJoint1 = self.handActor.controlJoint(None, 
               'modelRoot', 
               'Bone1' 
               ) 
self.handJoint2 = self.handActor.controlJoint(None, 
               'modelRoot', 
               'Bone2' 
               ) 
self.handJoint2.setP(90) 

Затем я получил доступ к информации вершины текущей трансформированной сетки, с кодом, как это показано ниже:

geomNodeCollection = self.handActor.findAllMatches('**/+GeomNode') 
geomNodePath = geomNodeCollection[ 0 ] 
geomNode = geomNodePath.node() 
geom = geomNode.getGeom(0) 
vData = geom.getVertexData() 
reader_vertex = GeomVertexReader(vData, 'vertex') 
reader_normal = GeomVertexReader(vData, 'normal') 

vertexList = list() 
normalList = list() 

for i in xrange(2000) : 

    vertex = reader_vertex.getData3f() 
    normal = reader_normal.getData3f() 

    vertexList.append(vertex) 
    normalList.append(normal) 

Тогда я отметил каждый из этих позиций с смайлик сферой, ожидая см. облако этих смайликов, расположенных как раз подгоняясь к деформированной руке. Тем не менее, я получил облако точки оригинальной формы руки, которая сглажена, например: deformed hand model and vertices obtained shown a point cloud Любая идея о том, как получить позиции вершин, точно соответствующие деформированной ручной сетке? Благодаря!

ответ

1

Я думаю, вам нужно позвонить animateVertices на GeomVertexData, такие как:

vData = geom.getVertexData().animateVertices(True, Thread.getCurrentThread()) 

Panda автоматически кэшировать анимированный GeomVertexData.

+0

Большое спасибо, rdb! Ты прав. Я попробовал, как вы предложили, и это сработало. Кроме того, я обнаружил, что вызов «PartBundle.forceUpdate()» сразу после поворота любого сустава также необходим. –

+1

Да, обычно размещение символа в сцене делает Panda автоматически вызывать 'character.update()', но если вы извлекаете геометрию самостоятельно, вам нужно называть ее самостоятельно. Если вам понравился мой ответ, попробуйте нажать кнопку «Принять», чтобы принять этот ответ. – rdb

+0

Спасибо! Готово! Функции, подобные этим, действительно полезны, но требуется время, чтобы изучить возможность изучения документации Panda3D. К счастью получить ответ от такого эксперта, как вы, еще раз спасибо! –

Смежные вопросы