Привет всем, У меня возникла проблема при манипулировании сфальсифицированной сеткой в 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 Любая идея о том, как получить позиции вершин, точно соответствующие деформированной ручной сетке? Благодаря!
Большое спасибо, rdb! Ты прав. Я попробовал, как вы предложили, и это сработало. Кроме того, я обнаружил, что вызов «PartBundle.forceUpdate()» сразу после поворота любого сустава также необходим. –
Да, обычно размещение символа в сцене делает Panda автоматически вызывать 'character.update()', но если вы извлекаете геометрию самостоятельно, вам нужно называть ее самостоятельно. Если вам понравился мой ответ, попробуйте нажать кнопку «Принять», чтобы принять этот ответ. – rdb
Спасибо! Готово! Функции, подобные этим, действительно полезны, но требуется время, чтобы изучить возможность изучения документации Panda3D. К счастью получить ответ от такого эксперта, как вы, еще раз спасибо! –