AABB
Un cuadro delimitador 3D alineado con los ejes.
Descripción
El tipo Variant integrado AABB representa un cuadro delimitador alineado con el eje en un espacio 3D. Se define por su position y size, que son Vector3. Se utiliza con frecuencia para pruebas rápidas de superposición (véase intersects()). Aunque AABB está alineado con el eje, puede combinarse con Transform3D para representar un cuadro delimitador rotado o sesgado.
Utiliza coordenadas de punto flotante. La contraparte 2D de AABB es Rect2. No existe ninguna versión de AABB que utilice coordenadas enteras.
Nota: No se admiten valores negativos para size. Con un tamaño negativo, la mayoría de los métodos AABB no funcionan correctamente. Utiliza abs() para obtener un AABB equivalente con un tamaño no negativo.
Nota: En un contexto booleano, una AABB se evalúa como false si tanto la position como size son cero (igual a Vector3.ZERO). De lo contrario, siempre se evalúa como true.
Nota
Hay diferencias notables cuando usa esta API con C#. Véase Diferencias de la API de C# con GDScript para más información.
Tutoriales
Propiedades
|
||
|
||
|
Constructores
AABB() |
|
Métodos
abs() const |
|
get_center() const |
|
get_endpoint(idx: int) const |
|
get_longest_axis() const |
|
get_longest_axis_index() const |
|
get_longest_axis_size() const |
|
get_shortest_axis() const |
|
get_shortest_axis_index() const |
|
get_shortest_axis_size() const |
|
get_support(direction: Vector3) const |
|
get_volume() const |
|
has_surface() const |
|
has_volume() const |
|
intersection(with: AABB) const |
|
intersects(with: AABB) const |
|
intersects_plane(plane: Plane) const |
|
intersects_ray(from: Vector3, dir: Vector3) const |
|
intersects_segment(from: Vector3, to: Vector3) const |
|
is_equal_approx(aabb: AABB) const |
|
is_finite() const |
|
Operadores
operator !=(right: AABB) |
|
operator *(right: Transform3D) |
|
operator ==(right: AABB) |
Descripciones de Propiedades
Vector3 end = Vector3(0, 0, 0) 🔗
El punto final. Normalmente es la esquina en la parte superior derecha y posterior del cuadro delimitador, y es equivalente a position + size. Establecer este punto afecta al size.
Vector3 position = Vector3(0, 0, 0) 🔗
El punto de origen. Normalmente es la esquina en la parte inferior izquierda y frontal del cuadro delimitador.
Vector3 size = Vector3(0, 0, 0) 🔗
El ancho, la altura y la profundidad del cuadro delimitador, a partir de position. Establecer este valor también afecta al punto end.
Nota: Se recomienda establecer el ancho, la altura y la profundidad a valores no negativos. Esto se debe a que la mayoría de los métodos en Godot asumen que la position es la esquina inferior izquierda delantera, y el end es la esquina superior derecha trasera. Para obtener un cuadro delimitador equivalente con un tamaño no negativo, usa abs().
Descripciones de Constructores
Construye un AABB con su position y size establecidos a Vector3.ZERO.
Construye un AABB como una copia del AABB dado.
AABB AABB(position: Vector3, size: Vector3)
Construye un AABB con position y size.
Descripciones de Métodos
Devuelve un AABB equivalente a este cuadro delimitador, con su ancho, alto y profundidad modificados para ser valores no negativos.
var box = AABB(Vector3(5, 0, 5), Vector3(-20, -10, -5))
var absolute = box.abs()
print(absolute.position) # Imprime (-15.0, -10.0, 0.0)
print(absolute.size) # Imprime (20.0, 10.0, 5.0)
var box = new Aabb(new Vector3(5, 0, 5), new Vector3(-20, -10, -5));
var absolute = box.Abs();
GD.Print(absolute.Position); // Imprime (-15, -10, 0)
GD.Print(absolute.Size); // Imprime (20, 10, 5)
Nota: Se recomienda utilizar este método cuando size es negativo, ya que la mayoría de los otros métodos en Godot asumen que los componentes de size son mayores que 0.
bool encloses(with: AABB) const 🔗
Devuelve true si este cuadro delimitador encierra completamente la caja with. Se incluyen los bordes de ambas cajas.
var a = AABB(Vector3(0, 0, 0), Vector3(4, 4, 4))
var b = AABB(Vector3(1, 1, 1), Vector3(3, 3, 3))
var c = AABB(Vector3(2, 2, 2), Vector3(8, 8, 8))
print(a.encloses(a)) # Imprime true
print(a.encloses(b)) # Imprime true
print(a.encloses(c)) # Imprime false
var a = new Aabb(new Vector3(0, 0, 0), new Vector3(4, 4, 4));
var b = new Aabb(new Vector3(1, 1, 1), new Vector3(3, 3, 3));
var c = new Aabb(new Vector3(2, 2, 2), new Vector3(8, 8, 8));
GD.Print(a.Encloses(a)); // Imprime True
GD.Print(a.Encloses(b)); // Imprime True
GD.Print(a.Encloses(c)); // Imprime False
AABB expand(to_point: Vector3) const 🔗
Devuelve una copia de este cuadro delimitador expandida para alinear los bordes con el to_point dado, si es necesario.
var box = AABB(Vector3(0, 0, 0), Vector3(5, 2, 5))
box = box.expand(Vector3(10, 0, 0))
print(box.position) # Imprime (0.0, 0.0, 0.0)
print(box.size) # Imprime (10.0, 2.0, 5.0)
box = box.expand(Vector3(-5, 0, 5))
print(box.position) # Imprime (-5.0, 0.0, 0.0)
print(box.size) # Imprime (15.0, 2.0, 5.0)
var box = new Aabb(new Vector3(0, 0, 0), new Vector3(5, 2, 5));
box = box.Expand(new Vector3(10, 0, 0));
GD.Print(box.Position); // Imprime (0, 0, 0)
GD.Print(box.Size); // Imprime (10, 2, 5)
box = box.Expand(new Vector3(-5, 0, 5));
GD.Print(box.Position); // Imprime (-5, 0, 0)
GD.Print(box.Size); // Imprime (15, 2, 5)
Devuelve el punto central del cuadro delimitador. Esto es lo mismo que position + (size / 2.0).
Vector3 get_endpoint(idx: int) const 🔗
Devuelve la posición de uno de los 8 vértices que componen este cuadro delimitador. Con un idx de 0 esto es lo mismo que position, y un idx de 7 es lo mismo que end.
Vector3 get_longest_axis() const 🔗
Devuelve el eje normalizado más largo del size de este cuadro delimitador, como un Vector3 (Vector3.RIGHT, Vector3.UP o Vector3.BACK).
var box = AABB(Vector3(0, 0, 0), Vector3(2, 4, 8))
print(box.get_longest_axis()) # Imprime (0.0, 0.0, 1.0)
print(box.get_longest_axis_index()) # Imprime 2
print(box.get_longest_axis_size()) # Imprime 8.0
var box = new Aabb(new Vector3(0, 0, 0), new Vector3(2, 4, 8));
GD.Print(box.GetLongestAxis()); // Imprime (0, 0, 1)
GD.Print(box.GetLongestAxisIndex()); // Imprime Z
GD.Print(box.GetLongestAxisSize()); // Imprime 8
Véase también get_longest_axis_index() y get_longest_axis_size().
int get_longest_axis_index() const 🔗
Devuelve el índice del eje más largo del size de este cuadro delimitador (ver Vector3.AXIS_X, Vector3.AXIS_Y y Vector3.AXIS_Z).
Para ver un ejemplo, véase get_longest_axis().
float get_longest_axis_size() const 🔗
Devuelve la dimensión más larga del size de este cuadro delimitador.
Para un ejemplo, véase get_longest_axis().
Vector3 get_shortest_axis() const 🔗
Devuelve el eje normalizado más corto del size de este cuadro delimitador, como un Vector3 (Vector3.RIGHT, Vector3.UP o Vector3.BACK).
var box = AABB(Vector3(0, 0, 0), Vector3(2, 4, 8))
print(box.get_shortest_axis()) # Imprime (1.0, 0.0, 0.0)
print(box.get_shortest_axis_index()) # Imprime 0
print(box.get_shortest_axis_size()) # Imprime 2.0
var box = new Aabb(new Vector3(0, 0, 0), new Vector3(2, 4, 8));
GD.Print(box.GetShortestAxis()); // Imprime (1, 0, 0)
GD.Print(box.GetShortestAxisIndex()); // Imprime X
GD.Print(box.GetShortestAxisSize()); // Imprime 2
Véase también get_shortest_axis_index() y get_shortest_axis_size().
int get_shortest_axis_index() const 🔗
Devuelve el índice del eje más corto del size de este cuadro delimitador (ver Vector3.AXIS_X, Vector3.AXIS_Y y Vector3.AXIS_Z).
Para ver un ejemplo, véase get_shortest_axis().
float get_shortest_axis_size() const 🔗
Devuelve la dimensión más corta del size de este cuadro delimitador.
Para un ejemplo, véase get_shortest_axis().
Vector3 get_support(direction: Vector3) const 🔗
Devuelve la posición del vértice de este cuadro delimitador que está más lejos en la dirección dada. Este punto se conoce comúnmente como el punto de soporte en los algoritmos de detección de colisiones.
Devuelve el volumen del cuadro delimitador. Esto es equivalente a size.x * size.y * size.z. Véase también has_volume().
Returns a copy of this bounding box extended on all sides by the given amount by. A negative amount shrinks the box instead.
var a = AABB(Vector3(4, 4, 4), Vector3(8, 8, 8)).grow(4)
print(a.position) # Prints (0.0, 0.0, 0.0)
print(a.size) # Prints (16.0, 16.0, 16.0)
var b = AABB(Vector3(0, 0, 0), Vector3(8, 4, 2)).grow(2)
print(b.position) # Prints (-2.0, -2.0, -2.0)
print(b.size) # Prints (12.0, 8.0, 6.0)
var a = new Aabb(new Vector3(4, 4, 4), new Vector3(8, 8, 8)).Grow(4);
GD.Print(a.Position); // Prints (0, 0, 0)
GD.Print(a.Size); // Prints (16, 16, 16)
var b = new Aabb(new Vector3(0, 0, 0), new Vector3(8, 4, 2)).Grow(2);
GD.Print(b.Position); // Prints (-2, -2, -2)
GD.Print(b.Size); // Prints (12, 8, 6)
bool has_point(point: Vector3) const 🔗
Devuelve true si el cuadro delimitador contiene el point dado. Por convención, los puntos exactamente en los lados derecho, superior y frontal no se incluyen.
Nota: Este método no es fiable para AABB con un size negativo. Utiliza abs() primero para obtener un cuadro delimitador válido.
Devuelve true si este cuadro delimitador tiene una superficie o una longitud, es decir, al menos un componente de size es mayor que 0. De lo contrario, devuelve false.
Devuelve true si el ancho, la altura y la profundidad de este cuadro delimitador son todos positivos. Véase también get_volume().
AABB intersection(with: AABB) const 🔗
Devuelve la intersección entre este cuadro delimitador y with. Si los cuadros no se intersecan, devuelve un AABB vacío. Si los cuadros se intersecan en el borde, devuelve un AABB plano sin volumen (véase has_surface() y has_volume()).
var box1 = AABB(Vector3(0, 0, 0), Vector3(5, 2, 8))
var box2 = AABB(Vector3(2, 0, 2), Vector3(8, 4, 4))
var intersection = box1.intersection(box2)
print(intersection.position) # Imprime (2.0, 0.0, 2.0)
print(intersection.size) # Imprime (3.0, 2.0, 4.0)
var box1 = new Aabb(new Vector3(0, 0, 0), new Vector3(5, 2, 8));
var box2 = new Aabb(new Vector3(2, 0, 2), new Vector3(8, 4, 4));
var intersection = box1.Intersection(box2);
GD.Print(intersection.Position); // Imprime (2, 0, 2)
GD.Print(intersection.Size); // Imprime (3, 2, 4)
Nota: Si solo necesita saber si dos cuadros delimitadores se están intersecando, use intersects() en su lugar.
bool intersects(with: AABB) const 🔗
Devuelve true si este cuadro delimitador se superpone con el cuadro with. Los bordes de ambas cajas están siempre excluidos.
bool intersects_plane(plane: Plane) const 🔗
Devuelve true si este cuadro delimitador está en ambos lados del plane dado.
Variant intersects_ray(from: Vector3, dir: Vector3) const 🔗
Devuelve el primer punto donde este cuadro delimitador y el rayo dado se intersecan, como un Vector3. Si no se produce ninguna intersección, devuelve null.
El rayo comienza en from, apunta hacia dir y se extiende hacia el infinito.
Variant intersects_segment(from: Vector3, to: Vector3) const 🔗
Devuelve el primer punto donde este cuadro delimitador y el segmento dado se intersecan, como un Vector3. Si no se produce ninguna intersección, devuelve null.
El segmento comienza en from y termina en to.
bool is_equal_approx(aabb: AABB) const 🔗
Devuelve true si este cuadro delimitador y aabb son aproximadamente iguales, llamando a Vector3.is_equal_approx() en position y size.
Devuelve true si los valores de este cuadro delimitador son finitos, llamando a Vector3.is_finite() en el position y el size.
AABB merge(with: AABB) const 🔗
Devuelve un AABB que engloba tanto este cuadro delimitador como with alrededor de los bordes. Véase también encloses().
Descripciones de Operadores
bool operator !=(right: AABB) 🔗
Devuelve true si la position o el size de ambos cuadros delimitadores no son iguales.
Nota: Debido a los errores de precisión de punto flotante, considera usar is_equal_approx() en su lugar, que es más fiable.
AABB operator *(right: Transform3D) 🔗
Transforma inversamente (multiplica) el AABB por la matriz de transformación Transform3D dada, bajo la suposición de que la base de transformación es ortonormal (es decir, la rotación/reflexión está bien, la escala/el sesgo no lo están).
aabb * transform es equivalente a transform.inverse() * aabb. Véase Transform3D.inverse().
Para transformar por la inversa de una transformación afín (por ejemplo, con escalado), se puede utilizar transform.affine_inverse() * aabb en su lugar. Véase Transform3D.affine_inverse().
bool operator ==(right: AABB) 🔗
Devuelve true si tanto la position como el size de los cuadros delimitadores son exactamente iguales, respectivamente.
Nota: Debido a los errores de precisión de punto flotante, considera usar is_equal_approx() en su lugar, que es más fiable.