*我说的转动它自己的轴的对象,但我认为我的任期是错误的...我的意思是想从物体转动我的对象中心,而不是在起源GLUT矩阵乘法旋转在其自己的轴旋转对象,而不使用glRotate
我想做一个程序,在其自己的轴旋转我的对象(使用矩阵的点/顶点),而不使用glRotate或glTranslate 我所做的是使一个MatrixMultiplication功能和在X,Y旋转对象3个独立的功能和Z轴以及它们翻译使用矩阵和矩阵乘法功能的另一功能:
void MMMultiplication(float fVector[], float fMatrix[])
{
float tmpFloat;
for(int a = 0; a <= 72; a+=4)//this is 72 because the elements of my object's matrix
is also 72
{
for(int indx2= 0; indx2 < 4; indx2++)
{
tmpFloat = 0.0f;
for(int indx = 0; indx < 4; indx++)
{
tmpFloat = tmpFloat +
(fVector[indx+a] * fMatrix[(indx*4) + indx2]);
}
fVector[indx2+a] = tmpFloat;
}
}
}
和另外3个代表xy和z旋转矩阵的函数以及一个平移矩阵。
该程序会要求x,y,z坐标在那里转换对象,然后您可以使用z,x,c键盘按钮分别在x,y,z轴上旋转它,它会旋转对象其*自身轴线
我要做的就是打电话说,绘制对象RenderScene一个功能,我使用glutKeyboard功能在X,Y,Z轴旋转我的对象......
到目前为止,我程序只会在原点中正确旋转我的对象。如果我尝试在其他地方翻译主题,每当我按z,x或c时,它最终会“添加”到翻译中......我明白,我需要先将对象翻译成原点,然后再将其翻译回原点我说,它结束了翻译越走越远
反正这里是我用来使它工作至今代码...
void main(int argc, char **argv)
{
cout<<"Input:(x,y,z)";
cin>>arbitrary[0];
cin>>arbitrary[1];
cin>>arbitrary[2];
arbitrary[3] = 1.0f;
TranslateMatrix(initalpos,object,arbitrary[0],arbitrary[1],arbitrary[2]);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(1024,768);
glutCreateWindow("Rotation");
glutReshapeFunc(changeSize);
Lighting(false);
glutKeyboardFunc(processNormalKeys);
glutSpecialFunc(inputKey);
glutDisplayFunc(renderScene);
glutTimerFunc(0,Timer,0);
// Enable Depth Testing
glEnable(GL_DEPTH_TEST);
glutMainLoop();
getch();
return;
_getch();
return;
}
void renderScene()
{
glClear(GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
DrawObject(object);
glPopMatrix();
glutSwapBuffers();
}
void rotatex(float xangle)
{
glPushMatrix();
TranslateVector(object,initalpos,arbitrary[0],arbitrary[1],arbitrary[2]);
RotateX(object, xangle);//this is my x-axis rotation
TranslateMatrix(object,initalpos,arbitrary[0], arbitrary[1], arbitrary[2]);
glPopMatrix();
return;
}
void rotatey(float yangle)
{
glPushMatrix();
TranslateVector(object,initalpos,arbitrary[0],arbitrary[1],arbitrary[2]);
RotateY(object, yangle);//this is my y-axis rotation matrix
TranslateMatrix(object,initalpos,arbitrary[0] ,arbitrary[1],arbitrary[2]);
glPopMatrix();
return;
}
void rotatez(float zangle)
{
glPushMatrix();
TranslateVector(object,initalpos,arbitrary[0],arbitrary[1],arbitrary[2]);
RotateZ(object, zangle);//this is my z-axis rotation matrix matrix
TranslateMatrix(object,initalpos,arbitrary[0],arbitrary[1],arbitrary[2]);
glPopMatrix();
return;
}
void TranslateMatrix
(float fSVector[],float fEVector[], float fX, float fY, float fZ)
{
float fTranslationMatrix[16];
for (int indx = 0; indx < 16; indx++)
{
fTranslationMatrix[indx] = 0;
}
fTranslationMatrix[0] = 1;
fTranslationMatrix[5] = 1;
fTranslationMatrix[10] = 1;
fTranslationMatrix[15] = 1;
fTranslationMatrix[12] = fX;
fTranslationMatrix[13] = fY;
fTranslationMatrix[14] = fZ;
MMMultiplication(fSVector, fTranslationMatrix);
MMMultiplication(fEVector, fTranslationMatrix);
}
void processNormalKeys(unsigned char key, int x, int y)
{
switch(key)
{
case 27:
exit(0);
case 'X':
case 'x':
{
rotatex(0.5f);break;
}
case 'c':
case 'C':
{
rotatey(0.5f);break;
}
case 'Z':
case 'z':
{
rotatez(0.5f);break;
}
}
}
任何想法?
可以添加TranslateVector函数的代码?当翻译增加时,它似乎是一个错误的符号(翻译成原点,然后通过倒转符号翻译回来)。 – dyp 2010-08-29 18:34:23
我找到了解决方案......实际上我不能将它翻译成原点...... 我可以通过将它翻译为 - 他们的位置然后将它们翻译回来:D – PhoenixNoob121 2010-08-30 03:03:36