Math 找到相机的滚动、偏航和俯仰,拥有它';s位置、目标和上方向向量

Math 找到相机的滚动、偏航和俯仰,拥有它';s位置、目标和上方向向量,math,graphics,3d,Math,Graphics,3d,我试图找到相机的偏航角、俯仰角和侧倾角,假设我有相机的位置,它是指向点(目标点)的look_,它是上方向向量。我的最佳尝试是使用以下代码 zaxis = lookat-position xaxis = cross(up, xaxis) yaxos = cross(zxis, xaxis) 然后我找到每个轴和法向量(1,0,0)(0,1,0)和(0,0,1)之间的角度 并将它们分配到横滚、偏航和俯仰,但这似乎不起作用 有什么想法吗,我做错了什么? 提前感谢:)您将无法获得横摇角度-因为这可能是任

我试图找到相机的偏航角、俯仰角和侧倾角,假设我有相机的位置,它是指向点(目标点)的look_,它是上方向向量。我的最佳尝试是使用以下代码

zaxis = lookat-position
xaxis = cross(up, xaxis)
yaxos = cross(zxis, xaxis)
然后我找到每个轴和法向量(1,0,0)(0,1,0)和(0,0,1)之间的角度 并将它们分配到横滚、偏航和俯仰,但这似乎不起作用

有什么想法吗,我做错了什么?
提前感谢:)

您将无法获得横摇角度-因为这可能是任何东西,但您可以获得仰角和方位角(俯仰和偏航)。我发现了一些旧的C代码,我会将其转换为伪代码,因此假设向量长度不是零:

Vector3 v = lookat - position;
double length = v.Length();

double elevation = asin(v.y / length);
double azimuth;

if (abs(v.z) < 0.00001)
{
    // Special case
    if (v.x > 0)
    {
        azimuth = pi/2.0;
    }
    else if (v.x < 0)
    {
        azimuth = -pi/2.0;
    }
    else
    {
        azimuth = 0.0;
    }
}
else
{
    azimuth = atan2(v.x, v.z);
}
vector3v=注视位置;
双倍长度=v.长度();
双立面=asin(v.y/长度);
双方位角;
如果(绝对值(v.z)<0.00001)
{
//特例
如果(v.x>0)
{
方位角=pi/2.0;
}
否则如果(v.x<0)
{
方位=-pi/2.0;
}
其他的
{
方位角=0.0;
}
}
其他的
{
方位角=atan2(v.x,v.z);
}