Three.js - 如何获得相机相对于原点的位置
Three.js - How to get camera position with respect to origin
这个问题的标题可能有点模棱两可,但我不知道如何在一行中表达它。
基本上我遇到了这种情况:场景中有一个透视相机和一个网格。网格不以轴的原点为中心。
摄像头直接指向这个object的中心,它的位置(我的意思是Three.js摄像头[=59=的"position"属性 ]) 是相对于 object 中心的位置,不是原点;所以它在另一个坐标系中工作。
我的问题是:如何获得相机的位置而不是相对于 object 中心,而是相对于 "global" 坐标系的原点?
澄清一下,情况是this。在此图像中,您可以看到一个手部网格,其位置远离坐标系的原点。相机直接指向手的中心(所以从相机的角度来看原点是手的中心),如果我打印它的位置,它会给我这些值:
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);
我用 this 网格做了一个实验。如您所见,此网格也不以原点为中心(您可以在 bottom-left 角上看到轴)。
如果我打印相机位置的正常值(因此,相对于网格的中心),它会给我这些结果:
x: 0;是:0; z: 15
如果现在我在上面的代码之后打印结果值,结果是:
x: 0;是:0; z: 30
这是错误的,因为如您所见,图像中的相机位置的 x 和 y 值明显不同于 0(据我所知,z = 30 可能是正确的)。
例如,如果我旋转相机使其非常靠近原点,例如this(在图像中相机就在原点后面,因此它在世界坐标中的位置应该为负值x, y, z), object中心的坐标为:
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 - 局部向量。
将向量从本地 space 更新到世界 space.
.worldToLocal(矢量)
vector - 世界向量。
将向量从世界 space 更新为本地 space.
更新:
首先更新你的相机矩阵:
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;
这个问题的标题可能有点模棱两可,但我不知道如何在一行中表达它。
基本上我遇到了这种情况:场景中有一个透视相机和一个网格。网格不以轴的原点为中心。
摄像头直接指向这个object的中心,它的位置(我的意思是Three.js摄像头[=59=的"position"属性 ]) 是相对于 object 中心的位置,不是原点;所以它在另一个坐标系中工作。
我的问题是:如何获得相机的位置而不是相对于 object 中心,而是相对于 "global" 坐标系的原点?
澄清一下,情况是this。在此图像中,您可以看到一个手部网格,其位置远离坐标系的原点。相机直接指向手的中心(所以从相机的角度来看原点是手的中心),如果我打印它的位置,它会给我这些值: 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);
我用 this 网格做了一个实验。如您所见,此网格也不以原点为中心(您可以在 bottom-left 角上看到轴)。 如果我打印相机位置的正常值(因此,相对于网格的中心),它会给我这些结果: x: 0;是:0; z: 15
如果现在我在上面的代码之后打印结果值,结果是: x: 0;是:0; z: 30
这是错误的,因为如您所见,图像中的相机位置的 x 和 y 值明显不同于 0(据我所知,z = 30 可能是正确的)。
例如,如果我旋转相机使其非常靠近原点,例如this(在图像中相机就在原点后面,因此它在世界坐标中的位置应该为负值x, y, z), object中心的坐标为:
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 - 局部向量。 将向量从本地 space 更新到世界 space.
.worldToLocal(矢量)
vector - 世界向量。 将向量从世界 space 更新为本地 space.
更新:
首先更新你的相机矩阵:
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;