Skip to content

Commit 9a495b2

Browse files
committed
matrix4 GetArbitraryAxis
1 parent b19408c commit 9a495b2

File tree

1 file changed

+25
-9
lines changed

1 file changed

+25
-9
lines changed

CSMath/Matrix4.cs

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ public static Matrix4 CreateScalingMatrix(double x, double y, double z)
496496
/// <returns>The translation matrix.</returns>
497497
public static Matrix4 CreateTranslation(XYZ position)
498498
{
499-
return Matrix4.CreateTranslation(position.X, position.Y, position.Z);
499+
return CreateTranslation(position.X, position.Y, position.Z);
500500
}
501501

502502
/// <summary>
@@ -538,17 +538,29 @@ public static Matrix4 CreateTranslation(double xPosition, double yPosition, doub
538538
/// <returns>Rotation matrix.</returns>
539539
public static Matrix4 GetArbitraryAxis(XYZ zaxis)
540540
{
541-
zaxis.Normalize();
541+
zaxis = zaxis.Normalize();
542542

543543
if (zaxis.Equals(XYZ.AxisZ))
544544
{
545-
return Matrix4.Identity;
545+
return Identity;
546546
}
547+
else if (zaxis.Equals(-XYZ.AxisZ))
548+
{
549+
return GetArbitraryAxis(-XYZ.AxisX, zaxis);
550+
}
551+
552+
XYZ xaxis;
553+
if (Math.Abs(zaxis.X) < (1 / 64) && Math.Abs(zaxis.Y) < (1 / 64))
554+
{
555+
xaxis = XYZ.Cross(XYZ.AxisY, zaxis);
556+
}
557+
else
558+
{
559+
xaxis = XYZ.Cross(XYZ.AxisZ, zaxis);
560+
}
561+
562+
xaxis = xaxis.Normalize();
547563

548-
XYZ xaxis = ((!(System.Math.Abs(zaxis.X) < (1 / 64)) || !(System.Math.Abs(zaxis.Y) < (1 / 64)))
549-
? XYZ.Cross(XYZ.AxisZ, zaxis)
550-
: XYZ.Cross(XYZ.AxisY, zaxis));
551-
xaxis.Normalize();
552564
return GetArbitraryAxis(xaxis, zaxis);
553565
}
554566

@@ -560,8 +572,12 @@ public static Matrix4 GetArbitraryAxis(XYZ zaxis)
560572
/// <returns>Rotation matrix.</returns>
561573
public static Matrix4 GetArbitraryAxis(XYZ xaxis, XYZ zaxis)
562574
{
563-
XYZ cross = XYZ.Cross(zaxis, xaxis);
564-
return new Matrix4(xaxis.X, cross.X, zaxis.X, 0.0, xaxis.Y, cross.Y, zaxis.Y, 0.0, xaxis.Z, cross.Z, zaxis.Z, 0.0, 0.0, 0.0, 0.0, 1.0);
575+
XYZ yaxis = XYZ.Cross(zaxis, xaxis);
576+
return new Matrix4(
577+
xaxis.X, yaxis.X, zaxis.X, 0.0,
578+
xaxis.Y, yaxis.Y, zaxis.Y, 0.0,
579+
xaxis.Z, yaxis.Z, zaxis.Z, 0.0,
580+
0.0, 0.0, 0.0, 1.0);
565581
}
566582

567583
/// <summary>

0 commit comments

Comments
 (0)