从旋转和位置获取前向向量
Posted
技术标签:
【中文标题】从旋转和位置获取前向向量【英文标题】:Getting a forward vector from rotation and position 【发布时间】:2018-12-04 08:52:13 【问题描述】:我有一个相机类,它有旋转和位置以及从位置和旋转生成视图矩阵的方法,蚀刻帧相机将视图矩阵发送到渲染器。 (投影矩阵相同,但变化不大)。
class Renderer;
class Camera
Renderer& m_renderer;
glm::mat4 GetViewMatrix();
public:
glm::vec3 position;
glm::vec3 rotation;
float Fov;
Camera(Renderer& renderer,float Fov, int width , int height);
void MoveCamera(glm::vec3 direction);
void RotateCamera(glm::vec3 direction);
void Update();
;
我想做的是调用“MoveCamera”:
void Camera::MoveCamera(glm::vec3 direction)
this->position += direction;
与forwardDirection*deltaTime*speed
从我的主循环。我的问题是从我的旋转和位置创建一个正向矢量。
旋转是一个带有度数的向量3,用于创建这样的视图矩阵:
glm::mat4 Camera::GetViewMatrix()
glm::mat4 matRoll = glm::mat4(1.0f);
glm::mat4 matPitch = glm::mat4(1.0f);
glm::mat4 matYaw = glm::mat4(1.0f);
matRoll = glm::rotate(matRoll,glm::radians(rotation.z), glm::vec3(0.0f, 0.0f, 1.0f));
matPitch = glm::rotate(matPitch, glm::radians(rotation.x), glm::vec3(0.0f, 1.0f, 0.0f));
matYaw = glm::rotate(matYaw, glm::radians(rotation.y), glm::vec3(1.0f, 0.0f, 0.0f));
glm::mat4 rotate = matRoll * matPitch * matYaw;
glm::mat4 translate = glm::mat4(1.0f);
translate = glm::translate(translate ,-position);
return rotate*translate ;
那么在这种情况下,我应该如何从我的位置和旋转中生成一个前向矢量?
【问题讨论】:
我真的建议不要在这个用例中使用欧拉角。在这种情况下,它们有很多缺点和微不足道的好处。无论如何,前向通常是视图矩阵的第三行(或其负数)。 【参考方案1】:您可以从相机视图矩阵中提取它。
在世界空间中拥有相机变换矩阵后,您可以invert it to get the view matrix
您正在使用 uses column-major matrices 的 glm,因此您可以抓住倒置矩阵的第二列并将其标准化以获得方向。
const mat4 inverted = glm::inverse(transformationMatrix);
const vec3 forward = normalize(glm::vec3(inverted[2]));
【讨论】:
好的,但你必须翻转 z 轴或翻转 y 和 x ,就像这样 vec3 forward = normalize(glm::vec3(camera.GetViewMatrix()[2])) *vec3(1 , 1 ,-1); 你将如何用这种方法获得“左”? (x 轴) 如果您点击我发布的第一个链接,您可以看到它已经存在于矩阵中。查看称为约定的部分。 此外,还有 glm 便利功能:side = vec3(row(getViewMatrix(), 0))
以上是关于从旋转和位置获取前向向量的主要内容,如果未能解决你的问题,请参考以下文章