我在谷歌上进行了广泛的搜索,但我还没有找到我认为实际上很常见的情况的解决方案。假设我有一个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 开始平移、绕轨道运行和缩放场景,如果我不应用控件,我就会看到场景。当然,我无法将这些信息硬编码到 OrbitControls.js
中。因为每次我想改变相机的初始“lookAt”时,它都需要我改变它;如果我要遵循 MrTrustworthy 的建议,我将不得不更改 OrbitControls.js
的第 36 行像这样阅读:this.target = object.targetRef
(或 this.target = object.targetRef || new THREE.Vecotr3()
),这也太“固执己见”(它总是要求 object
具有 targetRef
属性,而我试图坚持仅使用 Three.js 的现有对象属性和方法)。希望这有助于更好地了解我的案例。干杯。
最佳答案
如果您唯一的用例是“我希望能够通过相机对象访问相机目标位置”,您可以将引用放入相机对象中。
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;
关于javascript - camera.lookAt() 的逆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26557252/