three.js通过轨道控制获取相机位置

three.js get camera position with orbit controls

本文关键字:获取 相机 位置 轨道控制 js three      更新时间:2023-09-26

我正在使用三个.js轨道控件,并试图让skybox跟随相机的位置。我在网上搜索了一下,没有找到合适的答案。

我的问题很简单——当使用轨道控制时,我如何检索相机的坐标,以下不起作用:

skybox.position.x = camera.position.x;  //Moving skybox with camera
skybox.position.z = camera.position.z;  //Moving skybox with camera
skybox.position.y = camera.position.y;  //Moving skybox with camera

x和z坐标的值不正确。我也试过:

orbit_controls.object.target

相反,这会导致类似的不正确行为,x和z返回不正确的值。

控制机制的一个看似显而易见的要求似乎很难做到。

由于没有回答SO,我做了一些额外的测试,发现需要进行坐标系转换来检索相机的正确坐标。

以下操作将检索相机在标准世界(x,y,z)空间中的当前位置,并将其应用于skybox。

newZ = -(camera.position.x * Math.cos(5.49779)) - (camera.position.z * Math.sin(5.49779));
newX = (camera.position.x * Math.cos(0.78)) + (camera.position.z * Math.sin(0.78));
skybox.position.x = newX;   //Moving skybox with camera
skybox.position.z = newZ;   //Moving skybox with camera
skybox.position.y = camera.position.y;  //Moving skybox with camera

由于我在其他地方找不到这个答案,我希望这对其他人有用,它解决了我的问题。

这是2019年对2015年问题的回答:

camera.position是相机的本地位置。您可以通过camera.getWorldPosition(target)检索全局位置,其中target是将设置为结果的预定义Vector3对象。

顺便说一句,你不必用相机移动天空盒子。相反,使用立方体纹理(或渲染的立方体)作为场景背景。

我也有同样的问题,我所做的是在OrbitControls.js文件中为THREE.OrbitControls函数添加以下代码行。

THREE.OrbitControls = function ( object, domElement ) {
    .
    .
    .
  this.getPos = function() {
    pos = new THREE.Vector3();
    pos.copy( this.object.position );
    return  pos;
  };
  this.getCenter = function() {
    cent = new THREE.Vector3();
    cent.copy( this.center );
    return cent;
  };
    .
    .
    .
}

this.object它指向你创建Controls对象时给出的相机对象,this.center是一个初始化为(0,0,0)的THREE.Vector3(),它定义了你的相机正在看的地方。

而且效果很好。正如您所看到的,有两个getter函数,一个获取相机位置,另一个获取中心。然后我用我的代码这样称呼它:

//Create the controls object
var controls = new THREE.OrbitControls( this.camera, this.renderer.domElement);
//get the camera position whenever you want
var cameraPosition = controls.getPos();