C# 旋转矢量3D

C# 旋转矢量3D,c#,vector,rotation,quaternions,C#,Vector,Rotation,Quaternions,我试着像这样旋转一个矢量3D: 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 =

我试着像这样旋转一个矢量3D:

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;
}
Vector3D i=新的Vector3D(1,1,0);
i、 规范化();
Matrix3D m=Matrix3D.标识;
四元数rot=GetShortestRotationBetweenVectors(i,newvector3d(1,0,0));
m、 旋转(腐烂);
Vector3D j=新的Vector3D(0,1,0);
向量3d jRotated=m.Transform(j);
//j应该等于i
公共静态四元数GetShortEstrotationBetween变换器(Vector3D vector1、Vector3D vector2)
{
向量1.Normalize();
向量2.Normalize();
浮点角度=(float)Math.Acos(Vector3D.DotProduct(vector1,vector2));
Vector3D轴=Vector3D.叉积(vector2,vector1);
//检查角度是否很小,在这种情况下,叉积变得不稳定,
//因此,将轴设置为默认值。这个轴是什么并不重要,因为旋转角度
//无论如何都将接近零。
如果(角度<0.001f)
{
轴=新矢量3D(0.0f、0.0f、1.0f);
}
如果(轴长度<.001f)
{
返回四元数。标识;
}
axis.Normalize();
四元数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));
这意味着Avatering XNA(微软官方软件)中存在漏洞