nomutilisateur

10-01-2013, 11:42 AM

hi i want to know how to rotate a sphere in any angle with opengl thanks

View Full Version : opengl rotate

nomutilisateur

10-01-2013, 11:42 AM

hi i want to know how to rotate a sphere in any angle with opengl thanks

mireazma

10-02-2013, 04:01 AM

Let's find your answer by taking the dot product of the fact that I'm just a noob in this matter with your question being a little generic :D

what do you mean by "rotate a sphere"?

I presume it's a model like any other and you want to spin it by yaw, pitch and roll amounts, so you'll have to rotate all its vertices.

I don't know whether OpenGl has a built-in function for this but here's what needs to be done:

for each vertex

- (rotate by x, rotate by y, rotate by z), that is get the total rotation matrix by multiplying the rotation matrices per axis, in the reversed order

Totalrot = Zrot . Yrot . Xrot. A faster algorithm is

mat4 rotByEulers(float angle_x, float angle_y, float angle_z)

{

mat4 TotalRot;

float A = cos(angle_x);

float B = sin(angle_x);

float C = cos(angle_y);

float D = sin(angle_y);

float E = cos(angle_z);

float F = sin(angle_z);

float AD = A * D;

float BD = B * D;

TotalRot[0][0] = C * E;

TotalRot[0][1] = -C * F;

TotalRot[0][2] = D;

TotalRot[1][0] = BD * E + A * F;

TotalRot[1][1] = -BD * F + A * E;

TotalRot[1][2] = -B * C;

TotalRot[2][0] = -AD * E + B * F;

TotalRot[2][1] = AD * F + B * E;

TotalRot[2][2] = A * C;

TotalRot[0][3] = TotalRot[1][3] = TotalRot[2][3] = TotalRot[3][0] = TotalRot[3][1] = TotalRot[3][2] = 0;

TotalRot[3][3] = 1;

return TotalRot;

}

OR

- rotate it by arbitrary axis uvw, by angle a (quaternion style)

mat4 rotByAxisAngle(vec3 axis, float a)

{

mat4 TotalRot;

rcos = cos(a);

rsin = sin(a);

TotalRot[0][0] = rcos + axis.u * axis.u * (1-rcos);

TotalRot[1][0] = axis.w * rsin + axis.v * axis.u * (1-rcos);

TotalRot[2][0] = -axis.v * rsin + axis.w * axis.u * (1-rcos);

TotalRot[0][1] = -axis.w * rsin + axis.u * axis.v * (1-rcos);

TotalRot[1][1] = rcos + v*v*(1-rcos);

TotalRot[2][1] = axis.u * rsin + axis.w * axis.v * (1-rcos);

TotalRot[0][2] = axis.v * rsin + axis.u * axis.w * (1-rcos);

TotalRot[1][2] = -axis.u * rsin + axis.v * axis.w * (1-rcos);

TotalRot[2][2] = rcos + axis.w * axis.w * (1-rcos);

TotalRot[3][3] = 1;

TotalRot[0][3] = TotalRot[1][3] = TotalRot[2][3] = TotalRot[3][0] = TotalRot[3][1] = TotalRot[3][2] = 0;

TotalRot[3][3] = 1;

return TotalRot;

}

There might be a little problem with the algorithms being row/column-major, as I'm confused which is which.

I may have answered to your question and not answered to your problem but this is all I know. I hope there's a shorter way, like this kind of functions even quaternions are already in libraries. I myself would like to know.

what do you mean by "rotate a sphere"?

I presume it's a model like any other and you want to spin it by yaw, pitch and roll amounts, so you'll have to rotate all its vertices.

I don't know whether OpenGl has a built-in function for this but here's what needs to be done:

for each vertex

- (rotate by x, rotate by y, rotate by z), that is get the total rotation matrix by multiplying the rotation matrices per axis, in the reversed order

Totalrot = Zrot . Yrot . Xrot. A faster algorithm is

mat4 rotByEulers(float angle_x, float angle_y, float angle_z)

{

mat4 TotalRot;

float A = cos(angle_x);

float B = sin(angle_x);

float C = cos(angle_y);

float D = sin(angle_y);

float E = cos(angle_z);

float F = sin(angle_z);

float AD = A * D;

float BD = B * D;

TotalRot[0][0] = C * E;

TotalRot[0][1] = -C * F;

TotalRot[0][2] = D;

TotalRot[1][0] = BD * E + A * F;

TotalRot[1][1] = -BD * F + A * E;

TotalRot[1][2] = -B * C;

TotalRot[2][0] = -AD * E + B * F;

TotalRot[2][1] = AD * F + B * E;

TotalRot[2][2] = A * C;

TotalRot[0][3] = TotalRot[1][3] = TotalRot[2][3] = TotalRot[3][0] = TotalRot[3][1] = TotalRot[3][2] = 0;

TotalRot[3][3] = 1;

return TotalRot;

}

OR

- rotate it by arbitrary axis uvw, by angle a (quaternion style)

mat4 rotByAxisAngle(vec3 axis, float a)

{

mat4 TotalRot;

rcos = cos(a);

rsin = sin(a);

TotalRot[0][0] = rcos + axis.u * axis.u * (1-rcos);

TotalRot[1][0] = axis.w * rsin + axis.v * axis.u * (1-rcos);

TotalRot[2][0] = -axis.v * rsin + axis.w * axis.u * (1-rcos);

TotalRot[0][1] = -axis.w * rsin + axis.u * axis.v * (1-rcos);

TotalRot[1][1] = rcos + v*v*(1-rcos);

TotalRot[2][1] = axis.u * rsin + axis.w * axis.v * (1-rcos);

TotalRot[0][2] = axis.v * rsin + axis.u * axis.w * (1-rcos);

TotalRot[1][2] = -axis.u * rsin + axis.v * axis.w * (1-rcos);

TotalRot[2][2] = rcos + axis.w * axis.w * (1-rcos);

TotalRot[3][3] = 1;

TotalRot[0][3] = TotalRot[1][3] = TotalRot[2][3] = TotalRot[3][0] = TotalRot[3][1] = TotalRot[3][2] = 0;

TotalRot[3][3] = 1;

return TotalRot;

}

There might be a little problem with the algorithms being row/column-major, as I'm confused which is which.

I may have answered to your question and not answered to your problem but this is all I know. I hope there's a shorter way, like this kind of functions even quaternions are already in libraries. I myself would like to know.

Powered by vBulletin® Version 4.2.3 Copyright © 2017 vBulletin Solutions, Inc. All rights reserved.