如何使用平面法向量将XYZ向量转换为XY二维向量(HLSL实现)
HLSL 三维向量转平面内二维向量实现方案
你需要将三维向量先投影到plane_normal定义的平面上,再通过平面正交基映射为二维坐标,完整实现步骤和代码如下:
前置预处理
首先要确保平面法线是单位向量,避免非均匀缩放导致计算误差:
plane_normal = normalize(plane_normal);
步骤1:三维向量投影到平面
消去o.normal沿平面法线方向的分量,得到平面内的三维投影向量:
// 计算o.normal在法线上的投影长度,减去对应分量得到平面内向量 float3 plane_proj_vec = o.normal - dot(o.normal, plane_normal) * plane_normal;
步骤2:构建平面正交坐标系
在平面上生成两个互相垂直的单位基向量,作为二维坐标系的X、Y轴:
// 选取和法线不共线的参考向上向量,避免共线叉乘得到零向量 float3 reference_up = abs(plane_normal.y) < 0.999 ? float3(0, 1, 0) : float3(1, 0, 0); // 生成第一个基向量U(二维X轴) float3 u = normalize(cross(reference_up, plane_normal)); // 生成第二个基向量V(二维Y轴),和U、法线都正交 float3 v = cross(plane_normal, u);
步骤3:映射为二维向量
将平面内的三维投影向量分别和两个基向量做点积,得到二维XY分量:
float2 result_2d = float2(dot(plane_proj_vec, u), dot(plane_proj_vec, v));
补充说明
- 如果你的
o.normal本身长度不需要保留,只需要方向,可以对plane_proj_vec做归一化后再映射 - 如果你需要固定的平面坐标系方向,可以提前指定
reference_up向量,避免动态选择导致的坐标轴跳变
内容的提问来源于stack exchange,提问作者Oynamali Kanal
相关产品推荐
相关产品推荐

