2
0

InverseBindMatrixTest.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Numerics;
  4. using System.Text;
  5. using NUnit.Framework;
  6. namespace SharpGLTF.Transforms
  7. {
  8. [Category("Core.Transforms")]
  9. public class InverseBindMatrixTest
  10. {
  11. [TestCase(0, 0, 0, 0, 0, 0)]
  12. [TestCase(1, 2, 4, 3, 2, 1)]
  13. [TestCase(-1, 1, 3, 2, 0, 1)]
  14. [TestCase(0, 0, 1, 0, 1, 0)]
  15. [TestCase(0, -1, 1, -2, 1, 0)]
  16. public void CalculateInverseBindMatrix(float mx, float my, float mz, float jx, float jy, float jz)
  17. {
  18. var model = Matrix4x4.CreateFromYawPitchRoll(mx, my, mz);
  19. var joint = Matrix4x4.CreateFromYawPitchRoll(jx, jy, jz);
  20. joint.Translation = new Vector3(jx, jy, jz);
  21. var invBindMatrix = SkinnedTransform.CalculateInverseBinding(model, joint);
  22. Matrix4x4.Invert(model, out Matrix4x4 xform);
  23. Matrix4x4.Invert(joint * xform, out Matrix4x4 result);
  24. NumericsAssert.AreEqual(result, invBindMatrix, 0.000001f);
  25. Matrix4x4.Invert(joint, out Matrix4x4 invJoint);
  26. result = model * invJoint;
  27. NumericsAssert.AreEqual(result, invBindMatrix, 0.000001f);
  28. }
  29. [Test]
  30. public void TestMatrixNormalization()
  31. {
  32. void testMatrix(Matrix4x4 m, float tolerance = 0)
  33. {
  34. var o = m;
  35. Matrix4x4Factory.NormalizeMatrix(ref m);
  36. NumericsAssert.AreEqual(o, m, tolerance);
  37. Assert.IsTrue(Matrix4x4.Decompose(m, out _, out _, out _));
  38. Assert.IsTrue(Matrix4x4.Invert(m, out _));
  39. }
  40. void testSkewed(Func<Matrix4x4, Matrix4x4> mf, float tolerance = 0)
  41. {
  42. var m = Matrix4x4.Identity;
  43. var o = m = mf(m);
  44. Assert.IsFalse(Matrix4x4.Decompose(m, out _, out _, out _));
  45. Matrix4x4Factory.NormalizeMatrix(ref m);
  46. NumericsAssert.AreEqual(o, m, tolerance);
  47. Assert.IsTrue(Matrix4x4.Decompose(m, out _, out _, out _));
  48. Assert.IsTrue(Matrix4x4.Invert(m, out _));
  49. }
  50. testSkewed(m => { m.M12 += 0.34f; return m; }, 0.34f);
  51. testSkewed(m => { m.M13 += 0.34f; return m; }, 0.34f);
  52. testSkewed(m => { m.M21 += 0.34f; return m; }, 0.34f);
  53. testSkewed(m => { m.M23 += 0.34f; return m; }, 0.34f);
  54. testSkewed(m => { m.M31 += 0.34f; return m; }, 0.34f);
  55. testSkewed(m => { m.M32 += 0.34f; return m; }, 0.34f);
  56. testSkewed(m => { m.M12 += 0.1f; m.M23 -= 0.1f; m.M31 += 0.05f; return m; }, 0.20f);
  57. // test normalization with uneven scaling
  58. testMatrix(Matrix4x4.CreateScale(0.0001f) * Matrix4x4.CreateFromYawPitchRoll(1, 2, 3), 0.0001f);
  59. testMatrix(Matrix4x4.CreateScale(1000) * Matrix4x4.CreateFromYawPitchRoll(1, 2, 3), 0.0001f);
  60. var SxR = Matrix4x4.CreateScale(5, 1, 1) * Matrix4x4.CreateFromYawPitchRoll(1, 2, 3); // Decomposable
  61. var RxS = Matrix4x4.CreateFromYawPitchRoll(1, 2, 3) * Matrix4x4.CreateScale(5, 1, 1); // Not Decomposable
  62. Assert.IsTrue(Matrix4x4.Decompose(SxR, out _, out _, out _));
  63. testMatrix(SxR, 0.0001f);
  64. Assert.IsFalse(Matrix4x4.Decompose(RxS, out _, out _, out _));
  65. testMatrix(RxS, 100);
  66. }
  67. [Test]
  68. public void TestAffineTransformMult()
  69. {
  70. var a = Matrix4x4.CreateScale(1,2,4) * Matrix4x4.CreateFromYawPitchRoll(1, 2, 3);
  71. var b = Matrix4x4.CreateFromYawPitchRoll(1, 0, 2) * Matrix4x4.CreateTranslation(3, -4, 2);
  72. var r = Matrix4x4.Multiply(a, b);
  73. var aa = new AffineTransform(a);
  74. var bb = new AffineTransform(b);
  75. var rr = AffineTransform.Multiply(aa, bb);
  76. NumericsAssert.AreEqual(r, rr.Matrix, 0.0001f);
  77. }
  78. }
  79. }