先平移后旋转vs先旋转后平移


从书上和别人的言论里,听到很多说法:“先平移后旋转,先旋转后平移是不一样的” “平移和旋转的操作对象是物体,还是坐标系?” “旋转的第一个角度参数是为逆时针指定的” “程序指定顺序和机器执行顺序是相反的”..所谓“眼见为实”,亲自试验,才可信:

先上图:  

平移操作:glTranslatef(180.0f,0.0f,0.0f);

旋转操作:glRotatef(105.0f,0.0f,0.0f,1.0f);

(开始采用的是球体,但不如有棱角的立方体更能说明问题)

第一个图是先旋转,后平移的效果。它能说明:1.glTranslatef glRotatef的对象都是坐标系,否则蓝色的立方体不会出现在左上方(可能会出现在右方);2.机器执行顺序与代码指定顺序是一致的,否则蓝色的立方体不会是“绕自身中心旋转”的效果,而可能是仍然“端端正正”--绕非自身轴旋转的效果;3.glRotatef函数的第一个角度参数确实是针对逆时针(CCW)的。

第二个图是先平移,后旋转的效果。起初怎么也不解,甚至怀疑库文件是否完整(专门换了一个更早的库版本跑同一个测试程序,结果是一样的,这至少证明库文件没问题)。后来,洗了个澡,一身清爽,刹那间就来了灵感:这样才对啊,因为平移的是坐标系,也就是经过glTranslate后原点平移到了图中蓝色立方体的中心,然后坐标系(带动它上面的stuff)绕z轴(由屏幕指向外)旋转105°--关键是原点的位置。

ps:遇事多动脑筋,问题总能解决的。加油!

贴上测试代码:

// Test4GL.cpp : Defines the entry point for the console application.
//
//MBD,不能运行。dog-shit stuff.改成GLUT_SINGLE,glFlush()就能跑了。
#define FREEGLUT_STATIC
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glu.h>

void SetupRC()
{
	glClearColor(0.0f,0.0f,0.0f,1.0f);
	glColor3f(1.0f,0.0f,0.0f);

	glEnable(GL_DEPTH_TEST);
}

void RenderScene()
{
	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
	glPushMatrix();

	glColor3f(1.0f,0.0f,0.0f);
	//glutSolidSphere(20.0,15,15);
	glutSolidCube(48);

	glColor3f(0.0f,0.0f,1.0f);
	//这里可以更改平移、旋转的先后顺序
	glRotatef(105.0f,0.0f,0.0f,1.0f);
	glTranslatef(180.0f,0.0f,0.0f);

	//glutSolidSphere(20.0,14,14);
	glutSolidCube(48);

	glPopMatrix();

	//glutSwapBuffers();
	glFlush();//没有这句,只显示白茫茫的一片 。对比其他程序好像都没写glFlush().?
}

void ChangeSize(int w,int h)
{
	if(h==0)
		h=1;
	glViewport(0,0,w,h);
	glMatrixMode(GL_PROJECTION);
	glLoadIdentity();
	if(w<=h)
		glOrtho(-200.0f,200.0f,-200.0f,200.0f*h/w,200.0f,-200.0f);
	else
		glOrtho(-200.0f,200.0f*w/h,-200.0f,200.0f,200.0f,-200.0f);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();

	glutPostRedisplay();
}

int main(int argc,char** argv)
{
	glutInit(&argc,argv);
	glutInitWindowSize(400,300);
	glutCreateWindow("Testing glRotatef");

	glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH);
	glutDisplayFunc(RenderScene);
	glutReshapeFunc(ChangeSize);

	SetupRC();
	glutMainLoop();
	return 0;
}

  


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM