在C#中计算旋转使三角形法线对齐世界上向量[0,1,0]
解决步骤
1. 计算三角形的当前法线
通过三角形两条边向量的叉乘得到法线,再归一化为单位向量:
using System.Numerics; Vector3 A = new Vector3(-0.21090554f, 3.81115985f, -23.54532623f); Vector3 B = new Vector3(0.01877949f, 3.79133320f, 23.49146652f); Vector3 C = new Vector3(33.08344650f, 1.99846101f, 0.20934258f); // 计算两条边向量 Vector3 AB = B - A; Vector3 AC = C - A; // 叉乘获取法线并归一化 Vector3 currentNormal = Vector3.Cross(AB, AC); currentNormal = Vector3.Normalize(currentNormal); // 确保法线方向向上(Y分量为正),若向下则取反 if (currentNormal.Y < 0) { currentNormal = -currentNormal; }
2. 生成旋转四元数
利用Quaternion.CreateFromTwoVectors方法,直接生成从当前法线到目标法线[0,1,0]的旋转四元数:
Vector3 targetNormal = Vector3.UnitY; // 对应世界向上向量[0,1,0] Quaternion rotation = Quaternion.CreateFromTwoVectors(currentNormal, targetNormal);
3. 应用旋转到三角形顶点
直接旋转顶点会让三角形绕世界原点偏移,因此需要先将三角形平移到局部原点(以重心为例),旋转后再平移回原位置:
// 计算三角形重心(也可选用任意顶点作为参考点) Vector3 center = (A + B + C) / 3f; // 平移到局部原点 → 旋转 → 平移回原位置 Vector3 rotatedA = Vector3.Transform(A - center, rotation) + center; Vector3 rotatedB = Vector3.Transform(B - center, rotation) + center; Vector3 rotatedC = Vector3.Transform(C - center, rotation) + center;
验证结果
旋转后的三个顶点Y坐标会基本一致(浮点精度误差可忽略),此时三角形法线将对齐[0,1,0],与地面平行。
内容的提问来源于stack exchange,提问作者bairog
相关产品推荐
相关产品推荐

