[LayaAir 2.0]关于Laya.Quaternion.createFromAxisAngle旋转角度不正确的问题
Laya.Quaternion.createFromAxisAngle
在做向量旋转的时候,当使用的旋转坐标轴是标准坐标轴时,旋转的结果是正确的,如围绕Y轴旋转,(0,1,0),旋转30度,得到的结果是正确的
但是,当围绕的坐标轴有倾斜角度的时候,旋转同样的角度,得到的结果有偏差
举例说明:
两个向量的夹角为N度,通过Laya.Vector3.cross(dir1,dir2,normal)获取两个向量的法线,
围绕法线将一个向量旋转N度时,不能与另一个向量重合
private testdir(){
//定义两个向量,算出向量夹角
var dir1=new Laya.Vector3(0,1,1)
var dir2=new Laya.Vector3(1,0,0)
var angle=this.Angle(dir1,dir2)
//向量法线
var normal=new Laya.Vector3();
Laya.Vector3.cross(dir1,dir2,normal)
//围绕法线,把其中一个向量按照正反两个方向旋转
var Q=new Laya.Quaternion();
Laya.Quaternion.createFromAxisAngle(normal,angle*Math.PI/180,Q)
var newdir1=new Laya.Vector3()
Laya.Vector3.transformQuat(dir1,Q,newdir1)
Laya.Vector3.normalize(newdir1,newdir1)
Laya.Quaternion.createFromAxisAngle(normal,angle*Math.PI/180,Q)
var newdir2=new Laya.Vector3()
Laya.Vector3.transformQuat(dir1,Q,newdir2)
Laya.Vector3.normalize(newdir2,newdir2)
//结果不与向量dir2重合
console.log(dir2);
console.log(newdir1);
console.log(newdir2);
}
// 向量夹角
public Angle(ma, mb) {
var v1 = (ma.x * mb.x) + (ma.y * mb.y) + (ma.z * mb.z);
var ma_val = Math.sqrt(ma.x * ma.x + ma.y * ma.y + ma.z * ma.z);
var mb_val = Math.sqrt(mb.x * mb.x + mb.y * mb.y + mb.z * mb.z);
var cosM = v1 / (ma_val * mb_val);
var angleAMB = Math.acos(cosM) * 180 / Math.PI;
return angleAMB;
}
在做向量旋转的时候,当使用的旋转坐标轴是标准坐标轴时,旋转的结果是正确的,如围绕Y轴旋转,(0,1,0),旋转30度,得到的结果是正确的
但是,当围绕的坐标轴有倾斜角度的时候,旋转同样的角度,得到的结果有偏差
举例说明:
两个向量的夹角为N度,通过Laya.Vector3.cross(dir1,dir2,normal)获取两个向量的法线,
围绕法线将一个向量旋转N度时,不能与另一个向量重合
private testdir(){
//定义两个向量,算出向量夹角
var dir1=new Laya.Vector3(0,1,1)
var dir2=new Laya.Vector3(1,0,0)
var angle=this.Angle(dir1,dir2)
//向量法线
var normal=new Laya.Vector3();
Laya.Vector3.cross(dir1,dir2,normal)
//围绕法线,把其中一个向量按照正反两个方向旋转
var Q=new Laya.Quaternion();
Laya.Quaternion.createFromAxisAngle(normal,angle*Math.PI/180,Q)
var newdir1=new Laya.Vector3()
Laya.Vector3.transformQuat(dir1,Q,newdir1)
Laya.Vector3.normalize(newdir1,newdir1)
Laya.Quaternion.createFromAxisAngle(normal,angle*Math.PI/180,Q)
var newdir2=new Laya.Vector3()
Laya.Vector3.transformQuat(dir1,Q,newdir2)
Laya.Vector3.normalize(newdir2,newdir2)
//结果不与向量dir2重合
console.log(dir2);
console.log(newdir1);
console.log(newdir2);
}
// 向量夹角
public Angle(ma, mb) {
var v1 = (ma.x * mb.x) + (ma.y * mb.y) + (ma.z * mb.z);
var ma_val = Math.sqrt(ma.x * ma.x + ma.y * ma.y + ma.z * ma.z);
var mb_val = Math.sqrt(mb.x * mb.x + mb.y * mb.y + mb.z * mb.z);
var cosM = v1 / (ma_val * mb_val);
var angleAMB = Math.acos(cosM) * 180 / Math.PI;
return angleAMB;
}
没有找到相关结果
已邀请:
要回复问题请先登录
1 个回复
Aar0n
赞同来自:
Matrix4x4.createRotationAxis(归一化的旋转轴,旋转角度(注意单位可能是弧度),结果矩阵);
Vector3.transformV3ToV3(向量,结果矩阵,旋转后向量);