我正在使用three.js轨道控件并试图让天空盒跟随相机的位置。在互联网上搜索后,我找不到合适的答案。
我的问题很简单 - 如何在使用轨道控制时检索相机的坐标,以下不起作用:
orbit_controls.object.target
x和z坐标的值不正确。我也尝试过:
{{1}}
相反,但这导致类似的错误行为,x和z返回不正确的值。
看似显而易见的控制机制要求似乎非常困难。
答案 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。