判断一个面的朝向(正面或背面)主要基于顶点缠绕顺序(Winding Order) 的规则。
缠绕顺序(Winding Order)
- 当定义三角形时,三个顶点的连接顺序决定了面的“缠绕方向”。
- 默认规则:
- 逆时针(CCW) 顶点顺序 → 正面(Front Face)
- 顺时针(CW) 顶点顺序 → 背面(Back Face)
- 例如:顶点顺序
(V0, V1, V2)在屏幕上呈逆时针排列时,该面被视为正面。
数学原理
通过 屏幕空间中的有向面积 判断缠绕顺序:
- 计算向量:(\vec{u} = V_1 - V_0),(\vec{v} = V_2 - V_0)
- 叉积符号:(\text{sign}(u_x v_y - u_y v_x))
- 正值 → 逆时针(CCW)
- 负值 → 顺时针(CW)
所使用的坐标系
在 观察坐标系(眼坐标系) 中计算缠绕顺序(非世界坐标系)。
顶点经过模型视图变换(ModelView Matrix)后,在观察空间中根据投影到屏幕前的2D坐标计算缠绕方向。
各图形引擎的规则
OpenGL
通过 glFrontFace() 可修改默认规则:
glFrontFace(GL_CCW); // 逆时针为正面(默认)
glFrontFace(GL_CW); // 顺时针为正面