gpt4 book ai didi

c++ - 使用四元数方向的第一人称相机中的夹紧间距

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

我正在构建一个简单的第一人称相机,它假设向上 vector 始终与世界 + Z 轴匹配,即没有滚动。

我正在使用四元数来存储相机的方向。 (我试图远离欧拉角。)

现在,假设我想将相机的可能俯仰限制在 -85 到 85 度的俯仰范围内。这意味着当我向相机应用一些额外的间距时,如果它超过上述阈值,我将需要某种逻辑来限制间距。

鉴于相机的方向存储为四元数,执行此操作的有效方法是什么?

我目前的想法是从四元数中提取前向(即注视)和右向 vector 。将前向 vector 和全局 X 或 Y vector 投影到由右 vector 的法线形成的平面中,然后找出这些投影 vector 之间的角度差。每次我改变音调时,这似乎需要做很多数学运算。假设这甚至是一个有效的解决方案,我想知道是否有更好更简单的方法......

这是我当前的音调设置代码(使用 Eigen 数学库):

void Camera::pitch(float angleInRadians)
{
if (angleInRadians != 0.0)
{

// TODO: Apply pitch restriction. <----------------- how?

mRotation *= Quaternionf(AngleAxisf(-angleInRadians, Vector3f::UnitX()));
mRotation.normalize();

mIsViewMatrixDirty = true;
}
}

最佳答案

我认为在这种情况下您不必担心四元数;你的情况是关心代表你的旋转的弧度角度,无论是俯仰,偏航还是滚动。您希望防止此角度超出范围或具有特定范围。要做到这一点很简单;您只需要一个约束或钳制函数。

template<class T>
inline void clamp( T min, T max, T &value ) {
if ( value < min ) {
value = min;
return;
}

if ( value > max ) {
value = max;
}
} // clamp

一旦您有了这个方便的通用数学函数可供使用,您便有两个选择:您可以在此函数调用中设置边界以便它是预先确定的,或者您可以修改现有的音调函数的签名以包含另外两个值以便调用者或用户可以适本地设置这些。然后在你的音高功能中,你只需按如下方式使用它:

void Camera::pitch( float angleInRadians ) {
clamp( -85.0f, 85.0f, angleInRadians );

mRotation *= Quaternionf(AngleAxisf(-angleInRadians, Vector3f::UnitX()));
mRotation.normalize();
}

或者

void Camera::pitch( float angleInRadians, float min, float max ) {
clamp( min, max, angleInRadians );

mRotation *= Quaternionf(AngleAxisf(-angleInRadians, Vector3f::UnitX()));
mRotation.normalize();
}

我认为这应该可以解决您的问题,而且它还删除了检查有效性的 if 语句。我在你的职能中省略了你的最后一句话,因为我不确定你的类(class)是否需要它,但我认为在回答你的问题时将它写在这个答案中还不够重要。

关于c++ - 使用四元数方向的第一人称相机中的夹紧间距,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34971046/

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