如何在 Vulkan 中计算三角形是朝后还是朝前

问题描述 投票:0回答:1

在此页面中: https://registry.khronos.org/vulkan/specs/1.3-extensions/man/html/VkFrontFace.html 他们给出了这个方程:

您如何将该公式应用于具有这些坐标的三角形?:

p0(-0.5,-0.5)

p1(0.5,-0.5)

p2(0.5,0.5)

它会扩展成这样吗?

(-1/2) ( ((p0.x)(p1.y) - (p1.x)(p0.y)) + ((p1.x)(p2.y) - (p2.x)( p1.y)) + ((p2.x)(p0.y) - (p0.x)(p2.y)) )

(-1/2) (((-0.5)(-0.5) - (0.5)(-0.5)) + ((0.5)(0.5) - (0.5)(-0.5)) + ((0.5)(- 0.5) - (-0.5)(0.5)) )

(-1/2) ( (0.5) + (0.5) + (0.0) )

-0.5

符号为负,因此它是朝前的,因为“面积为负的三角形被认为是朝前的。”?

如果是这样,这与法线计算有何对应?

graphics vulkan vector-graphics
1个回答
0
投票

三角形好像是这样的:

缠绕似乎是顺时针方向,因此使用默认值(逆时针)它将是背面的。

该公式不是 Vulkan 发明的。这是三角形面积的基本公式。经典形式是这样的:0.5|AB×AC|ABC 是按指定顺序排列的顶点,因此 ABAC 是线段向量:

出于我们的目的,我们不需要精确的面积,我们只需要法线的方向。我们通过计算叉积得到一个法线:AB×AC。这就产生了向量
(0, 0, AB.x⋅AC.y - AB.y⋅AC.x).

只有一个分量的矢量的大小是其绝对值。我们跳过绝对值运算,得到一个带符号的“区域”。所以我们只有:
AB.x⋅AC.y - AB.y⋅AC.x

AB 就是 B-A,类似地 AC = C-A,因此替换它并处理乘法,得到:
Ax⋅By-Bx⋅Ay + Bx⋅Cy-C.x⋅B.y + C.x⋅A.y-A.x⋅c.y
这与规范中的 Σ 相符。

用你的数字,即 (-0.5⋅-0.5)-(0.5⋅-0.5) + (0.5⋅0.5)-(0.5⋅-0.5) + (0.5⋅-0.5)-(-0.5⋅0.5) = 1.

1/2 乘法显然对我们来说并不重要,因为它不改变符号。但无论如何,这使得它 ½×1 = 0.5.

y坐标朝下会导致镜像,因此改变了感知的缠绕方向:

因此我们必须交换方程中的符号:-0.5(AB.x⋅AC.y - AB.y⋅AC.x)。所以我们得到-0.5。

VK_FRONT_FACE_COUNTER_CLOCKWISE
的情况下,正面是具有正面积的面,所以我们确实看到了背面。

© www.soinside.com 2019 - 2024. All rights reserved.