如何计算旋转以在 C# 中将 System.Numerics.Vector3 与世界向上向量 [0, 1, 0] 对齐?

问题描述 投票:0回答:2

我有一个由 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 新手,不知道如何计算旋转(我猜是四元数或矩阵)并将其应用于所有三角形点。

c# vector 3d rotation quaternions
2个回答
1
投票

您可以使用 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;

0
投票

考虑垂直和三角形法线之间的叉积。

  • 叉积的方向成为旋转轴的方向。
  • 根据叉积的定义,您可以获得有关旋转角度的信息(正弦值)。

现在,你有了轴和角。 因此,您可以将旋转表示为四元数或其他表示形式。

© www.soinside.com 2019 - 2024. All rights reserved.