这个算法是在网上找到的,用来计算三维坐标点绕中心点旋转后新的坐标位置,我把它用 JS 实现并做了一点改进,增加了中心点坐标:
function point(x,y,z){
this.x = x;
this.y = y;
this.z = z;
}
function pointRotate(origin,angleX,angleY,angleZ,center){
angleX = angleX%360;
angleY = angleY%360;
angleZ = angleZ%360;
var oClone = new point(origin.x,origin.y,origin.z);
if(angleX==0&&angleY==0&&angleZ==0){return oClone;}
if(typeof(center)=='undefined'){center=new point(0,0,0);}
var result = new point();
oClone.x -= center.x;
oClone.y -= center.y;
oClone.z -= center.z;
var sinX = Math.sin(angleX*Math.PI/180);
var sinY = Math.sin(angleY*Math.PI/180);
var sinZ = Math.sin(angleZ*Math.PI/180);
var cosX = Math.cos(angleX*Math.PI/180);
var cosY = Math.cos(angleY*Math.PI/180);
var cosZ = Math.cos(angleZ*Math.PI/180);
result.x = oClone.x*(cosY*cosZ-sinX*sinY*sinZ)-oClone.y*cosX*sinZ+oClone.z*(sinY*cosZ+sinX*cosY*sinZ);
result.y = oClone.x*(cosY*sinZ+sinX*sinY*cosZ)+oClone.y*cosX*cosZ+oClone.z*(sinY*sinZ-sinX*cosY*cosZ);
result.z = oClone.x*(-cosX*sinY)+oClone.y*sinX+oClone.z*cosX*cosY;
result.x += center.x;
result.y += center.y;
result.z += center.z;
return result;
}
- 参数说明:
- origin:原始点坐标
- angleX:绕 X 轴旋转的角度
- angleY:绕 Y 轴旋转的角度
- angleZ:绕 Z 轴旋转的角度
- center:旋转中心点,默认 { x:0, y:0, z:0 }
做了一个简单的演示页面,为了更直观的展示,使用四个坐标点连成一个二维正方形,四个顶点就是旋转点:三维坐标旋转算法演示
其实挺基础的,上学的时候我算这个还挺厉害,但是现在毕业很多年了,我一顿能吃三碗饭。