Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
The MIT License

Copyright © 2010-2025 three.js authors
Copyright © 2010-2026 three.js authors

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
63 changes: 36 additions & 27 deletions build/three.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -12142,44 +12142,52 @@ class Matrix4 {
*/
invert() {

// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm
// based on https://github.com/toji/gl-matrix
const te = this.elements,

n11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],
n12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],
n13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],
n14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],

t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,
t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,
t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,
t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;

const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;
t1 = n11 * n22 - n21 * n12,
t2 = n11 * n32 - n31 * n12,
t3 = n11 * n42 - n41 * n12,
t4 = n21 * n32 - n31 * n22,
t5 = n21 * n42 - n41 * n22,
t6 = n31 * n42 - n41 * n32,
t7 = n13 * n24 - n23 * n14,
t8 = n13 * n34 - n33 * n14,
t9 = n13 * n44 - n43 * n14,
t10 = n23 * n34 - n33 * n24,
t11 = n23 * n44 - n43 * n24,
t12 = n33 * n44 - n43 * n34;

const det = t1 * t12 - t2 * t11 + t3 * t10 + t4 * t9 - t5 * t8 + t6 * t7;

if ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );

const detInv = 1 / det;

te[ 0 ] = t11 * detInv;
te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;
te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;
te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;
te[ 0 ] = ( n22 * t12 - n32 * t11 + n42 * t10 ) * detInv;
te[ 1 ] = ( n31 * t11 - n21 * t12 - n41 * t10 ) * detInv;
te[ 2 ] = ( n24 * t6 - n34 * t5 + n44 * t4 ) * detInv;
te[ 3 ] = ( n33 * t5 - n23 * t6 - n43 * t4 ) * detInv;

te[ 4 ] = t12 * detInv;
te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;
te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;
te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;
te[ 4 ] = ( n32 * t9 - n12 * t12 - n42 * t8 ) * detInv;
te[ 5 ] = ( n11 * t12 - n31 * t9 + n41 * t8 ) * detInv;
te[ 6 ] = ( n34 * t3 - n14 * t6 - n44 * t2 ) * detInv;
te[ 7 ] = ( n13 * t6 - n33 * t3 + n43 * t2 ) * detInv;

te[ 8 ] = t13 * detInv;
te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;
te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;
te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;
te[ 8 ] = ( n12 * t11 - n22 * t9 + n42 * t7 ) * detInv;
te[ 9 ] = ( n21 * t9 - n11 * t11 - n41 * t7 ) * detInv;
te[ 10 ] = ( n14 * t5 - n24 * t3 + n44 * t1 ) * detInv;
te[ 11 ] = ( n23 * t3 - n13 * t5 - n43 * t1 ) * detInv;

te[ 12 ] = t14 * detInv;
te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;
te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;
te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;
te[ 12 ] = ( n22 * t8 - n12 * t10 - n32 * t7 ) * detInv;
te[ 13 ] = ( n11 * t10 - n21 * t8 + n31 * t7 ) * detInv;
te[ 14 ] = ( n24 * t2 - n14 * t4 - n34 * t1 ) * detInv;
te[ 15 ] = ( n13 * t4 - n23 * t2 + n33 * t1 ) * detInv;

return this;

