【问题标题】:Sight vector in OpenGLOpenGL中的视线向量
【发布时间】:2013-01-12 01:38:38
【问题描述】:

我遇到的问题是我无法在 OpenGL 中获得“视线”矢量。我做了一些研究,发现它应该是转换后的 Z 向量,但它不想工作。我有这段代码来检索块的速度(我希望它从“相机”向前移动),但它一直移动与相机无关,但与渲染世界相比始终以相同的方式移动:

GLfloat matrix[16]; 
    glGetFloatv (GL_MODELVIEW_MATRIX, matrix);
    GLfloat d = sqrt( matrix[8]*matrix[8] + matrix[9]*matrix[9] + matrix[10]*matrix[10]);
    xmov = matrix[8]/d;
    ymov = matrix[9]/d;
    zmov = matrix[10]/d;

我做错了什么?

【问题讨论】:

  • 好吧,如果它是相对于世界绘制的,那么相对于世界移动它。否则,我发现将 ModelView 拆分为 Model 和 View 矩阵很有用,并在需要时忽略后者(所以是的,它将是 Z 坐标)
  • 它是在世界上的相机位置绘制的。现在我希望它以相机“看”的方式移动,但它始终相对于场景而不是相机移动。对不起,我是 OpenGl 的新手,也许是 idk 。

标签: opengl vector 3d


【解决方案1】:

好的,现在在你澄清了你真正想做的事情之后,我很确定这是正确的答案:

你可能已经习惯了ModelView 矩阵。它本质上是由两部分组合而成的,你不觉得奇怪吗?嗯,这是给我的,在我想了一会儿之后,它是有道理的。最终顶点位置计算如下:

gl_Position = ProjectionMat * ModelViewMat * VertexPos;

你看,无论你将“相机”从原点移动[x,y,z] 还是移动对象[-x,-y,-z],对于 OpenGL 来说都没有区别——你会得到相同的结果。然而,将“相机”位置区分为可能与原点不同的位置很有用。

gl_Position = ProjectionMat * ViewMat * ModelMat * VertexPos;

我认为最自然的方法是,正如我所说,将计算分成两个矩阵:ModelView。现在场景中的每个对象都必须更改Model 矩阵,并且通过更改View 矩阵来设置摄像机位置。有意义吗?

我给你举个例子。如果您的相机在[5,0,0](对应于Translate(-5,0,0)),而您的对象在[-5,0,0],它将从相机降落10个单位。现在,当您将相机远离原点(增加第一个平移距离)时,“相机”和对象之间的距离会增加。

对象平移是模型,相机平移是视图

因此不难得出结论,如果您想忽略相机位置,只需从等式中去掉View 部分即可;现在将绘制每个对象考虑相机位置,因此仅相对于您的视口。

gl_Position = ProjectionMat * ModelMat * VertexPos;

我们的假设模型现在将从视口沿 X 轴降落 5 个单位无论您当前“正在查看”什么,我认为这几乎就是您想要实现的目标.

无论如何,你可以使用a nice tutorial about it

【讨论】:

  • 感谢您的解释 - 澄清了很多。你能给我推荐任何能更好地解释这个话题的书/教程吗?导致我的OpenGL学习如此缓慢的主要原因。我只是没有真正得到坐标和变换。
  • 链接在答案的最后一行@user1701595 :) 因为你是新来的,所以在分数下方有一个勾选按钮,将答案标记为“已接受”。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-23
相关资源
最近更新 更多