three.js设置和读取相机外观矢量

Dev*_*Dev 11 camera vector three.js

我没有使用camera.rotation或lookAt()函数旋转相机,而是想直接将相机矢量传递给相机...是否可以直接设置相机外观矢量并且可以读取外观从相机矢量?

Wes*_*ley 29

相机没有"外观矢量",因此您无法进行设置.

但是,您可以point通过将您的外观向量添加到相机的位置,然后调用来构建要查看的内容

camera.lookAt( point );
Run Code Online (Sandbox Code Playgroud)

以下是如何确定相机正在查看的方向,假设相机没有父级(场景除外).

相机向下看其内部负z轴,因此创建一个向下指向负z轴的向量:

var vector = new THREE.Vector3( 0, 0, - 1 );
Run Code Online (Sandbox Code Playgroud)

现在,将相同的旋转应用于应用于相机的矢量:

vector.applyQuaternion( camera.quaternion );
Run Code Online (Sandbox Code Playgroud)

生成的矢量将指向相机正在查看的方向.

或者,您可以使用以下方法,即使相机是另一个对象的子项,该方法也可以使用:

camera.getWorldDirection( dirVector );
Run Code Online (Sandbox Code Playgroud)

three.js r.73


mat*_*yer 8

上面的答案包含为util,这就是我对Three Utils的处理:

THREE.Utils = {
    cameraLookDir: function(camera) {
        var vector = new THREE.Vector3(0, 0, -1);
        vector.applyEuler(camera.rotation, camera.eulerOrder);
        return vector;
    }
};
Run Code Online (Sandbox Code Playgroud)

叫它 THREE.Utils.cameraLookDir(camera);


小智 6

这些其他答案非常有见地,但并不完全正确.代码返回一个矢量,该矢量指向摄像机指向的相同方向.这是一个很好的开始!

但是,除非摄像机位于原点(0,0,0)(或者恰好位于将原点连接到旋转矢量点而不超过该点的线段上,因此该点位于摄像机后面)摄像机赢了看着那一点.显然 - 只是常识 - 相机的位置也会影响正在观察的点.考虑一下!!

lookAt()无论相机在何处,相机方法都会查看3D空间中的某个点.因此,要获得相机正在观察的点,您需要通过调用以下内容来调整相机位置:

vec.add( camera.position );

值得一提的是,相机看起来并不是单点,而是俯视无限数量的点,每个点与相机的距离不同.来自其他答案的代码返回的长度恰好是一个单位的向量,因为四元数应用于规范化的z轴向量(0,0,-1)会返回另一个归一化向量(在不同的方向上).要计算距x摄像机任意距离的点的外观:

THREE.Vector3( 0, 0, -x ).applyQuaternion( camera.quaternion ).add( camera.position );

这将沿着z轴x与原点相距一段距离,将其旋转到相机的方向,然后通过添加相机的位置来创建"世界点".我们想要一个"世界点"(而不仅仅是"相对于相机点"),因为它camera.lookAt()还将"世界点"作为参数.