2017-02-22 4 views
1

Hallo, alle, Ich habe ein Problem bei der Manipulation eines manipulierten Mesh-Modells in Panda3D gestoßen. Ich habe ein Mesh-Modell geladen, das einen Ankermodifikator hat, der aus zwei aneinander gereihten Knochen besteht (einen für die Handfläche, einen für eine Sammlung von vier Fingern, nämlich Index, Mitte, Ring und kleiner Finger), der so aussieht original unchanged hand model; dann transformiere ich den letzteren Knochen (Gelenk), um die vier Finger nach innen zu falten, wobei ich die "controlJoint" -Methode des Akteurs verwende. Codes hier:Zugriff Vertices 'Positionen eines manipulierten Modells nach dem Drehen seines Gelenkwinkels in 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) 

Dann habe ich den Scheitelpunkt Info des laufenden transformierten Gitter zugegriffen wird, mit Code wie folgt aus:

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) 

Dann habe ich jede dieser Positionen mit einem Smiley-Kugel markiert, erwartet zu Sieh dir eine Wolke dieser Smileys an, die genau um die deformierte Hand passen. Allerdings habe ich eine Punktewolke der ursprünglichen Handform, die wie folgt abgeflacht ist: deformed hand model and vertices obtained shown a point cloud Irgendeine Idee darüber, wie man die Scheitelpunkte genau zum deformierten Handgeflecht erhält? Vielen Dank!

Antwort

1

Ich glaube, Sie animateVertices auf dem GeomVertexData, wie aufrufen müssen:

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

Panda automatisch cachen die animierte GeomVertexData.

+0

Vielen Dank, rdb! Du hast recht. Ich habe versucht, wie Sie es vorgeschlagen haben und es hat funktioniert. Abgesehen davon habe ich festgestellt, dass ein Aufruf von "PartBundle.forceUpdate()" direkt nach dem Drehen einer Verbindung notwendig ist. –

+1

Ja, normalerweise platziert Panda das Zeichen automatisch in der Szene und ruft 'character.update()' auf, aber wenn Sie die Geometrie selbst extrahieren, müssen Sie sie selbst aufrufen. Wenn Ihnen meine Antwort gefallen hat, ziehen Sie in Betracht, auf die Schaltfläche "Akzeptieren" zu klicken, um diese Antwort zu akzeptieren. – rdb

+0

Danke! Es ist fertig! Funktionen wie diese sind wirklich nützlich, benötigen aber Zeit, um die Panda3D-Dokumentation zu erkunden. Glücklich, eine Antwort von einem Experten wie dir zu bekommen, nochmals vielen Dank! –

Verwandte Themen