我正在使用 jsc3d 在画布上加载和显示一些 3d 对象。查看器已经有一个内置功能,允许通过拖动鼠标围绕 Y 轴旋转“视图坐标”(如果我错了,请纠正我)。
旋转是通过一个经典的旋转矩阵进行的,最后将变换矩阵乘以这个旋转矩阵。
围绕 Y 轴的总位移的计算方式类似于围绕加载对象的整个场景的圆周运动:
JSC3D.Matrix3x4.prototype.rotateAboutYAxis = function(angle) {
if(angle != 0) {
angle *= Math.PI / 180;
var c = Math.cos(angle);
var s = Math.sin(angle);
var m00 = c * this.m00 + s * this.m20;
var m01 = c * this.m01 + s * this.m21;
var m02 = c * this.m02 + s * this.m22;
var m03 = c * this.m03 + s * this.m23;
var m20 = c * this.m20 - s * this.m00;
var m21 = c * this.m21 - s * this.m01;
var m22 = c * this.m22 - s * this.m02;
var m23 = c * this.m23 - s * this.m03;
this.m00 = m00; this.m01 = m01; this.m02 = m02; this.m03 = m03;
this.m20 = m20; this.m21 = m21; this.m22 = m22; this.m23 = m23;
}
};
现在,拖动鼠标将在整个世界上应用围绕 Y 轴的旋转,如下图左侧。有没有一种方法可以围绕 Up 向量进行旋转以使其保持在初始位置,就像它出现在右侧一样?
我尝试过这样的事情:
var rotY = (x - viewer.mouseX) * 360 / viewer.canvas.height;
var rotMat = new JSC3D.Matrix3x4; // identity
rotMat.rotateAboutYAxis(rotY);
viewer.rotMatrix.multiply(rotMat);
但它没有效果。
应该对我的旋转矩阵应用哪些操作以实现围绕向上向量的旋转?