三.js - 如何获取相机相对于原点的位置

Three.js - How to get camera position with respect to origin

本文关键字:相机 相对于 原点 位置 获取 js 何获取      更新时间:2023-09-26

这个问题的标题可能有点模棱两可,但我不知道如何用一行来表达。

基本上我有这种情况:场景中有一个透视摄像机和一个网格。网格不在轴的原点居中。

相机直接指向这个物体的中心,它的位置(我的意思是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);

我用这个网格做了一个实验。如您所见,此网格也不以原点为中心(您可以在左下角看到轴)。如果我打印相机位置的正常值(因此,相对于网格的中心),它会给我以下结果: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的答案确实是原始问题的解决方案,因此我接受它作为正确的答案

不确定我是否得到了你的问题:)如果我这样做了,那么您需要在世界坐标系和局部坐标系之间切换。THREE.PerspectiveCamera继承自THREE.Object3D,因此您可以使用以下方法设置坐标系:

.localToWorld ( vector )

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

.worldToLocal ( vector )

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

来自三个.js文档

更新:

首先更新您的相机矩阵:

camera.updateMatrixWorld();

然后:

var vector = camera.position.clone();
vector.applyMatrix( camera.matrixWorld );

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

我有同样的问题试图回答我困惑了一段时间,我的猜测但不确定是

var plot = camera.position.x - mesh.position.x;
var plotb = camera.position.y - mesh.position.y;
var plotc = camera.position.z - mesh.position.z;
mesh.position.x = (camera.position.x + plot) - mesh.position.x;
mesh.position.y = (camera.position.y + plotb) - mesh.position.y;
mesh.position.z = (camera.position.z + plotc) - mesh.position.z;
or
var plot = (camera.position.x *  mesh.position.x) / 1000;
var plotb = (camera.position.y *  mesh.position.y) / 1000;
var plotc = (camera.position.z *  mesh.position.z) / 1000;
mesh.position.x = mesh.position.x + plot;
mesh.position.y = mesh.position.y + plotb;
mesh.position.z = mesh.position.z + plotc;