Expand Down Expand Up @@ -12481,7 +12489,9 @@ class Matrix4 {
position.y = te[ 13 ];
position.z = te[ 14 ];

if ( this.determinant() === 0 ) {
const det = this.determinant();

if ( det === 0 ) {

scale.set( 1, 1, 1 );
quaternion.identity();
Expand All @@ -12494,8 +12504,7 @@ class Matrix4 {
const sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();
const sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();

// if determine is negative, we need to invert one scale
const det = this.determinant();
// if determinant is negative, we need to invert one scale
if ( det < 0 ) sx = - sx;

// scale the rotation part
Expand Down Expand Up @@ -13931,7 +13940,7 @@ class Object3D extends EventDispatcher {
}

/**
* Converts the given vector from this 3D object's word space to local space.
* Converts the given vector from this 3D object's world space to local space.
*
* @param {Vector3} vector - The vector to convert.
* @return {Vector3} The converted vector.
Expand Down
63 changes: 36 additions & 27 deletions build/three.core.js
Original file line number Diff line number Diff line change
Expand Up @@ -12140,44 +12140,52 @@ class Matrix4 {
*/
invert() {

// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm
// based on https://github.com/toji/gl-matrix
const te = this.elements,

n11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],
n12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],
n13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],
n14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],

t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,
t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,
t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,
t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;

const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;
t1 = n11 * n22 - n21 * n12,
t2 = n11 * n32 - n31 * n12,
t3 = n11 * n42 - n41 * n12,
t4 = n21 * n32 - n31 * n22,
t5 = n21 * n42 - n41 * n22,
t6 = n31 * n42 - n41 * n32,
t7 = n13 * n24 - n23 * n14,
t8 = n13 * n34 - n33 * n14,
t9 = n13 * n44 - n43 * n14,
t10 = n23 * n34 - n33 * n24,
t11 = n23 * n44 - n43 * n24,
t12 = n33 * n44 - n43 * n34;

const det = t1 * t12 - t2 * t11 + t3 * t10 + t4 * t9 - t5 * t8 + t6 * t7;

if ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );

const detInv = 1 / det;

te[ 0 ] = t11 * detInv;
te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;
te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;
te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;
te[ 0 ] = ( n22 * t12 - n32 * t11 + n42 * t10 ) * detInv;
te[ 1 ] = ( n31 * t11 - n21 * t12 - n41 * t10 ) * detInv;
te[ 2 ] = ( n24 * t6 - n34 * t5 + n44 * t4 ) * detInv;
te[ 3 ] = ( n33 * t5 - n23 * t6 - n43 * t4 ) * detInv;

te[ 4 ] = t12 * detInv;
te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;
te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;
te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;
te[ 4 ] = ( n32 * t9 - n12 * t12 - n42 * t8 ) * detInv;
te[ 5 ] = ( n11 * t12 - n31 * t9 + n41 * t8 ) * detInv;
te[ 6 ] = ( n34 * t3 - n14 * t6 - n44 * t2 ) * detInv;
te[ 7 ] = ( n13 * t6 - n33 * t3 + n43 * t2 ) * detInv;

te[ 8 ] = t13 * detInv;
te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;
te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;
te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;
te[ 8 ] = ( n12 * t11 - n22 * t9 + n42 * t7 ) * detInv;
te[ 9 ] = ( n21 * t9 - n11 * t11 - n41 * t7 ) * detInv;
te[ 10 ] = ( n14 * t5 - n24 * t3 + n44 * t1 ) * detInv;
te[ 11 ] = ( n23 * t3 - n13 * t5 - n43 * t1 ) * detInv;

te[ 12 ] = t14 * detInv;
te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;
te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;
te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;
te[ 12 ] = ( n22 * t8 - n12 * t10 - n32 * t7 ) * detInv;
te[ 13 ] = ( n11 * t10 - n21 * t8 + n31 * t7 ) * detInv;
te[ 14 ] = ( n24 * t2 - n14 * t4 - n34 * t1 ) * detInv;
te[ 15 ] = ( n13 * t4 - n23 * t2 + n33 * t1 ) * detInv;

return this;

