【问题标题】:THREE.js Orbit controls zooming limitsTHREE.js Orbit 控制缩放限制
【发布时间】:2018-11-25 21:11:19
【问题描述】:

我正在使用 Orbit 控件,但它们有一个奇怪的限制。

缩放取决于相机的球坐标相对于轨道轴的半径。我将尝试解释它是如何工作的:

每次用户滚动,scale 的值都会发生这样的变化:

(如果用户放大)

scale *= Math.pow(0.95, scope.zoomSpeed)

(或者如果用户缩小)

scale /= Math.pow(0.95, scope.zoomSpeed)

然后,半径值会随着每次更新而改变,如下所示: spherical.radius *= scale

然后将比例值重新分配其默认值 scale = 1 所以半径不会随着每次更新而改变

spherical.radius 的值决定了您与相机所看到的距离有多近,因此,当然,放大时您有一个限制,因为半径只能变得很小(请参阅放大乘以0.95 的半径值,所以它每次都接近 0)

问题是,如果您靠近轨道轴 (spherical.radius ~= 0) 进行缩放,然后旋转相机并向下(或向上或任何地方)看,您将无法放大到该方向,因为 spherical.radius 可以不要再小了!

所以,我的问题是,如何使用 Orbit 控件实现该行为(当半径达到极限时放大或缩小)。

附:此代码可以在THREE.js 库的OrbitControl.js 中找到,更具体地说,在this.update() 函数中。这是github repo

【问题讨论】:

  • 你说的是minzoom吗?请分享您的代码!问题不言自明!
  • 不,我不是在谈论 minzoom,实际上我没有要添加的代码,我没有做任何特别的事情,我可以添加控件的基本用法。如果您放大到足够大(默认为 minzoom = 0),则缩放会变慢,直到您无法缩放,如果您旋转相机,您仍然无法缩放,无论您查看的方向如何
  • @UllasHunka OrbitControls 的名字是随机分配的。缩放与实际缩放没有任何关系。想象一下,我有一家餐馆,但我没有把我的菜叫steakstew,而是叫它们picture framecar wheel。我相信这个问题听起来令人困惑。但我认为这是有效的。

标签: javascript three.js 3d


【解决方案1】:

感谢pailhead,我设法解决了这个问题(再次感谢!)

OrbitControls.js 中的this.update() 函数中添加了以下内容

获取相机正在注视的向量

var cameraWorldDir = new THREE.Vector3();
scope.object.getWorldDirection(cameraWorldDir);

魔法:

if (spherical.radius <= 2) {
    scope.target.add(cameraWorldDir.multiplyScalar(0.4));
}

因此,如果我离中心足够近,我只需将目标(轨道中心)沿lookAt 向量移动,也就是将其推回。

查看threejs论坛here的完整帖子

【讨论】:

    【解决方案2】:

    您可能对OrbitControls 中使用的术语感到困惑

    “zoom”指的是现实世界中的“dolly”。它是一种用于创建相机运动的设备:

    https://en.wikipedia.org/wiki/Camera_dolly

    在现实世界中,“缩放相机”的含义有所不同: https://en.wikipedia.org/wiki/Zooming_(filmmaking)

    它需要改变镜头的焦距以使视野更窄或更宽(您从同一有利位置在屏幕上捕捉到的世界的多少)。

    当您达到minZoom 值时,您实际上并没有进行任何缩放,您已经尽可能靠近您的轨道中心。

    您可以尝试禁用 OrbitControls 上的“缩放”或 dolly,并尝试实现您自己的控制器来更改 camera.fov(缩放)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-03
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      • 1970-01-01
      • 2019-07-12
      • 2011-05-28
      相关资源
      最近更新 更多