如何移动和对象,但将子对象保持在同一(世界)位置

时间:2016-06-19 13:47:57

标签: three.js

我正在努力找到问我here的问题的解决方案。我想通过创建和轨道对象以及将相机作为子对象插入到此对象中来实现解决方案。

我希望能够移动轨道物体但是将相机保持在同一个世界位置。我试过了;

this.orbit.position.add(travel);
this.camera.position.sub(travel);

这完全有效,直到我轮换。我的轨道物体将围绕Z(仅Z)轴旋转的事实正在使我(世界到地方的转换)变得困难。并且上面的代码显然会将我的相机移动到错误的位置。

如何解决此问题?

2 个答案:

答案 0 :(得分:1)

很高兴看到你解决了这个问题,但我觉得如果事情变得更加疯狂,这对你来说也会很有趣 -

我在SceneUtils中看到了可能相关的内容 - the attach/detach function。所以你可以做一些事情,比如分离它们,做你计划做的任何父母独立的事情,然后重新附加它们。这很好,因为你仍然可以在它们之间做父母的东西,但是你也可以创建在世界空间中移动的块,然后重新连接,而不让孩子移动到世界中间的世界坐标。

答案 1 :(得分:0)

所以我试图通过使用轨道物体的四分之一变换旅行矢量:

            this.orbit.position.add(t);

            var angle = -this.orbit.rotation.z;
            var x = t.x * Math.cos(angle) - t.y * Math.sin(angle);
            var y = t.x * Math.sin(angle) + t.y * Math.cos(angle);

            var t2 = new THREE.Vector3(x, y, t.z);

            this.target.position.sub(t2);

它不起作用......

由于我不确定正在做什么的四分之一,并且轨道旋转仅在Z轴附近,所以很容易将旅行矢量转换为本地坐标,如下所示:

def do(format, values):
    if type(format) == list:
        return [do(v, values) for v in format]
    else:
        return values.pop(0)

print do(orig_array, my_array)

它就像一个魅力......