# MatrixStack problem

This topic is 5003 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

## Recommended Posts

Hi, I'm having some problems using the MatrixStack class in MDX (I guess it applies to normal DX aswell). The code I use to update the stack is as below.
		public void UpdateMatrices()
{
manager.World.Push();
manager.World.MultiplyMatrix(Matrix.Scaling(Scale) * Matrix.RotationQuaternion(OrientationQuat)
* Matrix.Translation(Location));
world = manager.World.Top;
foreach(SceneGraphNode child in children)
child.UpdateMatrices();

manager.World.Pop();
}


However, If I have a root node at [0, 0, 5] and a child node at [0, 2, 0] the child is node is displayed it [0, 2, 0] - not [0, 2, 5] as I think it should be. Am I doing something wrong? All of the update calls are being accessed as expected, and the mesh is rendered at the "world" position (defined in the source above. Thanks, - aCiD2

** Bump *** :)

Another bump :P

##### Share on other sites
Granted, the code seems a bit cryptic to me 'cause I don't know anything about managed programming. And when it comes to math, I describe myself as 'sly as a fox with a plastic baggie on its head'. But...

I don't see where you are applying the root node's position to the child's.
-You push a matrix onto the stack (it should be identity, right?)
-you multiply scaling; some form of quaternion rotation that I don't entirely understand (is this where the root node applies itself to the child?); and translation; then multiply the result to the world matrix from the last step
-store the new result in some variable called 'matrix'
-perform some kind of loop, where this function is called recursively on each child (?)

What is the matrix 'world'? Where else is it used? And where exactly are the effects of the parent being applied to the child?

I'm not sure if this will help or not (since I really don't know what I'm talking about ;) But I hate to leave unanswered questions on the board, especially after two bumps.

##### Share on other sites
I first set the MatrixStack to an identity matrix. Then, I push this onto the stack and times that matrix by the scaling, rotating (RotationQuaternion just converts a quaternion into a matrix) and trnasformation in _object_ space. Then, I peek the matrix stack and store it in the SceneGraph node (so I have the objects world space, useful for rendering meshs etc). In then repeat all that over again for all of the nodes children.

All of this is being accessed correctly, but something is being funny somewhere along the line :| Oh, and there's nothing wrong with the "Matrix.Scaling(Scale) * Matrix.RotationQuaternion(OrientationQuat) * Matrix.Translation(Location)" to my knowledge - it works fine because I used it for the time before I had a scene graph in.

##### Share on other sites
I must not being getting 'the big picture' here. I still don't see how the child is translated to it's parent's coordinates. Is that in another part of the scenegraph? The rendeer perhaps? Or maybe it's a feature of the recursion that I just don't see.

In other words:
Quote:
 Then, I peek the matrix stack and store it in the SceneGraph node

I take it, by this you mean the variable 'world'? How is that applied to the childeren?

Typo, I said 'matrix' when I meant 'world'
[/edit]

##### Share on other sites
When you push something onto the MatrixStack its meant to multiply it by things already in the stack, thats why MatrixStack (IDXMatrixStack in c++?) is different from a normal stack.

##### Share on other sites
Ooops [embarrass] I get it now. Sorry.

Is the data (matrix) being stored and used in the rest of the scenegraph properly?

##### Share on other sites
Yea, because if I dont parent nodes to the graph it displays fine (well, displays fine if all nodes are attached to the root node which is just an identity matrix)

##### Share on other sites
From what I can tell, there is nothing wrong with the code you posted. There isn't like, an overloaded version of the MatrixStack::MultiplyMatrix() function is there? Actually, come to think of it: in ID3DXMatrixStack, there are two versions. One gets the product of the current matrix multiplied by the given, and one gets the product of the given matrix multiplied by the current. Are you using the wrong one perhaps?

1. 1
Rutin
32
2. 2
3. 3
4. 4
5. 5

• 13
• 9
• 9
• 9
• 14
• ### Forum Statistics

• Total Topics
633317
• Total Posts
3011337
• ### Who's Online (See full list)

There are no registered users currently online

×