Three.js - 如何获得相对于原点的相机位置

Ber*_*iol 6 javascript 3d coordinate-systems three.js

这个问题的标题可能有点含糊,但我不知道如何用一句话来表达。

基本上我遇到了这种情况:场景中有一个透视相机和一个网格。网格不以轴的原点为中心。

相机直接指向这个对象的中心,它的位置(我的意思是 Three.js 相机对象的“位置”属性)是相对于对象中心的位置,而不是原点;所以它在另一个坐标系中工作。

我的问题是:如何获得相机的位置,而不是相对于对象中心,而是相对于“全局”坐标系的原点?

澄清一下,情况是这样的。在此图像中,您可以看到位置远离坐标系原点的手部网格。相机直接指向手的中心(所以从相机的角度来看的原点是手的中心),如果我打印它的位置,它会给我这些值:x:-53.46980763626004;y:-2.7201492246619283;z:-9.814480359970839 而实际上我想要相对于坐标系原点的位置(因此在这种情况下,值会不同;例如,y 值将为正)。

更新: 我尝试了@leota 的建议,所以我以这种方式使用了 localToWorld 方法:

var camera = scene.getCamera();
var viewPos = camera.position;
var newView = new THREE.Vector3();
newView.copy(viewPos);
camera.localToWorld(newView);
Run Code Online (Sandbox Code Playgroud)

我用这个网格做了一个实验。正如你所看到的,这个网格也没有以原点为中心(你可以看到左下角的轴)。如果我打印相机位置的正常值(因此,相对于网格的中心),它会给我以下结果:x: 0; y:0;z: 15

如果现在我在上面的代码之后打印结果值,结果是:x: 0; y:0;z: 30

这是错误的,因为您可以看到图像中的相机位置的 x 和 y 值明显不同于 0(而 z = 30 可能是真的,据我所知)。

例如,如果我旋转相机,使其非常靠近原点,就像这样(在图像中相机就在原点后面,因此它在世界坐标中的位置应该为 x、y、z 的负值),坐标关于物体的中心是:

x:-4.674180744175711;y:-4.8370441591630255;z:-4.877951155147168

而在上面的代码之后,它们变成了:

x:3.6176076166961373;y:-4.98753160894295;z:-4.365141278155379

y 和 z 值甚至可能一目了然,但 x 的正值告诉我这是完全错误的,我不知道为什么。

我将继续寻找解决方案,但这可能是朝着正确方向迈出的一步。不过,任何更多的建议表示赞赏!

更新 2:

找到了解决办法。@leota 说的是正确的,这确实是您获得相机绝对坐标的方式。不过,就我而言,我终于发现项目代码中隐藏了一行代码,该代码根据某些规则(与项目相关)缩放所有内容。因此,我的解决方案是按原样获取相机位置,然后根据该规则将其缩小。

由于@leota 的答案确实是原始问题的解决方案,因此我接受它作为正确的答案

leo*_*ota 5

不确定我是否明白了你的问题:)如果我明白了那么你需要在世界坐标系和本地坐标系之间切换。继承THREE.PerspectiveCameraTHREE.Object3D,因此您可以使用以下方法来设置您的坐标系:

.localToWorld(矢量)

矢量 - 局部矢量。将向量从局部空间更新到世界空间。

.worldToLocal(向量)

矢量 - 世界矢量。将向量从世界空间更新到本地空间。

来自Three.js 文档

更新:

首先更新你的相机矩阵:

camera.updateMatrixWorld();
Run Code Online (Sandbox Code Playgroud)

然后:

var vector = camera.position.clone();

vector.applyMatrix( camera.matrixWorld );
Run Code Online (Sandbox Code Playgroud)

应该vector保持在世界坐标中的位置

  • 应该是 `vector.applyMatrix4()` (7认同)