You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何从ARCore的相机姿态(Camera Pose)中获取偏航角(Yaw)、俯仰角(Pitch)和滚转角(Roll)的值?

如何从ARCore的相机姿态(Camera Pose)中获取偏航角(Yaw)、俯仰角(Pitch)和滚转角(Roll)的值?

嘿,我来帮你搞定这个问题!你手里这段ARCore Pose相关的Java代码,看起来是想从相机姿态里提取出偏航、俯仰和滚转角对吧?先把你给出的代码片段贴出来:

private void updateCameraPose(Pose pose) {          
    //float[] quaternion = new float[4];         
    //pose.getRotationQuaternion(quaternion, 0);          
    float x = pose.qx(); //quaternion[0];         
    float y = pose.qy(); //quaternion[2];         
    float z = pose.qz(); //quaternion[1];         
    float w = pose.qw(); //quaternion[3]
}

首先得说清楚,ARCore的Pose类提供的四元数(通过qx()qy()这些方法拿到的x、y、z、w值),可以直接转换成我们需要的三个欧拉角。不过要先记牢ARCore的相机坐标系规则:x轴向右、y轴向上、z轴向前指向相机拍摄的方向,这个是转换的基础。

下面是具体的实现逻辑,直接把这段代码加到你的updateCameraPose方法里就能用:

private void updateCameraPose(Pose pose) {          
    float x = pose.qx();         
    float y = pose.qy();         
    float z = pose.qz();         
    float w = pose.qw();

    // 计算俯仰角(Pitch):对应相机上下抬头/低头,绕X轴旋转
    double sinPitch = 2.0 * (w * x + y * z);
    double cosPitch = 1.0 - 2.0 * (x * x + y * y);
    double pitch = Math.atan2(sinPitch, cosPitch);

    // 计算偏航角(Yaw):对应相机左右转头,绕Y轴旋转
    double sinYaw = 2.0 * (w * y + x * z);
    double cosYaw = 1.0 - 2.0 * (y * y + z * z);
    double yaw = Math.atan2(sinYaw, cosYaw);

    // 计算滚转角(Roll):对应相机左右倾斜,绕Z轴旋转
    double sinRoll = 2.0 * (w * z + x * y);
    double cosRoll = 1.0 - 2.0 * (z * z + x * x);
    double roll = Math.atan2(sinRoll, cosRoll);

    // 转换成更直观的角度值(默认是弧度制)
    pitch = Math.toDegrees(pitch);
    yaw = Math.toDegrees(yaw);
    roll = Math.toDegrees(roll);

    // 这里就可以直接使用这三个角度值啦,比如打印出来看看
    Log.d("CameraAngles", "俯仰角: " + pitch + ", 偏航角: " + yaw + ", 滚转角: " + roll);
}

另外还有几个小细节要注意:

  • 计算出来的初始值是弧度制,如果需要显示成大家更习惯的角度,记得用Math.toDegrees()方法转换
  • 千万别搞混三个角对应的旋转轴,不然数值会和你预期的完全对不上,一定要牢记ARCore的坐标系规则
  • 你代码里注释掉的getRotationQuaternion方法,和直接调用qx()qy()这些方法是完全等价的,两种获取四元数的方式选你顺手的用就行

备注:内容来源于stack exchange,提问作者Tom3652

火山引擎 最新活动