gpt4 book ai didi

c# - 旋转 Vector3D

转载 作者:太空宇宙 更新时间:2023-11-03 10:51:47 25 4
gpt4 key购买 nike

我正在尝试像这样旋转 Vector3D:

Vector3D i = new Vector3D(1, 1, 0);
i.Normalize();

Matrix3D m = Matrix3D.Identity;
Quaternion rot = GetShortestRotationBetweenVectors(i, new Vector3D(1, 0, 0));
m.Rotate(rot);

Vector3D j = new Vector3D(0, 1, 0);
Vector3D jRotated = m.Transform(j);
// j should be equal to i

public static Quaternion GetShortestRotationBetweenVectors(Vector3D vector1, Vector3D vector2)
{
vector1.Normalize();
vector2.Normalize();
float angle = (float)Math.Acos(Vector3D.DotProduct(vector1, vector2));
Vector3D axis = Vector3D.CrossProduct(vector2, vector1);

// Check to see if the angle is very small, in which case, the cross product becomes unstable,
// so set the axis to a default. It doesn't matter much what this axis is, as the rotation angle
// will be near zero anyway.
if (angle < 0.001f)
{
axis = new Vector3D(0.0f, 0.0f, 1.0f);
}

if (axis.Length < .001f)
{
return Quaternion.Identity;
}

axis.Normalize();
Quaternion rot = new Quaternion(axis, angle);

return rot;
}

我得到的旋转矩阵从 i = (0.77 ,0.77, 0) 传递到 (1,0,0) => 45º。所以 (0, 1, 0) 旋转 45º,结果应该是 (0.77, 0.77, 0)。但是结果几乎是相同的原始向量(0,1,0),所以没有做任何变换。

如何旋转矢量?我有一个向量 (x, y, z),这个向量应该旋转到 (1, 0, 0)。对于此操作,假设我们必须旋转 30º。那么如何将所有矢量旋转 30º?

最佳答案

终于找到问题了

float angle = (float)Math.Acos(Vector3D.DotProduct(vector1, vector2));

以弧度表示角度。

Quaternion rot = new Quaternion(axis, angle);

期望以度为单位的角度

所以解决方案很简单:

float angle = (float)(Math.Acos(Vector3D.DotProduct(vector1, vector2)) * (180 / Math.PI));

这意味着 Avateering-XNA(Microsoft 官方软件)中存在错误。

关于c# - 旋转 Vector3D,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21176086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com