gpt4 book ai didi

c++ - 基于四元数的相机不需要的滚动

转载 作者:行者123 更新时间:2023-11-28 07:11:49 25 4
gpt4 key购买 nike

我正在尝试实现基于四元数的相机,但当绕 X 轴和 Y 轴移动时,相机会在 Z 轴上产生不需要的滚动。我希望能够在所有轴上自由环顾四周。我已经阅读了有关此问题的其他主题(例如:http://www.flipcode.com/forums/thread/6525),但我不明白“通过围绕世界轴旋转不断重建旋转矩阵来解决此问题,即围绕 <1,0 ,0>、<0,1,0>、<0,0,1>,而不是您的本地坐标,无论它们是什么。”

//Camera.hpp
glm::quat rotation;

//Camera.cpp
void Camera::rotate(glm::vec3 vec)
{
glm::quat paramQuat = glm::quat(vec);
rotation = paramQuat * rotation;
}

我这样调用旋转函数:

cam->rotate(glm::vec3(0, 0.5, 0));

这一定与本地/世界坐标有关,对吧?我只是不明白,因为我认为四元数总是基于彼此(因此四元数不能在“世界”或“本地”空间中?)。另外,我应该为一台相机使用多个四元数吗?

最佳答案

据我所知,通过查看您提供的代码,它们的意思是您不应该通过一直在旋转 quat 上应用旋转来逐步存储和应用旋转,而是跟踪每个轴(世界空间中的 X 和 Y)的两个四元数,并将旋转 vector 计算为它们的乘积。

[编辑:一些添加的(伪)代码]

// Camera.cpp
void Camera::SetRotation(glm::quat value)
{
rotation = value;
}

// controller.cpp --> probably a place where you'd want to translate user input and store your rotational state
xAngle += deltaX;
yAngle += deltaY;
glm::quat rotationX = QuatAxisAngle(X_AXIS, xAngle);
glm::quat rotationY = QuatAxisAngle(Y_AXIS, yAngle);
camera.SetRotation(rotationX * rotationY);

关于c++ - 基于四元数的相机不需要的滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20855797/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com