我有以下代码:
void drawObj1(){
glPushMatrix();
glTranslatef(rBaseInitPos + (rBaseDim[0] / 2), rBaseDim[1] + baseIncrement + rBaseDim[1] / 2, rBaseDim[2] / 2);
glRotatef(rBaseArmRotateAngle, 0, 1, 0);
/*
glPushMatrix();
*/
drawRobotBaseArm();
/*
glPopMatrix();
*/
glPushMatrix();
glRotatef(90, 1, 0, 0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, rCamouflage[0]);
gluQuadricTexture(obj, GL_TRUE);
gluQuadricDrawStyle(obj, GLU_FILL);
gluDisk(obj, 0, (rBaseDim[0] / 2) - 0.5, 16, 4);
gluCylinder(obj, (rBaseDim[0] / 2) - 0.5, (rBaseDim[0] / 2) - 0.5, rBaseDim[1] / 2, 16, 4);
glDisable(GL_TEXTURE_2D);
glPopMatrix();
glPopMatrix();
}
void drawScene(){
glTranslatef(X, Y, Z);
drawObj0();
drawObj1();
}
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,因为在内部和 内部drawRobotBaseArm();都有一个翻译也被翻译.由于我不想这样,我已经取消了对代码的注释DiskCylinderdrawRobotBaseArm();
这样做,代码如下:
glTranslatef(rBaseInitPos + (rBaseDim[0] / 2), rBaseDim[1] + baseIncrement + rBaseDim[1] / 2, rBaseDim[2] / 2);
glRotatef(rBaseArmRotateAngle, 0, 1, 0);
Run Code Online (Sandbox Code Playgroud)
只有作用于drawRobotBaseArm();现在的Disk和 Cylinder不平移和旋转.
我似乎无法理解如何glPushMatrix()和glPopMatrix()工作.任何想法我怎样才能实现我正在寻找的东西?
Col*_*Two 13
(请注意,在OpenGL 3.1+中不推荐使用这些函数并将其删除.如果您正在处理一个严肃的项目,请考虑切换到像GLM这样的专用数学库.)
OpenGL保留一堆矩阵以快速应用和删除转换.glPushMatrix复制顶部矩阵并将其推入堆栈,同时glPopMatrix将顶部矩阵从堆栈中弹出.所有变换函数(glScaled等)在顶部矩阵上起作用,顶部矩阵是所有渲染命令用于变换其数据的内容.
通过推送和弹出矩阵,您可以控制哪些转换适用于哪些对象,以及将转换应用于对象组,并轻松反转转换,以便它们不会影响其他对象.
一个例子:
glPushMatrix(); // Creates matrix 1 on the top
glTranslated(100, 0, 0); // Applies translation to matrix 1
drawSphere(); // Draws a sphere with translation <100, 0, 0>
glPushMatrix(); // Clones matrix 1 to create matrix 2 and pushes it on the top.
glScaled(2,2,2); // Scales matrix 2; doesn't touch matrix 1
drawSphere(); // Draws a sphere with both translation <100, 0, 0> and scale <2,2,2>
glPopMatrix(); // Deletes matrix 2; matrix 1 becomes the top.
drawSphere(); // Same as the first sphere.
glPopMarix(); // Deletes matrix 1
Run Code Online (Sandbox Code Playgroud)
在你的例子中,做glPush/PopMatrix左右drawRobotBaseArm意味着完成的变换在被drawRobotBaseArm调用之后被反转,因此它们不会影响任何其他对象.
| 归档时间: |
|
| 查看次数: |
13851 次 |
| 最近记录: |