我用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的现有对象属性和方法)。希望这有助于更好地了解我的情况。欢呼声。
答案 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.TrackballControls
和THREE.OrbitControls
,因此解决方案涉及对这两个文件稍加更改。我想知道它是否可以被认为是一个有效的变化,并成为转向的方式。 70;我会在github上发布PR只是为了它:)
感谢所有投入的人。