【问题标题】:Is there anything outside of projection and modelView matix to effect a vertex postion?投影和模型视图矩阵之外是否有任何东西可以影响顶点位置?
【发布时间】: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 的前向向量(矩阵的第三行),问题就会减少,但这只是对更大问题的破解。 当我说“与文档相同”时,那是在使用数字之前。

Screen Shot

【问题讨论】:

  • 问题不太清楚——这里可以有很多变量,至少提供源代码以便审阅者查看。

标签: c++ opengl qt4


【解决方案1】:

固定函数的顶点变换是明确规定的:

  1. 对象空间到眼睛空间,仅由 ModelView 矩阵和输入顶点的xyzw 对象空间位置定义。你好像用的是glVertex3f,所以输入w就是1。
  2. 眼睛空间到剪辑空间。由投影矩阵控制。
  3. 将空间剪辑到 ndc。这仅取决于剪辑空间坐标,因为它只会将xyz 除以w。通过使剪辑空间w 成为眼睛空间xyz 坐标的函数(通常只是z),投影矩阵将间接影响这一步。
  4. NDC 到屏幕空间。对于xy,视口设置将是相关的。对于z,转换由glDepthRange() 控制

所以我提到的唯一你没有检查的是深度范围,但它不会影响窗口空间中图元的 2D 位置 - 你可能只能用它搞砸深度测试。

我注意到如果我修改查看函数以使用前向向量 幅度为 0.05 时,问题减少了,但这只是 破解一个更大的问题。

这是一个非常强烈的暗示,表明您的矩阵只是错误。这也是一个自相矛盾的说法:

仅供参考,两个矩阵都只是加载而不是使用调用 glLookAt() 或 gluperspective(),但在逻辑上它们与 那些功能。

除了浮点精度问题——以及如果你将空向量作为前向方向时明显的奇异性——如果你只改变前向向量的长度,gluLookAt 将始终产生相同的矩阵。您的代码肯定与 gluLookAt() 所做的不同。

【讨论】:

  • 感谢 Derhass,我只是想确保我们在同一页面上:1)我没有忽略一些会导致此错误的配置,并且 2)这看起来纯粹矩阵上的错误(可能是精度错误)?另外附带说明:是的,“hack”确实与文档中显示的等式背道而驰,但是当撤消它时它是相同的。区别在于我是否将矩阵的第三行乘以一个幅度。
  • 这看起来不像任何精度错误。看起来要么你设置了矩阵,所以它应该看起来像它的样子,或者你的矩阵函数是错误的。由于您没有详细说明您使用的投影参数,或者您如何计算和应用这些矩阵,因此任何人都无法弄清楚发生了什么。
  • 好吧,在这一点上,它缩小了我的错误的范围,并回答了“我是否留下了任何石头”的问题。 Derhass,既然你似乎确信它是矩阵,那将是我的下一个问题(线程)。
猜你喜欢
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
  • 1970-01-01
相关资源
最近更新 更多