x
• Status: Solved
• Priority: Medium
• Security: Public
• Views: 374

# Matrix Concatenation and Glide

Hey, I have writen a small 3d engine.
However, I need to rotate a object, as well as keep the object in place and expand it.  I have read in the MSDN that the corret way to do this is to multiply the two matrixs. I did this, using the code on question:http://www.experts-exchange.com/jsp/qShow.jsp?ta=cprog&qid=10294246
However, this does not work. The matrixs are:
matrix Org={10,0,0,10,
0,10,0,10,
0,0,10,10,
0,0,0,0};

matrix roat={1,1,1,1,
1,cosf(movex),sinf(movex),1,
1,(-sinf(movex)),cosf(movex),1,
1,1,1,1};
could someone show me the correct matrix? Or if this is correct, can someone show me a multiplied matrix that works, so I can debug? Thanks

0
laeuchli
• 4
• 2
1 Solution

Commented:
For 3D rotation, you have to multiply 3 matrix to the coordinates

The first one is shift to orgin

matrix MoveToOrg={1,0,0,0,
0,1,0,0,
0,0,1,0,
-x,-y,-z,1};

For rotation, to represent according to z -axis

matrix
RotatoZ={conf(anglez),sinf(anglez),0,0,
sinf(anglez),conf(anglez),0,0,
0,0,1,0,
0,0,0,1};

along x-axis
RotateX={1,0,0,0,
0,conf(anglex),sinf(anglex),0,
0,-sinf(anglex),cosf(anglex),0,
0,0,0,1};

along y-axis
RotateY={cosf(angley),0,-sinf(angley),0,
0,1,0,0,
sinf(angley),0,cosf(angley),0,
0,0,0,1};

And then shift back from orgin

matrix MoveBack={1,0,0,0,
0,1,0,0,
0,0,1,0,
x,y,z,1};

You have to multiply all of them in order to produce a new matrix for 3D object rotation

0

Author Commented:
All I really wanted to do, was roate on the X axis, and keep every thing the right size. I don't at the time want to rotate on the Y and Z axis. Do I still have to multily all the matrixs?
0

Author Commented:
Could you show me a finished example matrix for a roation about the x axis?I seem to have bug in my program.

0

Commented:
For example if you want to rotate along x-axia for 30 degree

First of all you have to change the unit from degree to radian
Let's assume the rotation center is at origin

#include <math.h>

struct Point
(
float x,y,z;
};

main()
{
struct Point p;
struct Point np;
p.x=1;
p.y=1;
p.z=1;

float d=30;
float r=(float)d*PI/180.0;

float MatRotat[4][4];

for(int i=0;i<4;i++)
for(int j=0;j<4;j++)
MatRotat[i][j]=0;

// 1,   0   ,  0   ,0
// 0, cos(r),sin(r),0
// 0,-sin(r),cos(r),0
// 0,   0   ,  0   ,1

MatRotat[0][0]=1;
MatRotat[1][1]=cos(r);
MatRotat[1][2]=sin(r);
MatRotat[2][1]=-sin(r);
MatRotat[2][2]=cos(r);
MatRotat[3][3]=1;

np.x=p.x*MatRotat[0][0]+p.y*MatRotat[0][1]+p.z*MatRotat[0][2]+MatRotat[0][3];
np.y=p.x*MatRotat[1][0]+p.y*MatRotat[1][1]+p.z*MatRotat[1][2]+MatRotat[1][3];
np.z=p.x*MatRotat[2][0]+p.y*MatRotat[2][1]+p.z*MatRotat[2][2]+MatRotat[2][3];

// np is holding new point after rotate
printf("After rotate 30 along x-axis and rotation center is origin\n");
printf("Original point (%.2f,%.2f,%.2f)\n",p.x,p.y,p.z);
printf("New point (%.2f,%.2f,%.2f)\n",np.x,np.y,np.z);

}
0

Author Commented:
ok, thanks I will get back to you, after I test it.

0

Author Commented:
Thanks, that did the trick
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

## Featured Post

• 4
• 2
Tackle projects and never again get stuck behind a technical roadblock.