【问题标题】:Should I use the field of view or camera's z position for zooming in/out?我应该使用视野或相机的 z 位置来放大/缩小吗?
【发布时间】:2014-10-31 12:10:21
【问题描述】:

我有一个大的 2D 平面平面,我一直在使用相机的 Z 位置(PerspectiveCamera)放大和缩小(TrackballControls 有)。

我最近在我的 DAT GUI 控件中添加了 camera.fov 来使用它,发现我可以使用 0 到 180 的范围来完全放大和缩小我的场景。

我应该使用哪种方法以及为什么?

已编辑:

有多种方法可以让物体看起来离相机越来越近:

  • 移动对象的位置(对象太多,所以不要使用这个 一)
  • 移动相机的位置
  • 更改相机的 fov 属性
  • 更改相机的缩放属性

为了能够使用鼠标滚轮平滑滚动进出包含大型几何图形(数百万个顶点)的场景,是否有理由不应该或应该使用上述方法之一其他人?

【问题讨论】:

  • 您也可以使用camera.zoom( 2 ); camera.updateProjectionMatrix(); 很遗憾,您的问题是基于意见的。
  • 改变缩放似乎改变了视野 - github.com/mrdoob/three.js/blob/master/src/cameras/…
  • 所有道路都指向改变 fov 值,但这与 TrackballControls 配合得不好。一旦你放大到足够远然后尝试平移,这些动作就不会考虑你现在有多近,所以平移就像你更远了
  • 当然,因为你和以前一样远,所以你的位置没有改变,只有相机的投影。 (与现实生活中放大某物时相同,并且您必须非常小心或使用三脚架以免照片模糊)我想您可以通过修改控件并使用一个因素来减慢平移等来调整这种情况. 根据变焦距离。无论如何,您正在回答自己的问题,因为更改 FoV 似乎不是您想要做的,因此您可以移动相机或转到 FoV 并调整控件以补偿投影。

标签: three.js perspectivecamera


【解决方案1】:

好吧,如果您更改相机位置,您根本不会缩放,您只是将其移动得更近或更远。

使用视野变量,您可以进行缩放,但如果您达到极值,这通常与失真有关。

所以这取决于您的应用程序需要什么。如果失真没问题并且您确实需要“放大”的感觉,那么您应该选择相机的 FoV 变量。如果您需要避免失真并想要放大,则最好沿着“相机的lookAt矢量”移动。然后,您可以决定是在“缩放”时移动摄像机目标,还是在摄像机靠近目标(即焦点)时减慢摄像机的移动速度。只需使用适合您的用例的东西。

也许是一些有趣的东西:

http://blog.tartiflop.com/2008/08/understanding-zoom-focus-and-field-of-view-in-papervision3d/

【讨论】:

  • 其实你的前两个陈述是错误的。如果您移动相机的位置,您实际上是在放大/缩小。如果你改变相机的视野,你不是在缩放,而是在改变透视投影。把它想象成静止不动并戴上不同类型的镜片。这就是为什么你有失真。
  • 你能解释一下如何使用相机lookat实现缩放吗?
  • 棘手的部分是将这个概念附加到 DAT.GUI 中,这样一切才有意义。用 2D 控件控制 3D 矢量不是很直观。另外我会使用相机位置进行缩放,而不是lookat。在此处使用查看向量:jsfiddle.net/VsWb9/991。它不用于缩放。
  • @gaitat:我自己真的不确定,但是对于我来说,缩放FOR ME的定义是这样的:en.wikipedia.org/wiki/Digital_zoom简而言之:改变视野,从而改变透视投影并得到失真因此,正如您所说,是静止不动并戴上不同类型的镜片。另一件事是平移相机对象(移动相机),而不是缩放。至少这是我的定义。根据此定义,您的答案是错误的,因为您是在解释相机平移/移动,而不是缩放。
  • 好吧,你们似乎对我使用“缩放”这个词感到不满。我将编辑我的问题。
【解决方案2】:

有两种方法可以放大/缩小。要么将相机移动到更靠近/更靠近对象,要么将对象移动到更靠近/更靠近相机。您选择哪一个仅取决于您还想做什么。因此,如果您在城市中并且想要更接近汽车,那么您不会移动城市。 但是,如果您正在检查事物(不同型号),那么移动相机可能会更好。 (也许不是很好的例子)。

【讨论】:

  • 是的,我不会为了缩放而移动我的世界。这就是为什么我们可以重新定位我想象的相机。我也不想要失真。
  • 另外,您的回答对 dps27a 没有任何帮助,因为他想知道应该使用哪种方法。并且虚拟地翻译所有对象而不是相机并不是一个用three.js术语来说的解决方案。那么为什么要提出这个。您可以移动相机或使用视野,具体取决于您想要实现的目标。
【解决方案3】:
  • 移动相机的位置 = 最佳选择,因为它更兼容 与互动
  • 更改相机的 fov 属性 = 最好的选择,如果 你想在这个词的真正意义上“放大”,虽然不玩 很好地配合 TrackballControls
  • 更改相机的缩放属性 = 实际上会影响 fov 值

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    相关资源
    最近更新 更多