相机的反转.lookAt()

时间:2014-10-24 22:29:07

标签: javascript camera three.js

我用Google搜索广泛但我没有找到解决方案,我认为实际上是一种非常常见的情况。假设我初始化THREE.PerspectiveCamera来查看空间中的某个点:

var camera = new THREE.PerspectiveCamera(45, 2, 0.1, 100);
var target = new THREE.Vector3(1, 2, 3);
camera.lookAt(target);

现在,稍后在代码中,我希望只需查询target即可找到camera的坐标。
我尝试了this question中的建议,使其适应我自己的情景:

var vector = new THREE.Vector3();
vector.applyQuaternion(camera.quaternion);
console.log(vector);

但是它会记录一个坐标(0, 0, 0)的矢量而不是正确的坐标(在我的例子中,应该是(1, 2, 3))。
任何见解?欢呼声。

修改
好的,所以我将尝试在这里进行语境化,以便证明为什么MrTrustworthy的解决方案不幸适用于我的方案。我正在尝试为我的目的调整THREE.OrbitControls库,因为我注意到在使用它时,它会覆盖相机最初查看的位置。这也有报道here。基本上,在OrbitControls.js的第36行(我使用的是可以找到here的版本)this.target初始化为new THREE.Vector3();我发现如果我手动将它设置为相同的矢量我用作camera.lookAt()的参数一切正常:我可以开始平移,从同一个POV轨道和缩放场景我会看到场景来自if我没有应用控件。当然,我无法将这些信息硬编码到OrbitControls.js中,因为每次我想要更改相机的初始“lookAt”时,我都需要更改它。如果我按照MrTrustworthy的建议,我必须更改OrbitControls.js的第36行,如下所示:this.target = object.targetRef(或this.target = object.targetRef || new THREE.Vecotr3()),这也太“自以为是”(它会始终要求object拥有targetRef属性,而我却坚持只使用three.js的现有对象属性和方法)。希望这有助于更好地了解我的情况。欢呼声。

2 个答案:

答案 0 :(得分:1)

如果您唯一的用例是“我希望能够通过相机对象访问相机目标位置”,您可以将引用放入相机对象。

var camera = new THREE.PerspectiveCamera(45, 2, 0.1, 100);
var target = new THREE.Vector3(1, 2, 3);
camera.lookAt(target);
camera.targetRef = target;

//access it
var iNeedThisNow = camera.targetRef;

答案 1 :(得分:1)

我想出来并写了我的解决方案here。由于该问题同时影响THREE.TrackballControlsTHREE.OrbitControls,因此解决方案涉及对这两个文件稍加更改。我想知道它是否可以被认为是一个有效的变化,并成为转向的方式。 70;我会在github上发布PR只是为了它:) 感谢所有投入的人。