3d旋转点坐标计算公式
绕Z轴旋转a度
x1=x*cos(a)-y*sin(a);
y1=y*cos(a)+x*sin(a);
z1=z;
绕X轴旋转a度
x1=x;
y1=y*cos(a)-z*sin(a);
z1=z*cos(a)+y*sin(a);
绕Y轴旋转a度
x1=x*cos(a)-z*sin(a);
y1=y;
z1=z*cos(a)+x*sin(a);
x1=x*cos(a)-y*sin(a);
y1=y*cos(a)+x*sin(a);
z1=z;
绕X轴旋转a度
x1=x;
y1=y*cos(a)-z*sin(a);
z1=z*cos(a)+y*sin(a);
绕Y轴旋转a度
x1=x*cos(a)-z*sin(a);
y1=y;
z1=z*cos(a)+x*sin(a);
------------------------------------------------------
实现效果围绕着canvas中心绕Y轴绕圆
// 根据鼠标位置计算旋转角度(速度)
stage.addEventListener('mousemove', function (x, y) {
angleY = (y - vpx) * .001;
});
// 主旋转函数
function rotateY(ball, angleY) {
// 把角度三角函数化,以便看起来是绕圆旋转
var cosy = Math.cos(angleY),
siny = Math.sin(angleY),
// 把 z方向影响算进来
y1 = ball.ypos * cosy - ball.zpos * siny,
z1 = ball.zpos * cosy + ball.ypos * siny;
ball.ypos = y1;
ball.zpos = z1;
// z坐标扁平化,并赋给小球影响
var scale = focalLength / (focalLength + ball.zpos);
ball.x = vpx + ball.xpos * scale;
ball.y = vpy + ball.ypos * scale;
ball.width = ballR*2*scale;
}
程序员学习公众号: