0

我有一个简单的 Three.js 场景,带有一个围绕立方体运行的摄像机,始终直视它。我需要计算出当前相机在围绕立方体运行时最可见的一侧的百分比。

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

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

4

2 回答 2

2

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

于 2013-08-12T13:42:44.303 回答
1

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

如何:

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

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

于 2013-08-12T09:37:15.193 回答