2017-02-22 2 views
1

Salut, tout le monde, J'ai rencontré un problème lors de la manipulation d'un modèle de maillage truqué dans Panda3D. J'ai chargé un modèle de maille qui a un modificateur d'armature composé de deux os adjoints (un pour la paume, un pour une collection de quatre doigts, à savoir l'index, le milieu, l'anneau et le petit doigt), qui ressemble à ceci: original unchanged hand model; puis je transforme le dernier os (articulation) pour replier les quatre doigts vers l'intérieur, en utilisant la méthode 'controlJoint' de l'acteur. Codes ici:Accéder aux positions des sommets d'un modèle truqué après avoir pivoté son angle d'articulation dans 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) 

J'Accession à la info sommet du maillage transformé en cours, avec le code comme ceci ci-dessous:

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) 

Je marqué chacune de ces positions avec une sphère smiley, attendant à voir un nuage de ces smileys positionnés juste autour de la main déformée. Cependant, j'ai obtenu un nuage de points de la forme de la main originale, qui est aplatie, comme ceci: deformed hand model and vertices obtained shown a point cloud Une idée sur la façon d'obtenir les positions des sommets correspondant exactement au maillage de la main déformée? Merci!

Répondre

1

Je pense que vous devez appeler animateVertices sur le GeomVertexData, tels que:

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

Panda cache automatiquement le GeomVertexData animé.

+0

Merci beaucoup, rdb! Tu as raison. J'ai essayé comme vous l'avez suggéré et cela a fonctionné. En dehors de cela, j'ai trouvé qu'un appel de "PartBundle.forceUpdate()" juste après la rotation de tout joint est nécessaire aussi. –

+1

Oui, en plaçant normalement le personnage dans la scène, Panda appelle automatiquement 'character.update()', mais si vous extrayez vous-même la géométrie, vous devez l'appeler vous-même. Si vous avez aimé ma réponse, pensez à cliquer sur le bouton Accepter pour accepter cette réponse. – rdb

+0

Merci! C'est fait! Des fonctions comme celles-ci sont vraiment utiles, mais il faut du temps pour explorer la documentation de Panda3D. Chanceux d'avoir une réponse d'un expert comme vous, merci encore! –