【问题标题】:Three.js - How to get camera position with respect to originThree.js - 如何获取相对于原点的相机位置
【发布时间】:2016-04-25 12:34:49
【问题描述】:

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

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

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

我的问题是:我怎样才能得到相机的位置,而不是相对于对象中心,而是相对于“全局”坐标系的原点?

为了澄清,情况是this。在此图像中,您可以看到位置远离坐标系原点的手形网格。相机直接指向手的中心(所以从相机的角度来看,原点是手的中心),如果我打印它的位置,它会给我这些值: x:-53.46980763626004;是:-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 网格做了一个实验。如您所见,此网格也不以原点为中心(您可以看到左下角的轴)。 如果我打印相机位置的正常值(因此,相对于网格的中心),它会给我以下结果: ×:0;是:0; z: 15

如果现在我在上面的代码之后打印结果值,结果是: ×:0;是: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 的回答确实是原始问题的解决方案,我接受它作为正确的答案

【问题讨论】:

  • 您是否将相机附加到对象上
  • 你能添加一些关于你的案例的代码吗?
  • 问题是,我正在做一个大项目,里面有很多东西,代码中几乎没有 cmets,所以我很难找到可能对我有帮助的代码(或者你)了解幕后发生的事情(我试过)。我不知道在这里发布什么代码...

标签: javascript 3d three.js coordinate-systems


【解决方案1】:

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

.localToWorld(矢量)

vector - 一个局部向量。 将向量从局部空间更新到世界空间。

.worldToLocal(矢量)

vector - 一个世界向量。 将向量从世界空间更新到局部空间。

来自Three.js Documentation

更新:

首先更新你的相机矩阵:

camera.updateMatrixWorld();

然后:

var vector = camera.position.clone();

vector.applyMatrix( camera.matrixWorld );

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

【讨论】:

  • 这是一个有效的解决方案。我没有注意到相机继承自 Objectd3D。可悲的是,我尝试了,但它给了我错误的结果。我将编辑我的原始帖子以更好地描述发生的事情
  • 与之前的结果相同 :( 在我展示的示例中(第一张图片),我仍然得到 x:0, y:0, z: 30。看来结果只是正常的camera.position 加上用作参数的向量...我尝试将其用作向量 (0, 0, 0),结果是确切的 camera.position 向量(所以 x: 0, y: 0, z: 15)
  • 第一次创建相机的时候,你给了它什么位置值?
  • 相机相对于对象的位置为 1,x: 0, y: 0, z: 15
  • 应该是vector.applyMatrix4()
【解决方案2】:

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

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;

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 2013-02-26
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 2022-06-12
    • 1970-01-01
    相关资源
    最近更新 更多