【问题标题】:Three.js - Good z distance of camera for full view of boxThree.js - 相机的良好 z 距离,可全方位查看盒子
【发布时间】:2015-10-24 10:22:31
【问题描述】:

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

为了计算相机的正确距离(对于盒子的完整视图),我尝试了:

    <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 框大小的完整视图?

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

谢谢

【问题讨论】:

  • 我使用6 * geometry.boundingSphere.radius 作为距离。当然,如果你的相机位置 x 和 z 不为 0,那么这个值对于 z 来说太高了。这是一个假设的几何形状(你的“盒子”)。所以这段代码不会直接为你工作,因为你会发现需要找到你的盒子的边界球。

标签: javascript three.js perspectivecamera


【解决方案1】:

您想要计算相机位置,以便获得一个盒子的完整视图。

正如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

【讨论】:

  • 谢谢,确实,我没有考虑到我必须在前面加上 (250) 的距离
  • 如果您因为忘记了Math.tan() 而到达这里,请举手,以弧度表示。 ✋
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-02
  • 2014-06-20
  • 1970-01-01
  • 2018-08-06
  • 2013-01-26
  • 2014-10-27
  • 1970-01-01
相关资源
最近更新 更多