【问题标题】:THREE.js fit Orthographic camera to sceneTHREE.js 使正交相机适合场景
【发布时间】:2015-11-05 20:08:05
【问题描述】:

我搜索了很多关于堆栈溢出的相关问题,但我找不到这个问题的答案。

我的场景中有一大群动态的 Object3D,有一个正交相机正对着它们。

我想要一个简单的函数,当调用它时,它将简单地匹配正交相机的上/左/下/右/缩放属性以正确适合 Object3D 组。

我尝试了各种方法,但我的代码都不值得发布。我需要从一个全新的角度来看待这个问题(双关语)。一旦您知道从组的边界框的面到相机的距离,我发现了各种其他讨论更改相机的 fov 的答案,但是我不知道如何使用正交相机来实现它,因为(据我尝试) fov 属性不适用于它(也许它确实有效,我只是不知道)。

所以我不是特别喜欢要求代码,但我想要一个函数,它会自动调整正交相机的适当属性以适应作为参数传递给它的对象,例如:

function fitOrthographicCameraToObject3DGroup(group) {
    //implement here (my question)
}

【问题讨论】:

  • 您是否在计算中使用了场景边界框尺寸?
  • 是的,我能够计算场景中所有对象的复合边界框;但是,我仍然不知道如何基于此自动调整正交相机的上/左/下/右/缩放属性。
  • 请参阅this answer,了解OrthographicCamera 参数所代表的含义。

标签: javascript camera three.js


【解决方案1】:

计算网格的边界框并应用此代码。 这对我有用

        var camera = new THREE.OrthographicCamera(container.offsetWidth / -2, container.offsetWidth / 2, container.offsetHeight / 2, container.offsetHeight / -2, 100, 100000);

        //For centering the meshGroup
            var box = new THREE.Box3().setFromObject(meshGroup);
            box.center(meshGroup.position);
            meshGroup.localToWorld(box);
            meshGroup.position.multiplyScalar(-1);

       //For fitting the object to the screen when using orthographic camera

           Camera.zoom = Math.min(container.offsetWidth / (box.max.x - box.min.x),
                container.offsetHeight / (box.max.y - box.min.y)) * 0.4;
           Camera.updateProjectionMatrix();
           Camera.updateMatrix();

【讨论】:

  • 谢谢!我有点疯狂地试图找到一些适用于 OrthographicCamera 的方法!
  • 如果我从上往下看飞机怎么办。 box.max.y-box.min.y 将为 0。该解决方案看起来并不通用。
【解决方案2】:

拥有边界框后,设置正交相机的顶部/左侧/底部/右侧应该不是问题。只取边界框的一半长度。

缩放是个问题,为此,您可以根据边界框大小将场景放大或缩小适当的数量,从而将场景限制在一个单位立方体中。那么你就不用担心缩放了,上面的top/left/bottom/right值变成了0.5/0.5/-0.5/-0.5。

【讨论】:

  • 一旦我的视锥体尺寸合适,您如何建议将相机与组对齐?
  • 而且该组也适合一个单位立方体,平截头体不应该是 .5/.5/-.5,-.5 吗?
  • 你说你正在看场景,所以我假设相机在 z 轴上,所以不需要对齐。更新第二条评论。
  • 是的,我收回我的评论:)
猜你喜欢
  • 2023-04-08
  • 2012-08-27
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 2011-02-21
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
相关资源
最近更新 更多