gpt4 book ai didi

opengl - 理解 glPushMatrix() 和 glPopMatrix()

转载 作者:行者123 更新时间:2023-12-04 22:12:27 27 4
gpt4 key购买 nike

我有以下代码:

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();
}

用上面的代码,由于 drawRobotBaseArm();里面有一个翻译 DiskCylinder也有翻译。因为我不想要那样,所以我取消了 drawRobotBaseArm(); 的上下代码注释

这样做,以下代码:
glTranslatef(rBaseInitPos + (rBaseDim[0] / 2), rBaseDim[1] + baseIncrement + rBaseDim[1] / 2, rBaseDim[2] / 2);
glRotatef(rBaseArmRotateAngle, 0, 1, 0);

仅作用于 drawRobotBaseArm();现在, DiskCylinder不平移和旋转。

我似乎无法理解 glPushMatrix()glPopMatrix()工作。知道如何实现我正在寻找的吗?

最佳答案

(请注意,这些函数在 OpenGL 3.1+ 中已被弃用并删除。如果您正在处理一个严肃的项目,请考虑切换到 GLM 等专用数学库。)

OpenGL 保留一个 stack矩阵以快速应用和删除转换。 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

在你的例子中,做 glPush/PopMatrix附近 drawRobotBaseArm表示由 drawRobotBaseArm 完成的转换调用后反转,这样它们就不会影响任何其他对象。

关于opengl - 理解 glPushMatrix() 和 glPopMatrix(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23971752/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com