Three.js - 相机的良好 z 距离,可实现盒子的全视图

2023-12-29

我使用 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 盒子尺寸的完整视图?

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

Thanks


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

正如中所解释的这个帖子 https://stackoverflow.com/questions/13350875/three-js-width-of-view/13351534#13351534,您可以根据距相机的距离计算可见高度,如下所示:

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在上面的公式中。

三.js r.71

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Three.js - 相机的良好 z 距离,可实现盒子的全视图 的相关文章

随机推荐

  • 理解 scikit-learn 中数据的格式

    我正在尝试使用 Python 3 x 中的 scikit learn 进行多标签文本分类 我有 libsvm 格式的数据 我正在使用它加载load svmlight file模块 数据格式是这样的 314523 165538 76255 1
  • 如何在SceneKit / ARKit中使用SCNTechnique创建“蒙面”传送门效果?

    我正在尝试了解如何将 SCNTechnique 与 Scenekit 结合使用 我试图创建的效果可以在 Unity 中轻松实现 方法是向两种材质添加自定义着色器 使具有 过滤 着色器的对象仅在通过其他着色器 门户 看到时才可见 我按照本教程
  • CMake:如何在 Linux 中将一个目标/文件打包到多个包中?

    我正在开发一个生成相当多可执行文件 库的项目 和配置 需要打包到不同的包中进行部署 问题是 这些目标 文件的包含不是相互的 独家的 一个目标 文件可以属于多个包 我正在使用 CMake 2 8 9 并尝试 CPack 我知道这是可行的 安装
  • 是否可以使用 Convert-sass 转换整个文件夹? (scss 到 sass)

    我在一堆 SCSS 格式的文件夹中有一堆文件 我需要将其全部转换为 SASS 格式 并且我知道 sass 有一个特定的命令来转换 sass 但是我不确定是否可以转换整个文件夹 其中包含文件夹 如果可能的话 那么如何convert sass
  • yii2 时区格式化程序中的问题

    php ini 中的时区是 UTC 系统时区为UTC yii 默认时区是 UTC 但在保存到数据库之前 我的日期时间属性会转换为我的时区 亚洲 加尔各答 例如 UTC 时间 12 00 小时 我的输入 17 30hrs 我在 db 中期望的
  • 如何以编程方式关闭 Android 手机?

    是否可以通过编程方式关闭移动设备 那是不使用 su 命令 这是可能的 但你需要一个RootedAndroid 设备Superuser使用权 除非您的应用程序已使用 Root 签名 否则您无法在没有 Root 的情况下执行此操作System
  • 模板专业化是否扩展或覆盖通用模板?

    template
  • 让 Android 应用程序监听共享链接

    当用户共享来自其他应用程序 如浏览器 的 URL 时 我希望我的 Android 应用程序显示为选项 我如何注册我的应用程序来做到这一点 我该如何对链接共享做出反应 多谢 Edit 我尝试过像这样使用 IntentFilter 但没有成功
  • 如何使用audio_service和just_audio在Flutter中查找当前歌曲时长

    当您设置MediaItem in 音频服务 https pub dev packages audio service你还不知道歌曲时长 因为只是音频 https pub dev packages just audio目前还没有任何更改可以告
  • jQuery 与 ExtJS 兼容吗?

    我相信 Ext js 使用了 jQuery 但我不确定 有谁知道是否与 jQuery 和 Ext js 完全兼容 Ext js 完全独立于 jQuery 因此不以任何方式依赖 jQuery 不知道 完全兼容性 是什么意思 但您可以在同一页面
  • Xcode UI 测试允许系统警报系列

    我有问题 如果我尝试允许系列系统警报 只工作一次 而下一个警报不 允许 我在谷歌上搜索了更多时间 并且知道了那个帖子 Xcode 7 UI 测试 如何在代码中消除一系列系统警报 https stackoverflow com questio
  • 我们可以在同一个 EAR 中跨 Web 应用程序共享 CDI @ApplicationScoped bean 实例吗?

    我有一个 JavaEE 应用程序 它有 2 个 Web 应用程序 我还有另一个库 Web 模块 其中包含 common bean 注释为 ApplicationScoped 我的问题是 我可以在两个 Web 应用程序之间共享 common
  • 浏览器如何判断是下载还是显示

    我有一个 Web 资源 它返回 json 内容Content Type application json 通常内容会直接显示在浏览器中 但有时不会 而是显示下载提示 我知道有一个标题Content Disposition inline at
  • jQuery:如何在单击缩略图时显示图像弹出窗口?

    在我的 aspx 页面中 我有一个缩略图 img 当用户单击该图像时 我希望显示一个弹出窗口 用较大 完整 版本的图像遮挡 UI 的其余部分 有没有任何插件可以做到这一点 有很多 jQuery 插件可用于此 Thickbox http co
  • Google Play 商店是否支持华为 HMS?

    我有一个带有常见谷歌广告和应用内支付功能的应用程序 它已被 Play 商店接受 现在我想让它同时支持GMS和HMS 根据适当服务的可用性 应用程序可以决定使用哪个平台 该应用程序内置了华为功能 在我自己的设备上测试时运行良好 然而 一旦华为
  • @Inject 通过 URL 将参数传递给 CDI @Named bean

    如果我无法将 ManagedProperty 注释与 Named 一起使用 因为 ManagedProperty 在 CDI 中不起作用 那么如何将 URL 中的参数传递给 Facelets 客户端 在我的代码中 我想通过 后退 和 前进
  • 使用 React.JS 导入 SVG 的最佳方法是什么

    我和我的团队正在构建一个 React 应用程序 我们希望导入 SVG 而不是作为字符串 这样我们就能够将其用作组件 由于我们使用 CRA 安装了该项目 因此 SVGR 已安装并处于 webpack 配置中 我们想知道是否有其他方法可以导入
  • utf-8 邮件 php 希腊字符

    我在我的网站中创建一个表单 我希望客户能够编写和发送希腊字符 但在邮件中我收到类似这样的内容 而不是希腊字符 我尝试使用以下代码将编码更改为 UTF 8 mail recipient subject UTF 8 B base64 encod
  • 有没有办法排除 docusaurus 中 docs 目录中的路径?

    我想从其中排除子文件夹docs 生成文档页面的目录 customDocsPath https docusaurus io docs en site config customdocspath string是一个相关选项 但它是一个字符串 是
  • Three.js - 相机的良好 z 距离,可实现盒子的全视图

    我使用 Three js 显示尺寸为 700x700 的场景 在此场景中 我生成了一个随机位置在 250 到 250 之间 对于 x y z 的粒子系统 因此盒子的大小为 500x500 为了计算相机的正确距离 为了适应盒子的完整视图 我尝