我正在尝试查找摄像机的偏航角,俯仰角和横滚角,假设我拥有摄像机的位置,它是look_at点(目标点),并且是上 vector 。我最好的尝试是通过使用以下代码

zaxis = lookat-position
xaxis = cross(up, xaxis)
yaxos = cross(zxis, xaxis)

然后我找到每个轴与法线 vector (1,0,0)(0,1,0)和(0,0,1)之间的角度
并指定他们滚动,偏航和俯仰,但似乎不起作用

有什么想法,我在做什么错?
提前致谢 :)

最佳答案

您将无法获得侧倾角-可以是任何角度,但可以获取仰角和方位角(俯仰和偏航)。我发现了一些旧的C代码,可以将其转换为伪代码,因此假设您的 vector 不是零长度:

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);
}

07-27 13:19