Jump to content

  • Log In with Google      Sign In   
  • Create Account


How Render scene with 2 nested frames


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
2 replies to this topic

#1 Guido Granobles   Members   -  Reputation: 110

Like
0Likes
Like

Posted 08 November 2012 - 09:22 PM

Hi guys, I have been trying for long time figure out this:
I load a model from a directx file (I am using opnegl and Java) the model have a hierarchical system of nested reference frames (there are not bones). There is just 2 frames, one of them is called x3ds_Torso and it has a child frame called x3ds_Arm_01. Each one of them has a mesh. The thing is that I can't draw the arm connected to the body. Sometimes the body is in the center of the screen and the arm is at the top. Sometimes they are both in the center. I know that I have to multiply the matrix transformation of every frame by its parent frame starting from the top to the bottom and then I have to multiply every vertex of a mesh by its final transformation matrix. So I have this:

[source lang="java"]public void calculeFinalMatrixPosition(Bone boneParent, Bone bone) { System.out.println("-->" + bone.name); if (boneParent != null) { bone.matrixCombined = bone.matrixTransform .multiply(boneParent.matrixCombined); } else { bone.matrixCombined = bone.matrixTransform; } bone.matrixFinal = bone.matrixCombined; for (Bone childBone : bone.boneChilds) { calculeFinalMatrixPosition(bone, childBone); } }[/source]

Then multiply every vertex on the mesh:

[source lang="java"]public void transformVertex(Bone bone) { for (Iterator<Mesh> iterator = meshes.iterator(); iterator.hasNext();) { Mesh mesh = iterator.next(); if (mesh.boneName.equals(bone.name)) { float[] vertex = new float[4]; double[] newVertex = new double[3]; if (mesh.skinnedVertexBuffer == null) { mesh.skinnedVertexBuffer = new FloatDataBuffer( mesh.numVertices, 3); } mesh.vertexBuffer.buffer.rewind(); while (mesh.vertexBuffer.buffer.hasRemaining()) { vertex[0] = mesh.vertexBuffer.buffer.get(); vertex[1] = mesh.vertexBuffer.buffer.get(); vertex[2] = mesh.vertexBuffer.buffer.get(); vertex[3] = 1; newVertex = bone.matrixFinal.transpose().multiply(vertex); mesh.skinnedVertexBuffer.buffer.put(((float) newVertex[0])); mesh.skinnedVertexBuffer.buffer.put(((float) newVertex[1])); mesh.skinnedVertexBuffer.buffer.put(((float) newVertex[2])); } mesh.vertexBuffer = new FloatDataBuffer( mesh.numVertices, 3); mesh.skinnedVertexBuffer.buffer.rewind(); mesh.vertexBuffer.buffer.put(mesh.skinnedVertexBuffer.buffer); } } for (Bone childBone : bone.boneChilds) { transformVertex(childBone); } }[/source]

I know this is not the most efficient code but by now I just want to understand exactly how a hierarchical model is organized and how can I draw it on the screen.

Thanks in advance for your help.

Sponsor:

#2 Ashaman73   Crossbones+   -  Reputation: 6734

Like
0Likes
Like

Posted 09 November 2012 - 06:17 AM

newVertex = bone.matrixFinal.transpose().multiply(vertex);

Why are you multiplying the transpose matrix with the vertex ? Try to multiply with the final only .

#3 Guido Granobles   Members   -  Reputation: 110

Like
0Likes
Like

Posted 09 November 2012 - 09:02 AM

Hi thanks, I already did it but then the arm is drawn inside of the body, I mean both, the arm and the body are drawn at the center of the screen. When I multiply the transpose matrix with the vertex then the arm is drawn at the top of the screen and the body is drawn at the bottom.




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS