| 205 | |
| 206 | // Invert the matrix (this is what FBXLoader does) |
| 207 | function 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? |