three.js通过轨道控制获得摄像机位置

时间:2015-11-27 18:02:33

标签: javascript three.js

我正在使用three.js轨道控件并试图让天空盒跟随相机的位置。在互联网上搜索后,我找不到合适的答案。

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

orbit_controls.object.target

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

{{1}}

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

看似显而易见的控制机制要求似乎非常困难。

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

我有同样的问题,我所做的是在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(),它定义了你的相机在哪里看。

它完美无缺。如您所见,有两个吸气功能,一个取相机位置,另一个取中心。然后我从我的代码中调用它:

//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();

答案 2 :(得分:0)

这是2015年问题的2019年答案:

camera.position是摄像机的本地位置。您可以通过camera.getWorldPosition()来获取全球排名。

顺便说一句,您不必随相机一起移动天空盒。而是使用多维数据集纹理(或渲染的多维数据集)作为scene.background。