Expand Down Expand Up @@ -12479,7 +12487,9 @@ class Matrix4 {
position.y = te[ 13 ];
position.z = te[ 14 ];

if ( this.determinant() === 0 ) {
const det = this.determinant();

if ( det === 0 ) {

scale.set( 1, 1, 1 );
quaternion.identity();
Expand All @@ -12492,8 +12502,7 @@ class Matrix4 {
const sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();
const sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();

// if determine is negative, we need to invert one scale
const det = this.determinant();
// if determinant is negative, we need to invert one scale
if ( det < 0 ) sx = - sx;

// scale the rotation part
Expand Down Expand Up @@ -13929,7 +13938,7 @@ class Object3D extends EventDispatcher {
}

/**
* Converts the given vector from this 3D object's word space to local space.
* Converts the given vector from this 3D object's world space to local space.
*
* @param {Vector3} vector - The vector to convert.
* @return {Vector3} The converted vector.
Expand Down
2 changes: 1 addition & 1 deletion build/three.core.min.js

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions examples/jsm/loaders/GLTFLoader.js
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ import { clone } from '../utils/SkeletonUtils.js';
* - KHR_materials_unlit
* - KHR_materials_volume
* - KHR_mesh_quantization
* - KHR_meshopt_compression
* - KHR_lights_punctual
* - KHR_texture_basisu
* - KHR_texture_transform
Expand Down
60 changes: 34 additions & 26 deletions src/math/Matrix4.js
Original file line number Diff line number Diff line change
Expand Up @@ -707,44 +707,52 @@ class Matrix4 {
*/
invert() {

// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm
// based on https://github.com/toji/gl-matrix
const te = this.elements,

n11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],
n12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],
n13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],
n14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],

t11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,
t12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,
t13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,
t14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;

const det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;
t1 = n11 * n22 - n21 * n12,
t2 = n11 * n32 - n31 * n12,
t3 = n11 * n42 - n41 * n12,
t4 = n21 * n32 - n31 * n22,
t5 = n21 * n42 - n41 * n22,
t6 = n31 * n42 - n41 * n32,
t7 = n13 * n24 - n23 * n14,
t8 = n13 * n34 - n33 * n14,
t9 = n13 * n44 - n43 * n14,
t10 = n23 * n34 - n33 * n24,
t11 = n23 * n44 - n43 * n24,
t12 = n33 * n44 - n43 * n34;

const det = t1 * t12 - t2 * t11 + t3 * t10 + t4 * t9 - t5 * t8 + t6 * t7;

if ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );

const detInv = 1 / det;

te[ 0 ] = t11 * detInv;
te[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;
te[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;
te[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;

te[ 4 ] = t12 * detInv;
te[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;
te[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;
te[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;

te[ 8 ] = t13 * detInv;
te[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;
te[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;
te[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;

te[ 12 ] = t14 * detInv;
te[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;
te[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;
te[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;
te[ 0 ] = ( n22 * t12 - n32 * t11 + n42 * t10 ) * detInv;
te[ 1 ] = ( n31 * t11 - n21 * t12 - n41 * t10 ) * detInv;
te[ 2 ] = ( n24 * t6 - n34 * t5 + n44 * t4 ) * detInv;
te[ 3 ] = ( n33 * t5 - n23 * t6 - n43 * t4 ) * detInv;

te[ 4 ] = ( n32 * t9 - n12 * t12 - n42 * t8 ) * detInv;
te[ 5 ] = ( n11 * t12 - n31 * t9 + n41 * t8 ) * detInv;
te[ 6 ] = ( n34 * t3 - n14 * t6 - n44 * t2 ) * detInv;
te[ 7 ] = ( n13 * t6 - n33 * t3 + n43 * t2 ) * detInv;

te[ 8 ] = ( n12 * t11 - n22 * t9 + n42 * t7 ) * detInv;
te[ 9 ] = ( n21 * t9 - n11 * t11 - n41 * t7 ) * detInv;
te[ 10 ] = ( n14 * t5 - n24 * t3 + n44 * t1 ) * detInv;
te[ 11 ] = ( n23 * t3 - n13 * t5 - n43 * t1 ) * detInv;

te[ 12 ] = ( n22 * t8 - n12 * t10 - n32 * t7 ) * detInv;
te[ 13 ] = ( n11 * t10 - n21 * t8 + n31 * t7 ) * detInv;
te[ 14 ] = ( n24 * t2 - n14 * t4 - n34 * t1 ) * detInv;
te[ 15 ] = ( n13 * t4 - n23 * t2 + n33 * t1 ) * detInv;

return this;

Expand Down
Loading