【发布时间】:2019-06-19 03:33:54
【问题描述】:
我正在尝试实现 yaw pitch roll 用于可视化相机 yaw pitch roll 超过 360 度,例如在 Maya、Blender、Unreal Engine、Unity 等中。所有这些应用程序都可以在 gui 中显示超过 360 度的角度并且没有任何云台锁定问题。
当前psevdo代码;
Quaternion rotation; //relative (local rotation)
Quaternion parentRotation;
//it is psevdo code where we calculate delta angle that user generate on current frame by mouse
void SetDeltaWorldRotationFromUserInput(Quaternion value)
{
SetWorldRotation(value);
}
void SetWorldRotation(Quaternion value)
{
SetLocalRotation(parentQuaternion.inverted() * value); //get/set local rotation
}
void SetLocalRotation(Quaternion value)
{
rotation = value; //this we save new local rotation but i want to save somehow more then 360 degree
auto eulersForGui = value.toEulers(); //it is current eulers but i want to accumulate and show in gui accumulate rotation. like currentRotation + delta or somehow
auto deltaEulers = (value * rotation.inverted()).toEulers(); //i can get delta eulers but i can't add it to euelers and don't know what i need to do with this value
}
【问题讨论】:
-
正如您的问题标题所示,累积角度,而不是四元数 - 您可以在角度更新时重新计算四元数。
-
我围绕枢轴旋转对象,然后重新计算它的位置,通过反转括号四元数将其与父级关联,之后我失去了原始角度,无论如何欧拉不能最简单地添加到最后一个欧拉
-
不明白你的意思;如果可以存储角度,为什么还需要重新计算角度?使用累积的角度计算局部四元数并与父四元数相乘得到全局变换。
-
我不知道如何积累欧拉。我知道我不能简单地将偏航添加到偏航。你能以某种方式解释它。还是谢谢你的回答
-
您可以直接根据鼠标移动来累积角度 - 每个游戏/CAD 软件都是这样做的,但是您不能通过添加它们来组合欧拉角变换;这是两个不同的概念。
标签: c++ opengl camera rotation trigonometry