gpt4 book ai didi

c++ - OpenGL - 使用四元数围绕一个点旋转的相机

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:11:42 25 4
gpt4 key购买 nike

所以我目前使用四元数来存储和修改我的 OpenGL 场景中对象的方向,以及相机的方向。当直接旋转这些对象时(即说我想围绕 Z 轴旋转相机 Z 量,或者我想围绕 X 轴旋转对象 X,然后沿其局部 Z 轴平移它),我有没问题,所以我只能假设我的基本旋转代码是正确的。

但是,我现在正在尝试实现一个功能,使我的相机绕空间中的任意点旋转,但我遇到了很多困难。到目前为止,这是我想出的,但行不通(这发生在 Camera 类中)。

    //Get the inverse of the orientation, which should represent the orientation 
//"from" the focal point to the camera
Quaternion InverseOrient = m_Orientation;
InverseOrient.Invert();

///Rotation
//Create change quaternions for each axis
Quaternion xOffset = Quaternion();
xOffset.FromAxisAngle(xChange * m_TurnSpeed, 1.0, 0.0, 0.0);

Quaternion yOffset = Quaternion();
yOffset.FromAxisAngle(yChange * m_TurnSpeed, 0.0, 1.0, 0.0);

Quaternion zOffset = Quaternion();
zOffset.FromAxisAngle(zChange * m_TurnSpeed, 0.0, 0.0, 1.0);

//Multiply the change quats into the inversed orientation quat
InverseOrient = yOffset * zOffset * xOffset * InverseOrient;

//Translate according to the focal distance
//Start with a vector relative to the position being looked at
sf::Vector3<float> RelativePos(0, 0, -m_FocalDistance);
//Rotate according to the quaternion
RelativePos = InverseOrient.MultVect(RelativePos);

//Add that relative position to the focal point
m_Position.x = m_FocalPoint->x + RelativePos.x;
m_Position.y = m_FocalPoint->y + RelativePos.y;
m_Position.z = m_FocalPoint->z + RelativePos.z;

//Now set the orientation to the inverse of the quaternion
//used to position the camera
m_Orientation = InverseOrient;
m_Orientation.Invert();

最终发生的是相机围绕其他某个点旋转 - 当然不是物体,但显然也不是它本身,就好像它在空间中以螺旋路径循环。

所以这显然不是让相机围绕一个点旋转的方法,但什么才是?

最佳答案

我会先在球坐标系中对相机进行操作,然后根据需要转换为四元数。

鉴于以下假设:

  • 相机没有卷
  • 你正在看的点是[x, y, z]
  • 你有偏航角、俯仰角
  • [0, 1, 0] 是“上”

下面是一些重要值的计算方法:

  • View vector :v = [vx, vy, vz] = [cos(yaw)*cos(pitch), sin(pitch), -sin(yaw)*cos(pitch)]
  • 相机位置:p = [x, y, z] - r*v
  • 右 vector :v 与 [0, 1, 0] 的叉积
  • 上 vector :v 与右 vector 的叉积
  • 您的 View 四元数是 [0, vx, vy, vz](即 w 分量为 0 的 View vector )

现在在您的模拟中,您可以对俯仰/偏航进行操作,这非常直观。如果要做插值,将pitch+yaws前后转换成四元数,做四元数球面线性插值。

关于c++ - OpenGL - 使用四元数围绕一个点旋转的相机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14277935/

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