我用Three.js显示一个大小为700x700的场景。在此场景中,我生成了一个粒子系统,该粒子系统的随机位置在-250至250(对于x,y,z)之间,因此框的大小为500x500。

为了计算摄像机的正确距离(对于盒子的适应全 View ),我尝试了:

    <script>

if ( ! Detector.webgl ) Detector.addGetWebGLMessage();

var container, stats;
var camera, controls, scene, renderer;
var cross;
var width = 700, height = 700;

init();
animate();

function init() {

  camera = new THREE.PerspectiveCamera( 60, width / height, 1, 1000 );
  // tan(pi/6) = 1/sqrt(3) = height/2 / distance_z
  camera.position.z = 250*Math.sqrt(3);

      ...

 for(var p = 0; p < particleCount; p++) {

    // create a particle with random
    // position values, -250 -> 250

    var pX = 250 - Math.random() * 500;
    var pY = 250 - Math.random() * 500;
    var pZ = 250 - Math.random() * 500;

    var particle = new THREE.Vector3(pX, pY, pZ);

    // add it to the geometry
    geometry.vertices.push(particle);

  }

function onWindowResize() {

  camera.aspect = width /height;
  camera.updateProjectionMatrix();

  renderer.setSize( width, height );

  controls.handleResize();

}

...
</script>

如您所见,我将此公式应用于视场(FOV)
tan(FOV/2) == height/2 / distance_z

在这里给出:distance_z = 250 * sqrt(3)
但是当我加载页面时,缩放比例似乎过高,以至于我离500x500框太近了。

为什么在我的情况下此计算不正确?怎样才能完全适应500x500盒子的大小?

也许我在场景的大小和盒子的大小之间混淆了

谢谢

最佳答案

您要计算摄像机的位置,以便获得盒子的完整 View 。

this post中所述,您可以根据距相机的距离来计算可见高度,如下所示:

var vFOV = camera.fov * Math.PI / 180;        // convert vertical fov to radians

var height = 2 * Math.tan( vFOV / 2 ) * dist; // visible height

重要的是立方体正面的可见性。

在您的情况下,正面的高度为500,由于立方体位于原点的中心,因此立方体的正面位于原点前方250的距离处。因此,重写上面的公式,
var dist = 500 / ( 2 * Math.tan( camera.fov * Math.PI / 360 ) );

由于必须从正面将相机放回原处,
camera.position.set( 0, 0, 250 + dist );

这是使多维数据集“适合”可见高度的确切解决方案。从那里,您可以根据自己的喜好调整摄像机的位置。另外,您可以通过在上面的公式中为height使用稍大的值来确保边距。

three.js r.71

10-04 15:26