You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用平面法向量将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 13:24:05