先平移后旋轉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