我有一个由 3 个点定义的三角形(System.Numerics.Vector3,我没有使用 Unity3d):
A [-0,21090554, 3,81115985, -23,54532623]
B [0,01877949, 3,79133320, 23,49146652]
C [33,08344650, 1,99846101, 0,20934258].
如你所见,三角形略微倾斜并且不平行于地面:
我需要旋转三角形,使其与地面平行(所有三个点的 Y 坐标将变得相同)。
所以我需要计算一个旋转来对齐 三角形法线 与世界向上向量 [0, 1, 0] (我图片上的垂直法线是 [0, 10, 0] 因为 [0, 1, 0] 向量将是太短了,看不到它,也无法将它与三角形法线区分开来。
我是 3D 新手,不知道如何计算旋转(我猜是四元数或矩阵)并将其应用于所有三角形点。
您可以使用 Quaternion.CreateFromAxisAngle 创建四元数。
var normal = Vector3 Normalize((A - B) * (C - B));
var toDir = Vector3.UnitY;
var axis = normal * toDir;
var angle = Math.Acos(Vector3.Dot(normal, toDir));
var rot = Quaternion.CreateFromAxisAngle(axis, angle);
要旋转 3 个点,您需要先定义一个原点,然后使用 Vector3.Transform 通过四元数变换点。
var O = (A + B + C) / 3;
var Ar = Vector3.Transform(A - O, rot) + O;
var Br = Vector3.Transform(B - O, rot) + O;
var Cr = Vector3.Transform(C - O, rot) + O;
考虑垂直和三角形法线之间的叉积。
现在,你有了轴和角。 因此,您可以将旋转表示为四元数或其他表示形式。