【发布时间】:2014-08-03 04:33:43
【问题描述】:
更新/结论:
只是为了节省你一些时间。在查看我的矩阵代码 100 次之后,我确信我的问题是我缺少的配置/OpenGL 调用,但是在我与 Prabindh 来来回回之后,我可能对这个假设有误。所以现在的答案是不,我没有错过任何导致立方体拉伸的设置调用,它可能只是一个错误的矩阵。当错误解决后我会更新这个问题.由于该错误不在此问题的范围内,因此我将保留它并在我知道错误的真正来源时发布链接。
问题的解决方案:
对于任何有类似拉伸形状问题的人,this 线程解决了我的问题。
澄清:
我不是在问我的代码有什么问题,而是在我已经看过的内容之外寻找什么会导致我看到的错误。我看到应该是一个立方体,显示为一个矩形框(见屏幕截图)。所以我要问的问题是:假设一个固定的管道(没有着色器),并且两个矩阵都是正确且恒定的(不调用 glTranslate、push、pop 等......);除了我检查的内容之外,还有什么可能导致立方体沿深度拉伸? 以下是设置说明和我检查的内容。请告诉我
关于代码:
- 两个矩阵均未推送或弹出
- 两者都是生成和加载的(不使用 gluperspective() 或 glLookAt())
- 生成的矩阵基于 opengl 函数文档
- 除了在屏幕调整大小上更新两者之外,不会对矩阵进行任何更改(例如翻译)
- 立方体是通过一系列顶点调用用三角形绘制的(参见下面的代码)。
glBegin (GL_TRIANGLES);
glColor4f(0.0f, 1.0f, 1.0f, 1.0f);
glNormal3f(0.0f, 1.0f, 0.0f);//顶部
glVertex3f(pt.x+1.0f, pt.y+1.0f, pt.z+1.0f);
glVertex3f(pt.x+1.0f, pt.y+1.0f, pt.z-1.0f);
glVertex3f(pt.x-1.0f, pt.y+1.0f, pt.z-1.0f);
glVertex3f(pt.x-1.0f, pt.y+1.0f, pt.z-1.0f);
glVertex3f(pt.x-1.0f, pt.y+1.0f, pt.z+1.0f);
glVertex3f(pt.x+1.0f, pt.y+1.0f, pt.z+1.0f);
glColor4f(0.0f, 1.0f, 0.0f, 1.0f);
glNormal3f(0.0f, -1.0f, 0.0f);//底部
glVertex3f(pt.x-1.0f, pt.y-1.0f, pt.z+1.0f);
glVertex3f(pt.x-1.0f, pt.y-1.0f, pt.z-1.0f);
glVertex3f(pt.x+1.0f, pt.y-1.0f, pt.z-1.0f);
glVertex3f(pt.x+1.0f, pt.y-1.0f, pt.z-1.0f);
glVertex3f(pt.x+1.0f, pt.y-1.0f, pt.z+1.0f);
glVertex3f(pt.x-1.0f, pt.y-1.0f, pt.z+1.0f);
glColor4f(0.0f, 0.0f, 1.0f, 1.0f);
glNormal3f(1.0f, 0.0f, 0.0f);//对
glVertex3f(pt.x+1.0f, pt.y+1.0f, pt.z+1.0f);
glVertex3f(pt.x+1.0f, pt.y-1.0f, pt.z+1.0f);
glVertex3f(pt.x+1.0f, pt.y-1.0f, pt.z-1.0f);
glVertex3f(pt.x+1.0f, pt.y-1.0f, pt.z-1.0f);
glVertex3f(pt.x+1.0f, pt.y+1.0f, pt.z-1.0f);
glVertex3f(pt.x+1.0f, pt.y+1.0f, pt.z+1.0f);
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
glNormal3f(-1.0f, 0.0f, 0.0f);//左
glVertex3f(pt.x-1.0f, pt.y-1.0f, pt.z+1.0f);
glVertex3f(pt.x-1.0f, pt.y+1.0f, pt.z+1.0f);
glVertex3f(pt.x-1.0f, pt.y+1.0f, pt.z-1.0f);
glVertex3f(pt.x-1.0f, pt.y+1.0f, pt.z-1.0f);
glVertex3f(pt.x-1.0f, pt.y-1.0f, pt.z-1.0f);
glVertex3f(pt.x-1.0f, pt.y-1.0f, pt.z+1.0f);
glColor4f(1.0f, 0.0f, 0.0f, 1.0f);
glNormal3f(0.0f, 0.0f, 1.0f);//前面
glVertex3f(pt.x+1.0f, pt.y+1.0f, pt.z+1.0f);
glVertex3f(pt.x+1.0f, pt.y-1.0f, pt.z+1.0f);
glVertex3f(pt.x-1.0f, pt.y-1.0f, pt.z+1.0f);
glVertex3f(pt.x-1.0f, pt.y-1.0f, pt.z+1.0f);
glVertex3f(pt.x-1.0f, pt.y+1.0f, pt.z+1.0f);
glVertex3f(pt.x+1.0f, pt.y+1.0f, pt.z+1.0f);
glColor4f(1.0f, 0.0f, 1.0f, 1.0f);
glNormal3f(0.0f, 0.0f, -1.0f);//返回
glVertex3f(pt.x+1.0f, pt.y-1.0f, pt.z-1.0f);
glVertex3f(pt.x+1.0f, pt.y+1.0f, pt.z-1.0f);
glVertex3f(pt.x-1.0f, pt.y+1.0f, pt.z-1.0f);
glVertex3f(pt.x-1.0f, pt.y+1.0f, pt.z-1.0f);
glVertex3f(pt.x-1.0f, pt.y-1.0f, pt.z-1.0f);
glVertex3f(pt.x+1.0f, pt.y-1.0f, pt.z-1.0f);
glEnd();
我检查过的内容:
- 生成透视矩阵时,角度以弧度为单位(数学函数以弧度为单位)
- 视口保持最新
- 透视矩阵与屏幕比例保持同步(反正我只是更新两个矩阵)
- 正确的矩阵加载到正确的矩阵类型
- 矩阵生成调用与文档匹配(glLookAt & gluPerspective)
- 检查立方体绘制功能(见上面的代码)
- 矩阵的排列顺序正确。=
Prabindh,我过去曾这样做过,但成功率为零。我通过询问我还没有看过什么来尝试不同的东西?而不是“这是代码,有什么问题”...
在过去的尝试中,我发布了代码段和包含所有代码的 zip 文件的链接,但要么我会收到关于没有看到问题的反馈,要么线程因零反馈而死。
原帖:
我正在尝试解决对象向背景拉伸的错误。在这一点上,我确定投影和模型视图矩阵都是正确的,在我调试了第 1000 次之后。假设两个矩阵都正确,没有设置着色器并且视口保持最新,还有什么可以操纵顶点位置?
仅供参考,这两个矩阵都是刚刚加载的,而不是使用 glLookAt() 或 gluperspective() 之类的调用,但从逻辑上讲,它们与这些函数相同。我注意到如果我修改查看函数以使用幅度为 0.05 的前向向量(矩阵的第三行),问题就会减少,但这只是对更大问题的破解。 当我说“与文档相同”时,那是在使用数字之前。
【问题讨论】:
-
问题不太清楚——这里可以有很多变量,至少提供源代码以便审阅者查看。