【发布时间】:2014-12-20 20:13:13
【问题描述】:
我用谷歌搜索了很多地方,但我还没有找到解决我认为实际上很常见的情况的解决方案。假设我有一个 THREE.PerspectiveCamera 初始化以查看空间中的某个点:
var camera = new THREE.PerspectiveCamera(45, 2, 0.1, 100);
var target = new THREE.Vector3(1, 2, 3);
camera.lookAt(target);
现在,稍后在代码中,我希望能够通过简单地查询 camera 来找出 target 的坐标。
我尝试了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 的现有对象属性和方法)。希望这有助于更好地了解我的情况。干杯。
【问题讨论】:
-
四元数只模拟旋转,所以如果你的相机不在原点,那么你还需要补偿它的平移。我希望您还需要反转相机的四元数。
-
还要注意这个问题有无限的解决方案。从技术上讲,相机正在查看沿其中心轴的任何点。
-
另外,您链接到的 SO 帖子中的答案说要这样做:
var vector = new THREE.Vector3( 0, 0, -1 ); -
@DrewNoakes,你有一个观点(实际上,你有无限的观点!;)),我可以接受一个观点;如果我的相机在
(1, 1, 0)并且最初是在看(1, 0, 0)(沿着y 轴直接向下),那么我正在寻找的算法也可以为我提供点(1, -1, 0),因为我在乎,因为设置@ 987654346@ 和camera.lookAt(new THREE.Vector3(1, 0, 0))的效果是一样的,对吧? -
@WestLangley,在我看来,使用
THREE.Vector3(0, 0, -1)需要事先了解相机应该在哪里看,而在我的情况下(见编辑)图书馆它接收相机对象对最初传递给camera.lookAt()的向量一无所知(并且不应提供任何不能简单地从相机本身推导出来的附加信息)。无论如何,为了它,我尝试使用var vector = new THREE.Vector3(0, 0, -1),但仍然没有骰子:在将相机的四元数应用到它之后,它指向原点而不是点(1, 2, 3)。
标签: javascript camera three.js