【问题标题】:three.js Object3D local location, versus global locationthree.js Object3D 本地位置,与全局位置
【发布时间】:2013-07-27 08:34:14
【问题描述】:

所以最初我希望我的小“船”有可以跟踪目标的炮塔。这是它的jfiddle。 http://jsfiddle.net/czGZF/2/ 当他们追踪时,他们表现得很奇怪。我注意到它认为炮塔稍微靠近它(在原点),通过这段代码。

turret_a.position.y = .25;
turret_a.position.z = 2;

但是,我已经这样做了,所以当我调用(如下)将其添加到“基础船”时,它可能是一个相对位置

ship = new THREE.Object3D();
ship.add( ship_base );
ship.add( turret_a ) ;

当我在将 turret_a 添加到舰艇后更改其位置时,以及将舰船添加到场景中后,炮塔主要跟踪我希望它的外观。

我想我的问题是,为什么 lookAt() 函数使用它的旧位置,而不是它当前在其父对象上的位置来确定它需要的旋转角度?

【问题讨论】:

  • 嗯...你读过我的回答吗?
  • 是的,我知道当船在原点时它会膨胀,但我希望船能够离开原点并让它的孩子能够正确使用 lookAt。

标签: javascript 3d three.js


【解决方案1】:

如果您查看Object3D.lookA() 的代码,您会看到

// This routine does not support objects with rotated and/or translated parent(s)

如果母船位于原点且未旋转,则您的代码有效。

更新小提琴:http://jsfiddle.net/czGZF/4/

three.js r.59

【讨论】:

    【解决方案2】:

    From the API,正如您所发现的,Camera 对象的lookAt() 方法被定义为使用世界位置。这似乎是比较常见的处理方式。

    我对three.js API不是特别熟悉,但是看来如果要获取ball的全局位置,可以使用以下:

    var targetPos = ball.position.clone();
    ball.localToWorld(targetPos);
    

    希望这能让你更接近你的目标。不幸的是,您的小提琴似乎(非常)不确定,因此我无法快速为您找到 100% 的解决方案。

    【讨论】:

    • 我试过 turret_a.lookAt(turret_a.worldToLocal(ball.position.clone()));但它只是闪烁,什么也没做。然而,我确实找到了一种让它工作的方法……有点。更新了 OP。
    • 你有一个错字,无法通过编辑一个字符来更新,它可能应该是:Object3D.lookAt() with a 't'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    相关资源
    最近更新 更多