MCPcopy Create free account
hub / github.com/esengine/esengine / invertMatrix4

Function invertMatrix4

scripts/compare-ibm.mjs:207–254  ·  view source on GitHub ↗
(m)

Source from the content-addressed store, hash-verified

205
206// Invert the matrix (this is what FBXLoader does)
207function invertMatrix4(m) {
208 const out = new Float32Array(16);
209 const m00 = m[0], m01 = m[1], m02 = m[2], m03 = m[3];
210 const m10 = m[4], m11 = m[5], m12 = m[6], m13 = m[7];
211 const m20 = m[8], m21 = m[9], m22 = m[10], m23 = m[11];
212 const m30 = m[12], m31 = m[13], m32 = m[14], m33 = m[15];
213
214 const b00 = m00 * m11 - m01 * m10;
215 const b01 = m00 * m12 - m02 * m10;
216 const b02 = m00 * m13 - m03 * m10;
217 const b03 = m01 * m12 - m02 * m11;
218 const b04 = m01 * m13 - m03 * m11;
219 const b05 = m02 * m13 - m03 * m12;
220 const b06 = m20 * m31 - m21 * m30;
221 const b07 = m20 * m32 - m22 * m30;
222 const b08 = m20 * m33 - m23 * m30;
223 const b09 = m21 * m32 - m22 * m31;
224 const b10 = m21 * m33 - m23 * m31;
225 const b11 = m22 * m33 - m23 * m32;
226
227 let det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
228
229 if (Math.abs(det) < 1e-8) {
230 console.log('WARNING: Matrix is singular!');
231 return new Float32Array([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]);
232 }
233
234 det = 1.0 / det;
235
236 out[0] = (m11 * b11 - m12 * b10 + m13 * b09) * det;
237 out[1] = (m02 * b10 - m01 * b11 - m03 * b09) * det;
238 out[2] = (m31 * b05 - m32 * b04 + m33 * b03) * det;
239 out[3] = (m22 * b04 - m21 * b05 - m23 * b03) * det;
240 out[4] = (m12 * b08 - m10 * b11 - m13 * b07) * det;
241 out[5] = (m00 * b11 - m02 * b08 + m03 * b07) * det;
242 out[6] = (m32 * b02 - m30 * b05 - m33 * b01) * det;
243 out[7] = (m20 * b05 - m22 * b02 + m23 * b01) * det;
244 out[8] = (m10 * b10 - m11 * b08 + m13 * b06) * det;
245 out[9] = (m01 * b08 - m00 * b10 - m03 * b06) * det;
246 out[10] = (m30 * b04 - m31 * b02 + m33 * b00) * det;
247 out[11] = (m21 * b02 - m20 * b04 - m23 * b00) * det;
248 out[12] = (m11 * b07 - m10 * b09 - m12 * b06) * det;
249 out[13] = (m00 * b09 - m01 * b07 + m02 * b06) * det;
250 out[14] = (m31 * b01 - m30 * b03 - m32 * b00) * det;
251 out[15] = (m20 * b03 - m21 * b01 + m22 * b00) * det;
252
253 return out;
254}
255
256// FBXLoader does: inverseBindMatrix = invertMatrix4(TransformLink)
257// But does FBXLoader expect TransformLink in row-major or column-major?

Callers 1

compare-ibm.mjsFile · 0.70

Calls 1

logMethod · 0.45

Tested by

no test coverage detected