【问题标题】:Figuring out how much of the side of a cube is visible找出立方体有多少边是可见的
【发布时间】:2013-08-12 08:21:42
【问题描述】:

我有一个简单的 Three.js 场景,其中有一个围绕立方体旋转的摄像机,始终直视它。我需要计算出相机绕立方体运行时当前最容易看到的一侧的百分比。

因此,如果我直视,则第 1 面(“正面”)可以看到 100%,而所有其他 5 面都为 0%。如果我将相机稍微向右旋转,那么现在可以看到第 2 面(“右侧”)的一部分——可能是 20%,而现在可以在 %80 处看到第 1 面。如果我然后稍微向上旋转,那么边 3(顶部)可能有 10% 可见,等等。

我该如何解决这个问题?请记住,立方体本身不会旋转——只有相机。 Three.js 或 JavaScript 会很棒,但我几乎可以处理任何编程语言。我最感兴趣的是如何实现这一目标的想法。

【问题讨论】:

  • 从一个角度看,您可以看到 100% 的脸部,脸部只是显得更小。我认为说你可以看到一张脸的 20% 是不正确的……你占了一个百分比。百分之几?它是每个渲染面占屏幕空间中总渲染形状的百分比吗?
  • 是的,这在技术上是正确的,但我不确定如何描述它。你会如何描述它?

标签: javascript 3d three.js


【解决方案1】:

作为另一种选择,您可以计算相机视图矢量和立方体面法线的点积,也许?然后从点积计算角度(以度为单位),您就知道每个面法线相对于相机视图矢量的角度。我不太确定这是否有效,只是一个想法。所以 90 度以上的一切都完全不可见,0 度完全面向相机。 好吧,不太确定百分比,但我不知道您的用例。只是想以某种方式保存 Gero3 提出的屏幕空间操作....仅使用来自面法线的角度。例如,如果您正在查看立​​方体的边缘并且有 2 个面与相机视图方向成 45 度角,您知道您对这两个面中的每一个都有 50% 吗?

【讨论】:

  • 这实际上听起来更简单,也与我的想法相似。我会试试看。
  • 这种方法对我来说非常有效。感谢您的建议。
【解决方案2】:

首先计算顶点在屏幕空间中的位置。

如何:

var screenspaceVertexPosition = vertex.position.applyProjection(
    this.projectionMatrix.multiplyMatrices(object.matrixWorld))

对所有 8 个顶点执行此操作。 然后通过检查平面法线来确定哪些平面是可见的。 然后计算屏幕空间中每个面使用的面积。从那里您可以计算完整的可见区域和百分比。

【讨论】:

  • 什么是“这个”?那是相机吗?并且“对象”立方体的侧面是正常的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 2011-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-19
相关资源
最近更新 更多