Inverse of camera.lookAt()

Inverse of camera.lookAt()

本文关键字:lookAt camera of Inverse      更新时间:2023-09-26

我在谷歌上搜索了很多地方,但我还没有找到解决我认为非常常见的情况的方法。假设我初始化了一个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的坐标
我尝试了这个问题中的建议,并将其适应我自己的场景:

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

但它记录的是坐标为(0, 0, 0)的向量,而不是正确的坐标(在我的示例中,应该是(1, 2, 3)
有什么见解吗?干杯

编辑:
好的,所以我将尝试在这里进行上下文分析,以证明为什么MrTrustworthy的解决方案不幸不适用于我的场景。出于我的目的,我试图调整THREE.OrbitControls库,因为我注意到在使用它时,它会覆盖相机最初看到的任何位置。这里也有报道。基本上,在OrbitControls.js的第36行(我使用的是可以在这里找到的版本),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属性,而我试图坚持只使用三个.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;

我发现了它,并在这里编写了我的解决方案。由于该问题同时影响THREE.TrackballControlsTHREE.OrbitControls,因此解决方案需要对这两个文件进行轻微更改。我想知道它是否可以被认为是一个有效的改变,并进入第70版;我会在github上发布PR,只是为了它:)
感谢所有参与的人。

好吧,你可以把对象放在父对象中,让父对象查看,然后让子对象旋转180度。这是快速的noob解决方案