2017-09-12 22:42:36 +02:00
<?xml version="1.0" encoding="UTF-8" ?>
2023-07-06 10:08:05 +02:00
<class name= "Basis" xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "../class.xsd" >
2017-09-12 22:42:36 +02:00
<brief_description >
2023-04-28 01:35:33 +02:00
A 3× 3 matrix for representing 3D rotation and scale.
2017-09-12 22:42:36 +02:00
</brief_description>
<description >
2023-04-28 01:35:33 +02:00
A 3× 3 matrix used for representing 3D rotation and scale. Usually used as an orthogonal basis for a [Transform3D].
2020-07-21 20:07:00 +02:00
Contains 3 vector fields X, Y and Z as its columns, which are typically interpreted as the local basis vectors of a transformation. For such use, it is composed of a scaling and a rotation matrix, in that order (M = R.S).
2023-04-28 01:35:33 +02:00
Basis can also be accessed as an array of 3D vectors. These vectors are usually orthogonal to each other, but are not necessarily normalized (due to scaling).
2023-12-31 14:04:38 +01:00
For a general introduction, see the [url=$DOCS_URL/tutorials/math/matrices_and_transforms.html]Matrices and transforms[/url] tutorial.
2017-09-12 22:42:36 +02:00
</description>
<tutorials >
2021-11-15 10:43:07 +01:00
<link title= "Math documentation index" > $DOCS_URL/tutorials/math/index.html</link>
<link title= "Matrices and transforms" > $DOCS_URL/tutorials/math/matrices_and_transforms.html</link>
<link title= "Using 3D transforms" > $DOCS_URL/tutorials/3d/using_transforms.html</link>
2020-10-01 10:34:47 +02:00
<link title= "Matrix Transform Demo" > https://godotengine.org/asset-library/asset/584</link>
<link title= "3D Platformer Demo" > https://godotengine.org/asset-library/asset/125</link>
<link title= "3D Voxel Demo" > https://godotengine.org/asset-library/asset/676</link>
<link title= "2.5D Demo" > https://godotengine.org/asset-library/asset/583</link>
2017-09-12 22:42:36 +02:00
</tutorials>
2021-09-21 04:49:02 +02:00
<constructors >
<constructor name= "Basis" >
2021-07-30 15:28:05 +02:00
<return type= "Basis" />
2017-09-12 22:42:36 +02:00
<description >
2020-11-09 17:46:03 +01:00
Constructs a default-initialized [Basis] set to [constant IDENTITY].
2017-09-12 22:42:36 +02:00
</description>
2021-09-21 04:49:02 +02:00
</constructor>
<constructor name= "Basis" >
2021-07-30 15:28:05 +02:00
<return type= "Basis" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "from" type= "Basis" />
2017-09-12 22:42:36 +02:00
<description >
2020-11-09 17:46:03 +01:00
Constructs a [Basis] as a copy of the given [Basis].
2017-09-12 22:42:36 +02:00
</description>
2021-09-21 04:49:02 +02:00
</constructor>
<constructor name= "Basis" >
2021-07-30 15:28:05 +02:00
<return type= "Basis" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "axis" type= "Vector3" />
<param index= "1" name= "angle" type= "float" />
2017-09-12 22:42:36 +02:00
<description >
2022-08-12 19:13:27 +02:00
Constructs a pure rotation basis matrix, rotated around the given [param axis] by [param angle] (in radians). The axis must be a normalized vector.
2017-09-12 22:42:36 +02:00
</description>
2021-09-21 04:49:02 +02:00
</constructor>
<constructor name= "Basis" >
2021-07-30 15:28:05 +02:00
<return type= "Basis" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "from" type= "Quaternion" />
2020-11-09 17:46:03 +01:00
<description >
Constructs a pure rotation basis matrix from the given quaternion.
</description>
2021-09-21 04:49:02 +02:00
</constructor>
<constructor name= "Basis" >
2021-07-30 15:28:05 +02:00
<return type= "Basis" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "x_axis" type= "Vector3" />
<param index= "1" name= "y_axis" type= "Vector3" />
<param index= "2" name= "z_axis" type= "Vector3" />
2017-09-12 22:42:36 +02:00
<description >
2020-07-21 20:07:00 +02:00
Constructs a basis matrix from 3 axis vectors (matrix columns).
2017-09-12 22:42:36 +02:00
</description>
2021-09-21 04:49:02 +02:00
</constructor>
</constructors>
<methods >
2021-03-18 14:44:42 +01:00
<method name= "determinant" qualifiers= "const" >
2021-07-30 15:28:05 +02:00
<return type= "float" />
2017-09-12 22:42:36 +02:00
<description >
2020-07-21 20:07:00 +02:00
Returns the determinant of the basis matrix. If the basis is uniformly scaled, its determinant is the square of the scale.
A negative determinant means the basis has a negative scale. A zero determinant means the basis isn't invertible, and is usually considered invalid.
2017-09-12 22:42:36 +02:00
</description>
</method>
2021-10-21 18:38:20 +02:00
<method name= "from_euler" qualifiers= "static" >
<return type= "Basis" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "euler" type= "Vector3" />
<param index= "1" name= "order" type= "int" default= "2" />
2021-10-21 18:38:20 +02:00
<description >
2022-10-02 04:53:12 +02:00
Constructs a pure rotation Basis matrix from Euler angles in the specified Euler rotation order. By default, use YXZ order (most common). See the [enum EulerOrder] enum for possible values.
2023-12-31 12:00:50 +01:00
[codeblock]
# Creates a Basis whose z axis points down.
var my_basis = Basis.from_euler(Vector3(TAU / 4, 0, 0))
print(my_basis.z) # Prints (0, -1, 0).
[/codeblock]
2021-10-21 18:38:20 +02:00
</description>
</method>
2021-09-06 22:39:01 +02:00
<method name= "from_scale" qualifiers= "static" >
<return type= "Basis" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "scale" type= "Vector3" />
2021-09-06 22:39:01 +02:00
<description >
Constructs a pure scale basis matrix with no rotation or shearing. The scale values are set as the diagonal of the matrix, and the other parts of the matrix are zero.
2023-12-31 12:00:50 +01:00
[codeblock]
var my_basis = Basis.from_scale(Vector3(2, 4, 8))
print(my_basis.x) # Prints (2, 0, 0).
print(my_basis.y) # Prints (0, 4, 0).
print(my_basis.z) # Prints (0, 0, 8).
[/codeblock]
2021-09-06 22:39:01 +02:00
</description>
</method>
2021-03-18 14:44:42 +01:00
<method name= "get_euler" qualifiers= "const" >
2021-07-30 15:28:05 +02:00
<return type= "Vector3" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "order" type= "int" default= "2" />
2017-09-12 22:42:36 +02:00
<description >
2022-09-24 19:15:02 +02:00
Returns the basis's rotation in the form of Euler angles. The Euler order depends on the [param order] parameter, by default it uses the YXZ convention: when decomposing, first Z, then X, and Y last. The returned vector contains the rotation angles in the format (X angle, Y angle, Z angle).
2021-01-20 08:02:02 +01:00
Consider using the [method get_rotation_quaternion] method instead, which returns a [Quaternion] quaternion instead of Euler angles.
2017-09-12 22:42:36 +02:00
</description>
</method>
2021-01-20 08:02:02 +01:00
<method name= "get_rotation_quaternion" qualifiers= "const" >
2021-07-30 15:28:05 +02:00
<return type= "Quaternion" />
2019-04-15 14:49:41 +02:00
<description >
2019-12-03 17:09:26 +01:00
Returns the basis's rotation in the form of a quaternion. See [method get_euler] if you need Euler angles, but keep in mind quaternions should generally be preferred to Euler angles.
2019-04-15 14:49:41 +02:00
</description>
</method>
2021-03-18 14:44:42 +01:00
<method name= "get_scale" qualifiers= "const" >
2021-07-30 15:28:05 +02:00
<return type= "Vector3" />
2017-09-12 22:42:36 +02:00
<description >
Assuming that the matrix is the combination of a rotation and scaling, return the absolute value of scaling factors along each axis.
2023-12-31 12:00:50 +01:00
[codeblock]
var my_basis = Basis(
Vector3(2, 0, 0),
Vector3(0, 4, 0),
Vector3(0, 0, 8)
)
# Rotating the Basis in any way preserves its scale.
my_basis = my_basis.rotated(Vector3.UP, TAU / 2)
my_basis = my_basis.rotated(Vector3.RIGHT, TAU / 4)
print(my_basis.get_scale()) # Prints (2, 4, 8).
[/codeblock]
2017-09-12 22:42:36 +02:00
</description>
</method>
2021-03-18 14:44:42 +01:00
<method name= "inverse" qualifiers= "const" >
2021-07-30 15:28:05 +02:00
<return type= "Basis" />
2017-09-12 22:42:36 +02:00
<description >
2019-05-24 04:15:43 +02:00
Returns the inverse of the matrix.
2017-09-12 22:42:36 +02:00
</description>
</method>
2023-09-07 16:43:22 +02:00
<method name= "is_conformal" qualifiers= "const" >
<return type= "bool" />
<description >
Returns [code]true[/code] if the basis is conformal, meaning it preserves angles and distance ratios, and may only be composed of rotation and uniform scale. Returns [code]false[/code] if the basis has non-uniform scale or shear/skew. This can be used to validate if the basis is non-distorted, which is important for physics and other use cases.
</description>
</method>
2021-03-18 14:44:42 +01:00
<method name= "is_equal_approx" qualifiers= "const" >
2021-07-30 15:28:05 +02:00
<return type= "bool" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "b" type= "Basis" />
2019-04-15 14:49:41 +02:00
<description >
2023-04-28 01:35:33 +02:00
Returns [code]true[/code] if this basis and [param b] are approximately equal, by calling [method @GlobalScope.is_equal_approx] on all vector components.
2019-04-15 14:49:41 +02:00
</description>
</method>
2022-08-11 10:12:27 +02:00
<method name= "is_finite" qualifiers= "const" >
<return type= "bool" />
<description >
2023-04-28 01:35:33 +02:00
Returns [code]true[/code] if this basis is finite, by calling [method @GlobalScope.is_finite] on all vector components.
2022-08-11 10:12:27 +02:00
</description>
</method>
2021-07-21 05:32:00 +02:00
<method name= "looking_at" qualifiers= "static" >
<return type= "Basis" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "target" type= "Vector3" />
<param index= "1" name= "up" type= "Vector3" default= "Vector3(0, 1, 0)" />
2023-04-15 10:01:43 +02:00
<param index= "2" name= "use_model_front" type= "bool" default= "false" />
2021-07-21 05:32:00 +02:00
<description >
2022-08-12 19:13:27 +02:00
Creates a Basis with a rotation such that the forward axis (-Z) points towards the [param target] position.
The up axis (+Y) points as close to the [param up] vector as possible while staying perpendicular to the forward axis. The resulting Basis is orthonormalized. The [param target] and [param up] vectors cannot be zero, and cannot be parallel to each other.
2023-02-07 18:48:33 +01:00
If [param use_model_front] is [code]true[/code], the +Z axis (asset front) is treated as forward (implies +X is left) and points toward the [param target] position. By default, the -Z axis (camera forward) is treated as forward (implies +X is right).
2021-07-21 05:32:00 +02:00
</description>
</method>
2021-03-18 14:44:42 +01:00
<method name= "orthonormalized" qualifiers= "const" >
2021-07-30 15:28:05 +02:00
<return type= "Basis" />
2017-09-12 22:42:36 +02:00
<description >
2019-05-24 04:15:43 +02:00
Returns the orthonormalized version of the matrix (useful to call from time to time to avoid rounding error for orthogonal matrices). This performs a Gram-Schmidt orthonormalization on the basis of the matrix.
2023-12-31 12:00:50 +01:00
[codeblock]
# Rotate this Node3D every frame.
func _process(delta):
basis = basis.rotated(Vector3.UP, TAU * delta)
basis = basis.rotated(Vector3.RIGHT, TAU * delta)
basis = basis.orthonormalized()
[/codeblock]
2017-09-12 22:42:36 +02:00
</description>
</method>
2021-03-18 14:44:42 +01:00
<method name= "rotated" qualifiers= "const" >
2021-07-30 15:28:05 +02:00
<return type= "Basis" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "axis" type= "Vector3" />
<param index= "1" name= "angle" type= "float" />
2017-09-12 22:42:36 +02:00
<description >
2022-08-12 19:13:27 +02:00
Introduce an additional rotation around the given axis by [param angle] (in radians). The axis must be a normalized vector.
2023-12-31 12:00:50 +01:00
[codeblock]
var my_basis = Basis.IDENTITY
var angle = TAU / 2
my_basis = my_basis.rotated(Vector3.UP, angle) # Rotate around the up axis (yaw)
my_basis = my_basis.rotated(Vector3.RIGHT, angle) # Rotate around the right axis (pitch)
my_basis = my_basis.rotated(Vector3.BACK, angle) # Rotate around the back axis (roll)
[/codeblock]
2017-09-12 22:42:36 +02:00
</description>
</method>
2021-03-18 14:44:42 +01:00
<method name= "scaled" qualifiers= "const" >
2021-07-30 15:28:05 +02:00
<return type= "Basis" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "scale" type= "Vector3" />
2017-09-12 22:42:36 +02:00
<description >
2018-05-12 02:14:39 +02:00
Introduce an additional scaling specified by the given 3D scaling factor.
2023-12-31 12:00:50 +01:00
[codeblock]
var my_basis = Basis(
Vector3(1, 1, 1),
Vector3(2, 2, 2),
Vector3(3, 3, 3)
)
my_basis = my_basis.scaled(Vector3(0, 2, -2))
print(my_basis.x) # Prints (0, 2, -2).
print(my_basis.y) # Prints (0, 4, -4).
print(my_basis.z) # Prints (0, 6, -6).
[/codeblock]
2018-05-12 02:14:39 +02:00
</description>
</method>
2021-03-18 14:44:42 +01:00
<method name= "slerp" qualifiers= "const" >
2021-07-30 15:28:05 +02:00
<return type= "Basis" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "to" type= "Basis" />
<param index= "1" name= "weight" type= "float" />
2018-05-12 02:14:39 +02:00
<description >
Assuming that the matrix is a proper rotation matrix, slerp performs a spherical-linear interpolation with another rotation matrix.
2017-09-12 22:42:36 +02:00
</description>
</method>
2021-03-18 14:44:42 +01:00
<method name= "tdotx" qualifiers= "const" >
2021-07-30 15:28:05 +02:00
<return type= "float" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "with" type= "Vector3" />
2017-09-12 22:42:36 +02:00
<description >
2019-06-22 01:04:47 +02:00
Transposed dot product with the X axis of the matrix.
2017-09-12 22:42:36 +02:00
</description>
</method>
2021-03-18 14:44:42 +01:00
<method name= "tdoty" qualifiers= "const" >
2021-07-30 15:28:05 +02:00
<return type= "float" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "with" type= "Vector3" />
2017-09-12 22:42:36 +02:00
<description >
2019-06-22 01:04:47 +02:00
Transposed dot product with the Y axis of the matrix.
2017-09-12 22:42:36 +02:00
</description>
</method>
2021-03-18 14:44:42 +01:00
<method name= "tdotz" qualifiers= "const" >
2021-07-30 15:28:05 +02:00
<return type= "float" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "with" type= "Vector3" />
2017-09-12 22:42:36 +02:00
<description >
2019-06-22 01:04:47 +02:00
Transposed dot product with the Z axis of the matrix.
2017-09-12 22:42:36 +02:00
</description>
</method>
2021-03-18 14:44:42 +01:00
<method name= "transposed" qualifiers= "const" >
2021-07-30 15:28:05 +02:00
<return type= "Basis" />
2017-09-12 22:42:36 +02:00
<description >
2019-05-24 04:15:43 +02:00
Returns the transposed version of the matrix.
2023-12-31 12:00:50 +01:00
[codeblock]
var my_basis = Basis(
Vector3(1, 2, 3),
Vector3(4, 5, 6),
Vector3(7, 8, 9)
)
my_basis = my_basis.transposed()
print(my_basis.x) # Prints (1, 4, 7).
print(my_basis.y) # Prints (2, 5, 8).
print(my_basis.z) # Prints (3, 6, 9).
[/codeblock]
2017-09-12 22:42:36 +02:00
</description>
</method>
</methods>
<members >
2019-09-24 19:45:03 +02:00
<member name= "x" type= "Vector3" setter= "" getter= "" default= "Vector3(1, 0, 0)" >
2020-07-21 20:07:00 +02:00
The basis matrix's X vector (column 0). Equivalent to array index [code]0[/code].
2017-09-12 22:42:36 +02:00
</member>
2019-09-24 19:45:03 +02:00
<member name= "y" type= "Vector3" setter= "" getter= "" default= "Vector3(0, 1, 0)" >
2020-07-21 20:07:00 +02:00
The basis matrix's Y vector (column 1). Equivalent to array index [code]1[/code].
2017-09-12 22:42:36 +02:00
</member>
2019-09-24 19:45:03 +02:00
<member name= "z" type= "Vector3" setter= "" getter= "" default= "Vector3(0, 0, 1)" >
2020-07-21 20:07:00 +02:00
The basis matrix's Z vector (column 2). Equivalent to array index [code]2[/code].
2017-09-12 22:42:36 +02:00
</member>
</members>
<constants >
2019-09-24 19:45:03 +02:00
<constant name= "IDENTITY" value= "Basis(1, 0, 0, 0, 1, 0, 0, 0, 1)" >
2020-07-21 20:07:00 +02:00
The identity basis, with no rotation or scaling applied.
2023-10-02 20:11:43 +02:00
This is identical to creating [constructor Basis] without any parameters. This constant can be used to make your code clearer, and for consistency with C#.
2019-08-13 12:35:50 +02:00
</constant>
2019-09-24 19:45:03 +02:00
<constant name= "FLIP_X" value= "Basis(-1, 0, 0, 0, 1, 0, 0, 0, 1)" >
2019-12-03 17:09:26 +01:00
The basis that will flip something along the X axis when used in a transformation.
2019-08-13 12:35:50 +02:00
</constant>
2019-09-24 19:45:03 +02:00
<constant name= "FLIP_Y" value= "Basis(1, 0, 0, 0, -1, 0, 0, 0, 1)" >
2019-12-03 17:09:26 +01:00
The basis that will flip something along the Y axis when used in a transformation.
2019-08-13 12:35:50 +02:00
</constant>
2019-09-24 19:45:03 +02:00
<constant name= "FLIP_Z" value= "Basis(1, 0, 0, 0, 1, 0, 0, 0, -1)" >
2019-12-03 17:09:26 +01:00
The basis that will flip something along the Z axis when used in a transformation.
2019-08-13 12:35:50 +02:00
</constant>
2017-09-12 22:42:36 +02:00
</constants>
2021-09-21 04:49:02 +02:00
<operators >
<operator name= "operator !=" >
<return type= "bool" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "right" type= "Basis" />
2021-09-21 04:49:02 +02:00
<description >
2021-11-04 16:58:20 +01:00
Returns [code]true[/code] if the [Basis] matrices are not equal.
[b]Note:[/b] Due to floating-point precision errors, consider using [method is_equal_approx] instead, which is more reliable.
2021-09-21 04:49:02 +02:00
</description>
</operator>
<operator name= "operator *" >
<return type= "Basis" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "right" type= "Basis" />
2021-09-21 04:49:02 +02:00
<description >
2021-11-04 16:58:20 +01:00
Composes these two basis matrices by multiplying them together. This has the effect of transforming the second basis (the child) by the first basis (the parent).
2021-09-21 04:49:02 +02:00
</description>
</operator>
<operator name= "operator *" >
<return type= "Vector3" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "right" type= "Vector3" />
2021-09-21 04:49:02 +02:00
<description >
2021-11-04 16:58:20 +01:00
Transforms (multiplies) the [Vector3] by the given [Basis] matrix.
2021-09-21 04:49:02 +02:00
</description>
</operator>
<operator name= "operator *" >
<return type= "Basis" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "right" type= "float" />
2021-09-21 04:49:02 +02:00
<description >
This operator multiplies all components of the [Basis], which scales it uniformly.
</description>
</operator>
<operator name= "operator *" >
<return type= "Basis" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "right" type= "int" />
2021-09-21 04:49:02 +02:00
<description >
This operator multiplies all components of the [Basis], which scales it uniformly.
</description>
</operator>
2023-12-20 17:42:39 +01:00
<operator name= "operator /" >
<return type= "Basis" />
<param index= "0" name= "right" type= "float" />
<description >
This operator divides all components of the [Basis], which inversely scales it uniformly.
</description>
</operator>
<operator name= "operator /" >
<return type= "Basis" />
<param index= "0" name= "right" type= "int" />
<description >
This operator divides all components of the [Basis], which inversely scales it uniformly.
</description>
</operator>
2021-09-21 04:49:02 +02:00
<operator name= "operator ==" >
<return type= "bool" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "right" type= "Basis" />
2021-09-21 04:49:02 +02:00
<description >
2021-11-04 16:58:20 +01:00
Returns [code]true[/code] if the [Basis] matrices are exactly equal.
[b]Note:[/b] Due to floating-point precision errors, consider using [method is_equal_approx] instead, which is more reliable.
2021-09-21 04:49:02 +02:00
</description>
</operator>
<operator name= "operator []" >
<return type= "Vector3" />
2022-08-06 20:11:48 +02:00
<param index= "0" name= "index" type= "int" />
2021-09-21 04:49:02 +02:00
<description >
2021-11-04 16:58:20 +01:00
Access basis components using their index. [code]b[0][/code] is equivalent to [code]b.x[/code], [code]b[1][/code] is equivalent to [code]b.y[/code], and [code]b[2][/code] is equivalent to [code]b.z[/code].
2021-09-21 04:49:02 +02:00
</description>
</operator>
</operators>
2017-09-12 22:42:36 +02:00
</class>