[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;
    }
 
 
已邀请:

Aar0n

赞同来自:

引擎有直接提供的接口, 开发者自己写的代码我不看。有倾斜角度就不能用标题那个接口
Matrix4x4.createRotationAxis(归一化的旋转轴,旋转角度(注意单位可能是弧度),结果矩阵);
Vector3.transformV3ToV3(向量,结果矩阵,旋转后向量);

要回复问题请先

商务合作
商务合作