Java的四元数、欧拉⾓、轴-⾓表⽰、旋转向量之间的相互转化
因为项⽬需要刚接触的 ARCore,新的⽅向有很多新的坑,空间中的旋转很是让⼈头疼,SceneForm 框架提供的 API 其实已经很强⼤了,还是会有⼀些漏⽹的⼩鱼,没有对应的 API,根据⽹上的资料和⾃⼰的总结,提供以下⼏个 Java 版本的接⼝,希望对⼤家有帮助。
1、四元数转欧拉⾓
一月到十二月的英文怎么读
Quaternion(四元数)是 SceneForm 提供且建议使⽤的表⽰旋转的⽅式,四元数可以避免欧拉⾓⽅式的万向节死锁。
/**
* 四元数转欧拉⾓
* @param quaternion 四元数
* @return 欧拉⾓
*/
public Vector3 quaternion2Eular(Quaternion quaternion){
double epsilon =0.0009765625f;
double threshold =0.5f- epsilon;
Vector3 euler =new Vector3();
double tag = quaternion.w * quaternion.y - quaternion.x * quaternion.z;
英语比较级和最高级的用法归纳// 奇异姿态,俯仰⾓为 ±90 度
if(tag <-threshold || tag > threshold){
int sign =sign(tag);
euler.z =-2* sign *(float) Math.atan2(quaternion.x, quaternion.w);// yaw
euler.y = sign *(float)(Math.PI /2.0);// pitch
euler.x =0;// roll
}el{
euler.x =(float) Math.atan2(
2*(quaternion.y * quaternion.z + quaternion.w * quaternion.x),
quaternion.w * quaternion.w - quaternion.x * quaternion.x - quaternion.y * quaternion.y + quaternion.z * quaternion.z);
euler.y =(float) Math.asin(-2*(quaternion.x * quaternion.z - quaternion.w * quaternion.y));
euler.z =(float) Math.atan2(2*(quaternion.x * quaternion.y + quaternion.w * quaternion.z),
quaternion.w * quaternion.w + quaternion.x * quaternion.x - quaternion.y * quaternion.y - quaternion.z * quaternion.z);
}
float scale =(float)(180/ Math.PI);
//弧度转换⾓度
euler.x = euler.x * scale;
冬瓜煲汤euler.y = euler.y * scale;
euler.z = euler.z * scale;
return euler;
}
private int sign(double param){高中学历
if(param >0){
return1;
}el if(param ==0){
return0;
}el{
return-1;
}
}
2、旋转向量转对应的轴-⾓表⽰⽅式
旋转向量表⽰物体在三维空间的旋转,向量(x,y,z)表⽰三维空间中旋转的⽅向,向量的模表⽰旋转的⾓度(弧度)。
public static class AxisAngle {
Vector3 Axis;小孩子说话迟缓
float angle;
}
历史教学计划/**
*
* 旋转向量转对应的轴-⾓表⽰⽅式
* @param rotationVector 旋转向量
* @return 轴-⾓
*/
public AxisAngle rotationVector2AxisAngle(Vector3 rotationVector){
//旋转向量的模(弧度)
float mo =(float) Math.sqrt(
rotationVector.x * rotationVector.x + rotationVector.y * rotationVector.y + rotationVector.z * rotationVector.z);
float angle =(float)(mo *(180/ Math.PI));
submit是什么意思//⽣成轴⽅向的单位向量
rotationVector.x = rotationVector.x / mo;
我国三大林区rotationVector.y = rotationVector.y / mo;
rotationVector.z = rotationVector.z / mo;
AxisAngle axisAngle =new AxisAngle();
axisAngle.Axis = rotationVector;
axisAngle.angle = angle;
return axisAngle;
}
3、将旋转向量转换为对应的四元数
/**
*
* 将旋转向量转换为对应的四元数
* @param rotationVector 旋转向量
* @return 四元数
*/
public Quaternion rotationVector2Quaternion(Vector3 rotationVector){
//旋转向量转对应的轴-⾓表⽰⽅式
AxisAngle axisAngle =rotationVector2AxisAngle(rotationVector);
if(axisAngle != null){
//轴-⾓表⽰⽅式转四元数
Quaternion qu = Quaternion.axisAngle(axisAngle.Axis, axisAngle.angle);
return qu;
}
return null;
}