【问题标题】:Calculating a camera's normal in OpenGL?在OpenGL中计算相机的法线?
【发布时间】:2017-03-25 22:44:03
【问题描述】:

我正在使用 OpenGL 制作第一人称射击游戏,并且我正在尝试抵消物理刚体的创建(使用 Bullet 库),以便始终在相机看到的位置创建刚体而不是总是在相机前面的设定点。

显然,执行此操作的一种方法是从视图矩阵创建一个 3x3 旋转矩阵或四元组,然后将其乘以一个前向向量以获得指向相机所见位置的法线。

但是,我不确定如何获取这些值(视图矩阵中的 quat、前向向量是什么、是否必须对乘法结果进行归一化等)。我试过看教程,但我仍然不确定是否能获得这些值。

【问题讨论】:

  • 您可能应该为您的相机存储一个 3x3 矩阵,那么您想要的向量就是第 3 列。无论如何,这就是我所做的,因为相机是场景的一部分,并且像场景中的任何其他对象一样构成对象变换。

标签: c++ opengl camera


【解决方案1】:

您实际上非常接近,cameraPos 应该是正确的。鉴于您有逆视图矩阵,那么相机的法线/方向就是相机位置之前的列。

这是一些类似 GLSL 的伪代码:

mat4 inv = inverse(view);

vec3 pos = vec3(inv[3]);
vec3 dir = -vec3(inv[2]);

其中view 是相机的视图矩阵 (mat4)。

【讨论】:

  • 啊,我明白了,谢谢。那么正常只是“vec3 norm = dir * pos;”吗?如果是这样,那么您知道我将如何使用法线来抵消刚体的创建吗?它目前只是给定了相机的位置(x,y,z),但我需要始终在相机前面创建刚体(无论它的方向如何),这就是我使用法线的原因。
  • 如果正常情况下您指的是相机朝向的方向,那么这就是 dir 在这种情况下的含义。所以如果你想创建一个偏移位置,你可以使用new_pos = pos + dir * offset,其中偏移是一个长度,比如10。那么new_pos 将在dir 的方向上距离pos 10 个单位。
  • 太棒了,你刚刚帮我解决了一个长期存在的问题。我尝试使用 vec3 来偏移它,因为我希望它偏移 (0.3, 0, 2) 但这可能是我可以弄清楚的。非常感谢。
  • 实际上我遇到了一些麻烦。将方向乘以偏移量将其向前移动,但是将其移动到左侧的右侧呢?我基本上想将刚体向后和向右偏移,我该怎么做?
  • 你是想把它向后移动然后向右移动,还是只是从后面向右旋转它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多