能找到最好的解释来自:http://www.gamedev.net/topic/489879-glpushmatrixglpopmatrix--glloadmatrixf/
原理:
glPushMatrix didn't
fail to push onto the stack; it's job is to push a copy of the current matrix onto a stack of matrices. Those matrices on the stack don't interact at all. You only manipulate the current, top-most, matrix at any given time.
Example 1:
command result glLoadMatrixf(A) stack = [A] glPushMatrix() stack = [A, A] glLoadMatrixf(B) stack = [B, A] glPopMatrix() stack = [A]
Example 2:
command result glLoadMatrixf(A) stack = [A] glPushMatrix() stack = [A, A] glMultMatrixf(B) stack = [AB, A] glPopMatrix() stack = [A]
注意:glTranslate* 等都是实际调用的是glMultMatrixf
实例:
看下面的代码:
743 glPushMatrix(); 744 745 // tramsform camera 746 matrixView.identity(); 747 matrixView.rotate(cameraAngleY, 0, 1, 0); 748 matrixView.rotate(cameraAngleX, 1, 0, 0); 749 matrixView.translate(0, 0, -cameraDistance); 750 //@@ the equivalent code for using OpenGL routine is: 751 //@@ glTranslatef(0, 0, -cameraDistance); 752 //@@ glRotatef(cameraAngleX, 1, 0, 0); // pitch 753 //@@ glRotatef(cameraAngleY, 0, 1, 0); // heading 754 755 // copy view matrix to OpenGL 756 glLoadMatrixf(matrixView.getTranspose()); 757 758 drawGrid(); // draw XZ-grid with default size 759 760 // compute model matrix 761 matrixModel.identity(); 762 //matrixModel.rotateZ(45); // rotate 45 degree on Z-axis 763 matrixModel.rotateY(10); // rotate 45 degree on Y-axis 764 matrixModel.translate(0, 1, 0); // move 2 unit up 765 766 // compute modelview matrix 767 matrixModelView = matrixView * matrixModel; 768 769 // copy modelview matrix to OpenGL 770 glLoadMatrixf(matrixModelView.getTranspose()); 771 772 drawAxis();
770 glLoadMatrixf(matrixModelView.getTranspose());
不能是glMultMatrixf
作者:mathgeophysics 发表于2013-9-9 3:27:14 原文链接
阅读:120 评论:0 查看评论