Jump to content
  • Advertisement

Archived

This topic is now archived and is closed to further replies.

Phantom88

Rotating a vector

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

If you intended to correct an error in the post then please contact us.

Recommended Posts

Advertisement
you mean around an origen with an end at the relative 0,0,0? or rotate it around a point where its not contacting the origen?

Share this post


Link to post
Share on other sites
This is a function i wrote some time ago, the input r is in degrees.
I have not been able to test it though, hope it works


void rotVector(float r[3], float v[3], float *ret)
{
float a[3];

r[0]=r[0]/(180/3.1415);
r[1]=r[1]/(180/3.1415);
r[2]=r[2]/(180/3.1415);

a[0]=(cos(r[1])*cos(r[2])*v[0])+(sin(r[2])*v[0])+(asin(r[1])*v[0]);
a[1]=(asin(r[2])*v[1])+(cos(r[0])*cos(r[2])*v[1])+(sin(r[0])*v[1]);
a[2]=(sin(r[1])*v[2])+(asin(r[0])*v[2])+(cos(r[0])*cos(r[1])*v[2]);

ret=a;
}

Share this post


Link to post
Share on other sites
4X4 is for whimps, you only need a 3X3 + a float.

I wrote this function from another function i have that creates a new rotation matrix. it probobly dosn''t work anyway, and i do got other more solid functions.

Share this post


Link to post
Share on other sites
Yes, i mean around the origin.
lc_overlord, your code doesn''t work. You said you have a other one?
Are there any good tutorials about matrices? Or does anyone else have a good function to do this?

~Phantom88~

Share this post


Link to post
Share on other sites
I know it dosn''t work.
the other one is realy a colection of 4 functions that really are basic some matrix tranformation fuctions.

These should work for what they where written for, i don''t know if that''s what you want.

The rotVector function should rotate a vector a specified nubmer of derees.

a matrix is a float[12]


void rot3_2_matrix(rot3 r, float *retM)
{
matrix a,b,c,d,e;

r[0]=r[0]/(180/3.1415);
r[1]=r[1]/(180/3.1415);
r[2]=r[2]/(180/3.1415);



a[0]=1; a[1]=0; a[2]=0; a[3]=0;
a[4]=0; a[5]=cos(r[0]); a[6]=-sin(r[0]);a[7]=0;
a[8]=0; a[9]=sin(r[0]);a[10]=cos(r[0]); a[11]=0;

b[0]=cos(r[1]); b[1]=0; b[2]=sin(r[1]);b[3]=0;
b[4]=0; b[5]=1; b[6]=0; b[7]=0;
b[8]=-sin(r[1]);b[9]=0; b[10]=cos(r[1]);b[11]=0;

c[0]=cos(r[2]); c[1]=-sin(r[2]);c[2]=0; c[3]=0;
c[4]=sin(r[2]); c[5]=cos(r[2]); c[6]=0; c[7]=0;
c[8]=0; c[9]=0; c[10]=1; c[11]=0;

Combine_Matrix(a,b,d);
Combine_Matrix(c,d,e);

memcpy(retM,e,48);
}

void rotVector(float r[3], float v[3], float *ret)
{
matrix a;

rot3_2_matrix(r,a);

Translate_Vertic(v,a,ret);


memcpy(ret,a,12);
}


void Translate_Vertic(vec3 vert, matrix Matrix, float *ret)
{
vec3 v;



v[0] = vert[0] * Matrix[0] + vert[1] * Matrix[1] + vert[2] * Matrix[2] +Matrix[3];
v[1] = vert[0] * Matrix[4] + vert[1] * Matrix[5] + vert[2] * Matrix[6] +Matrix[7];
v[2] = vert[0] * Matrix[8] + vert[1] * Matrix[9] + vert[2] * Matrix[10] +Matrix[11];

memcpy(ret,v,12);
}

void Combine_Matrix(matrix MatrixA,matrix MatrixB, float *retM)
{
matrix NewMatrix;
int i;

for(i = 0; i < 3; i++){ //Cycle through each vector of first matrix.
NewMatrix[i*4] = MatrixA[i*4] * MatrixB[0] + MatrixA[i*4+1] * MatrixB[4] + MatrixA[i*4+2] * MatrixB[8];
NewMatrix[i*4+1] = MatrixA[i*4] * MatrixB[1] + MatrixA[i*4+1] * MatrixB[5] + MatrixA[i*4+2] * MatrixB[9];
NewMatrix[i*4+2] = MatrixA[i*4] * MatrixB[2] + MatrixA[i*4+1] * MatrixB[6] + MatrixA[i*4+2] * MatrixB[10];
}
NewMatrix[3] = MatrixA[3] + MatrixB[3];
NewMatrix[7] = MatrixA[7] + MatrixB[7];
NewMatrix[11] = MatrixA[11] + MatrixB[11];
/*this should combine the matrixes*/

memcpy(retM,NewMatrix,48);
}

Share this post


Link to post
Share on other sites

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!