【发布时间】:2013-03-30 02:05:14
【问题描述】:
我遇到了某种心理障碍,正在寻找一些建议或建议。我的问题是这样的:
我有一个 WebGL 场景(我没有使用第三方库,除了 gl-matrix),用户可以在其中向上/向下和向左/向右旋转相机(围绕 X/Y 轴旋转)。他们也可以旋转模型(偏航/俯仰)。
要查看问题,假设模型有两个块,A 和 B 在场景中,A 位于中心,B 位于右侧(在视口中),旋转中心位于 A 的中心。如果用户旋转模型,它围绕块 A 的中心旋转。但是如果用户单击对象 B,我需要能够将旋转中心更改为 B 的中心,但仍保持当前的相机方向。目前,当旋转中心切换到 B 时,块 B 移动到屏幕中心,块 A 移动到左侧。基本上,代码总是以当前中心或旋转为中心。
我使用以下代码进行模型视图矩阵更新:
var mvMatrix = this.mvMatrix;
mat4.identity(mvMatrix);
mat4.translate(mvMatrix, mvMatrix, this.orbit);
mat4.rotateY(mvMatrix, mvMatrix, this.orbitYaw);
mat4.rotateX(mvMatrix, mvMatrix, this.orbitPitch);
mat4.translate(mvMatrix, mvMatrix, this.eye);
mat4.rotateY(mvMatrix, mvMatrix, this.eyeYaw);
mat4.rotateX(mvMatrix, mvMatrix, this.eyePitch);
我正试图找出我应该使用什么正确的轨道和眼睛的偏航和俯仰值,以便向后移动当前位置并实现当前的相机/眼睛方向以避免一个物体的“反弹”随着旋转中心移动到另一个。
我搜索了很多,但似乎找不到最好的方法(我目前的尝试有问题)。任何示例代码或只是好的描述都将不胜感激。
编辑
我按照 gman 的建议尝试了以下代码,但切换轨道只是跳来跳去。我的模型由多个物体组成,轨道中心可以改变,但是改变轨道后,相机的方向需要保持稳定,这就是为什么我必须计算对轨道偏航/俯仰和眼睛偏航/俯仰的校正改变轨道后将眼睛放回同一位置并指向同一方向。顺便说一句,根据当前轨道的位置,我只有一个轨道偏航和俯仰,所以这与 gman 的样本有点不同:
Camera.prototype.changeOrbit = function (newOrbit) {
var matA = mat4.create();
var matB = mat4.create();
mat4.translate(matA, matA, this.orbit);
mat4.rotateY(matA, matA, this.orbitYaw);
mat4.rotateX(matA, matA, this.orbitPitch);
mat4.translate(matB, matB, newOrbit);
mat4.rotateY(matB, matB, this.orbitYaw);
mat4.rotateX(matB, matB, this.orbitPitch);
var matInverseNewOrbit = mat4.create();
var matNewOrbitToCamera = mat4.create();
mat4.invert(matInverseNewOrbit, matB);
mat4.multiply(matNewOrbitToCamera, matInverseNewOrbit, matA);
var m = matNewOrbitToCamera;
this.eye[0] = m[12];
this.eye[1] = m[13];
this.eye[2] = m[14];
this.eyePitch = ExtractPitch(m);
this.eyeYaw = ExtractYaw(m);
this.update();
};
ExtractPitch 和 ExtractYaw 按照 gman 指定的方式工作,但我确实围绕不同的轴旋转,因为间距通常是围绕 Y 轴定义的,依此类推。不过,感谢您的建议。
【问题讨论】:
-
我无法理解您发布的新代码。您计算了
eyePitch和eyeYaw,但在示例中没有使用eyePitch和eyeYaw。如果不了解它们是如何使用的,就很难理解你想要做什么 -
您好,感谢您的回复。在第二个代码示例中,这只是将轨道从一个点更改为另一个点的代码。实际计算模型视图矩阵以进行渲染的代码是我发布的第一个代码块。这就是使用“eyePitch”和“eyeYaw”的地方。基本上,模型视图矩阵是通过平移到轨道位置来计算的,基于轨道偏航/俯仰定向,然后通过眼睛矢量从轨道平移(在我之前的代码中,它向后平移 -z)。然后它通过眼睛俯仰和眼睛偏航来定位视图。这有帮助吗?
-
要使用我提供的代码,您需要 2 个矩阵。 (1)相机矩阵。 (2) B的矩阵(matB)。相机矩阵是 matA * eyestuff (请参阅您的第一段代码)。在您上面的示例中,您不计算相机,您只计算 matA。希望这是有道理的。基本加
mat4.translate(matA, matA, this.eye); mat.rotateY(matA, matA, this.eyeYaw); mat4.rotateX(matA, matA, this.eyePitch);
标签: javascript math graphics 3d webgl