如何从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




