//---------------------------------------------------------------------------
// arbitraryRotate - rotates v theta degrees around n
//---------------------------------------------------------------------------
private static Vector3D arbitraryRotate(Vector3D v, Vector3D n, double theta)
{
theta = Math.toRadians(theta);
double cosTheta = Math.cos(theta);
double sinTheta = Math.sin(theta);
double M11 = n.x * n.x * (1 - cosTheta) + cosTheta;
double M12 = n.x * n.y * (1 - cosTheta) + (n.z * sinTheta);
double M13 = n.x * n.z * (1 - cosTheta) - (n.y * sinTheta);
double M21 = n.x * n.y * (1 - cosTheta) - (n.z * sinTheta);
double M22 = n.y * n.y * (1 - cosTheta) + cosTheta;
double M23 = n.y * n.z * (1 - cosTheta) + (n.x * sinTheta);
double M31 = n.x * n.z * (1 - cosTheta) + (n.y * sinTheta);
double M32 = n.y * n.z * (1 - cosTheta) - (n.x * sinTheta);
double M33 = n.z * n.z * (1 - cosTheta) + cosTheta;
return new Vector3D(v.x * M11 + v.y * M21 + v.z * M31,
v.x * M12 + v.y * M22 + v.z * M32,
v.x * M13 + v.y * M23 + v.z * M33);
}
有人能告诉我我的矩阵有什么问题吗?绕Z轴旋转可以很好地工作,但X和Y轴旋转会导致失真。
答案 0 :(得分:0)
您的矩阵设置不正确。这是你如何正确旋转
你得到了
new vector = (Rx^-1)(Ry^-1)RzRyRx(original vector)
这是一个link,可以很好地解释它。您不必将矢量和矩阵扩展到4维 - 如果您在空间中围绕任意线旋转,而不是源于原点的矢量,则仅用于平移的目的。