这个问题的标题可能有点含糊不清,但我不知道如何将它排成一行。
基本上我有这种情况:场景中有一个透视摄像头和一个网格。网格不以轴的原点为中心。
摄像机直接指向此对象的中心,它的位置(我的意思是字面上是Three.js摄像机对象的“位置”属性)是相对于对象中心的位置,而不是原点;所以它适用于另一个坐标系。
我的问题是:如何获得相机的位置而不是相对于物体中心,而是关于“全局”坐标系的原点?
澄清一下,情况是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网格做了一个实验。如您所见,此网格也不以原点为中心(您可以看到左下角的轴)。 如果我打印相机位置的正常值(因此,相对于网格的中心),它会给我以下结果: x:0; y:0; z:15
如果现在我在上面的代码后打印结果值,结果是: x:0; y:0; z:30
这是错误的,因为你可以看到图像中的相机位置的x和y值明显不同于0(而z = 30可能是真的,据我所见)。
例如,如果我旋转相机以使其非常靠近原点,例如this(在图像中相机位于原点的后面,因此它在世界坐标中的位置应该具有x的负值, y,z),关于物体中心的坐标是:
x:-4.674180744175711;是:-4.8370441591630255; z:-4.877951155147168
在上面的代码之后,它们变成了:
x:3.6176076166961373;是:-4.98753160894295; z:-4.365141278155379
y和z值甚至可能一目了然,但x的正值告诉我它完全错误,我不知道为什么。
我将继续寻找解决方案,但这可能是朝着正确方向迈出的一步。不过,还有任何建议值得赞赏!
更新2:
找到解决方案。 @leota所说的是正确的,这确实是你如何获得相机的绝对坐标。但就我而言,我终于在项目代码中隐藏了一行代码,根据某些规则(与项目相关)扩展了所有内容。因此,我的解决方案是按原样拍摄相机位置,然后根据该规则将其缩小。
由于@ leota的回答确实是原问题的解决方案,我接受它作为正确的回答
答案 0 :(得分:2)
不确定我有你的问题:)如果我这样做你需要在世界和本地坐标系之间切换。 THREE.PerspectiveCamera
继承自THREE.Object3D
,因此您可以使用以下方法设置坐标系:
.localToWorld(vector)
vector - 一个局部向量。 更新从局部空间到世界空间的矢量。
.worldToLocal(vector)
矢量 - 世界矢量。 更新从世界空间到本地空间的矢量。
首先更新相机矩阵:
camera.updateMatrixWorld();
然后:
var vector = camera.position.clone();
vector.applyMatrix( camera.matrixWorld );
vector
应该保持世界坐标中的位置