Posicionamiento de entities

Cómo establecer la posición, rotación y escala de una entity en una escena

Puedes establecer la position, rotation y scale de cualquier entidad usando el Transform componente. Esto puede usarse en cualquier entidad en el espacio 3D, afectando dónde se renderiza la entidad. Esto incluye formas primitivas (cubo, esfera, plano, etc.), formas de texto 3D, formas NFT y modelos 3D (GltfContainer).

Usa el Scene Editor en Creator Hub

Al agregar un elemento a tu escena mediante el Scene Editor, implícitamente incluye un Transform componente. Entonces cambias los valores en el componente Transform de la entidad implícitamente cambiando la posición, rotación o escala de una entidad. También puedes usar la UI del Scene Editor para proporcionar valores numéricos con mayor precisión.

Conceptos básicos de código



Para mover, rotar o redimensionar una entidad en tu escena durante un periodo de tiempo, cambia los valores en este componente incrementalmente, cuadro por cuadro. Ver Mover entidadesarrow-up-right para más detalles y buenas prácticas.

circle-exclamation

Position

position es un vector 3D, establece la posición del centro de la entidad en los tres ejes, x, y, y z. Ver Tipos de geometríaarrow-up-right para más detalles.

Al establecer una posición, ten en cuenta las siguientes consideraciones:

  • Los números en un vector de posición representan metros (a menos que la entidad sea hija de una entidad escalada).

  • Una escena compuesta por un único parcel mide 16m x 16m. El centro de la escena (a nivel del suelo) está en x:8, y:0, z:8. Si la escena está compuesta por varios parcels, entonces el centro variará dependiendo de su disposición.

  • x:0, y:0, z:0 se refiere a la esquina suroeste de la parcela base de la escena, a nivel del suelo.

    Consejo: Al ver una vista previa de la escena, aparece una brújula en el punto (0,0,0) de la escena con etiquetas para cada eje como referencia.

    Nota: Puedes cambiar la parcela base de una escena editando el atributo base de scene.json.

  • Para orientarte mejor, usa tu left mano:

    • tu dedo índice (apuntando hacia adelante) es el z eje

    • tu dedo medio (apuntando hacia los lados) es el x eje

    • tu pulgar (apuntando hacia arriba) es el y eje.

  • Si una entidad es hija de otra, entonces x:0, y:0, z:0 se refiere al centro de su entidad padre, dondequiera que esté en la escena.

  • Cada entidad en tu escena debe estar posicionada dentro de los límites de los parcels que ocupa en todo momento. Si una entidad sale de estos límites, generará un error.

    Consejo: Al ver una escena en modo de vista previa, las entidades que están fuera de los límites se resaltan en red.

  • Tu escena también está limitada en altura. Cuantos más parcels conformen la escena, más alto se te permite construir. Ver limitaciones de la escenaarrow-up-right para más detalles.

Rotación

rotation se almacena como un quaternionarrow-up-right, un sistema de cuatro números, x, y, z y w. Cada uno de estos números va de 0 a 1. Ver Tipos de geometríaarrow-up-right para más detalles.

También puedes establecer el campo de rotación con Euler ángulosarrow-up-right, la notación más común x, y y z con números que van de 0 a 360 con la que la mayoría de la gente está familiarizada. Para usar ángulos Euler, utiliza una de las siguientes notaciones:

Al usar un vector 3D para representar ángulos Euler, x, y y z representan la rotación en ese eje, medida en grados. Una vuelta completa requiere 360 grados.

Cuando recuperas la rotación de una entidad, devuelve un quaternion por defecto. Para obtener la rotación expresada en ángulos Euler, usa .toEuler():

Obtener la posición y rotación global de una entidad

El getWorldPosition y getWorldRotation las funciones retornan la posición y rotación global de una entidad. Eso significa que devuelve la posición o rotación percibida que el jugador verá el elemento, ignorando cualquier jerarquía de padres.

  • getWorldPosition(engine, entity: Entity): Vector3Type: Esta función devuelve la posición World de una entidad, teniendo en consideración todas las posiciones de las entidades padres, si la entidad misma tiene alguna, devolviendo {x: 0, y: 0, z: 0} si la entidad no tiene Transform.

  • getWorldRotation(engine, entity: Entity): QuaternionType: Esta función devuelve la rotación World de una entidad, teniendo en consideración todas las rotaciones de las entidades padres, si la entidad misma tiene alguna. Devuelve un Quaternion tipo, devolviendo el quaternion identidad {x: 0, y: 0, z: 0, w: 1} si la entidad no tiene Transform.

circle-info

Nota: La posición global y la rotación global son relativas a las coordenadas dentro de la escena y no a Genesis City.

Mirar al jugador

Añadir un Billboard componente a una entidad para que siempre rote para mirar al jugador.

Los billboards eran una técnica común usada en los juegos 3D de los 90, donde la mayoría de las entidades eran planos 2D que siempre miraban al jugador. La misma idea también puede usarse para rotar un modelo 3D.

Puedes configurar cómo se comporta el billboard con los siguientes parámetros:

  • billboardMode: Usa un valor del BillboardMode para establecer su comportamiento:

    • BillboardMode.BM_ALL: La entidad rota para mirar al jugador en todos sus ejes de rotación. Si el jugador está muy por encima de la entidad, la entidad mirará hacia arriba.

    • BillboardMode.BM_NONE: La entidad no rotará en absoluto.

    • BillboardMode.BM_X: La entidad tiene su x eje de rotación fijado.

    • BillboardMode.BM_Y: La entidad tiene su y eje de rotación fijado. Solo rota a la izquierda y a la derecha, no hacia arriba y hacia abajo. Permanece perpendicular al suelo si el jugador está por encima o por debajo de la entidad.

    • BillboardMode.BM_Z: La entidad tiene su z eje de rotación fijado.

circle-info

💡 Tip: Los billboards son muy útiles para añadir a campo text entidades, ya que las hace siempre legibles.

El rotation el valor del Transform componente de la entidad no cambia a medida que el billboard sigue a los jugadores.

Si una entidad tiene tanto un Billboard componente y Transform componente con rotation valores, los jugadores verán la entidad rotando como un billboard. Si el billboard no afecta todos los ejes, los ejes restantes se rotarán según el Transform component.

circle-exclamation

Mirar a un conjunto de coordenadas

Para que la entidad A mire a la entidad B:

Escala

scale es también un vector 3D, almacenado como un Vector3 objeto, incluyendo el factor de escala en el x, y y z eje. La forma de la entidad se escala en consecuencia, ya sea que sea una primitiva o un modelo 3D.

La escala por defecto es 1, así que asigna un valor mayor que 1 para estirar una entidad o menor que 1 para reducirla.

Heredar transformaciones del padre

Cuando una entidad está anidada dentro de otra, las entidades hijas heredan componentes de los padres. Esto significa que si una entidad padre está posicionada, escalada o rotada, sus hijos también se ven afectados. Los valores de posición, rotación y escala de las entidades hijas no reemplazan los de los padres, sino que se combinan.

Asignas una entidad como padre de otra estableciendo el parent campo en el Transform component.

de la entidad hija.

En este ejemplo, la entidad hija se escalará a 0.5, ya que su padre tiene esa escala. La posición de la entidad hija también será relativa a su padre. Tenemos que sumar la posición del padre más la del hijo. En este caso, dado que el padre está escalado a la mitad de su tamaño, la transformación del hijo también se reduce proporcionalmente. En términos absolutos, el hijo está posicionado en { x: 3, y: 1.5, z: 1 }. Si el padre tuviera un rotation, esto también afectaría la posición final del hijo, ya que cambia el eje en el que el hijo se desplaza.

Si una entidad hija no tiene position en su Transform, el valor por defecto es 0,0,0, lo que la dejará posicionada en la misma posición que su padre.

Puedes usar una entidad invisible sin componente de forma como padre, para agrupar un conjunto de otras entidades. Esta entidad no será visible en la escena renderizada, pero puede usarse para agrupar a sus hijos y aplicarles un transform a todos.

Adjuntar una entidad a un avatar

Hay tres métodos para adjuntar una entidad al jugador:

  • Hazla hija de la a la Avatar Entity

  • Hazla hija de la a la Camera Entity

  • Usa la componente AvatarAttach

La forma más simple de adjuntar una entidad al avatar es establecer el padre como el reserved entityarrow-up-right engine.PlayerEntity. La entidad entonces se moverá junto con la posición del jugador.

También puedes configurar una entidad al reserved entityarrow-up-right engine.CameraEntity. Al usar la camera entity en primera persona, la entidad adjunta seguirá los movimientos de la cámara. Esto es ideal para mantener algo siempre a la vista, por ejemplo para mantener el modelo 3D de un arma siempre visible, incluso cuando la cámara apunte hacia arriba.

Para adjuntar un objeto a uno de los huesos del avatar, y hacer que se mueva junto con las animaciones del avatar, añade un AvatarAttach component a la entidad.

Puedes elegir diferentes puntos de anclaje en el avatar; la mayoría de estos puntos están vinculados al armature del jugador y siguen las animaciones del jugador. Por ejemplo, al usar el punto de anclaje de la mano derecha, la entidad adjunta se moverá cuando el avatar salude o balancee los brazos al correr, tal como si el jugador estuviera sosteniendo la entidad en su mano.

Al crear un AvatarAttach component, pasa un objeto con los siguientes datos:

  • avatarId: Opcional El ID del jugador al que adjuntarlo. Esto es el mismo que la dirección Ethereum del jugador, para aquellos jugadores conectados con una wallet de Ethereum. Si no se especifica, adjunta la entidad al avatar del jugador local.

  • anchorPointId: Qué punto de anclaje en el esqueleto del avatar usar para adjuntar la entidad, usando un valor del enum AvatarAnchorPointType.

circle-exclamation

El siguiente ejemplo coloca una entidad adjunta a un avatar en particular, para que todos los demás jugadores la vean adjunta a ese mismo avatar.

Los siguientes puntos de anclaje están disponibles en el AvatarAnchorPointType enum:

  • AAPT_RIGHT_HAND: Fijado en la mano derecha del jugador

  • AAPT_LEFT_HAND: Fijado en la mano izquierda del jugador

  • AAPT_HEAD: Fijado al centro de la cabeza del jugador.

  • AAPT_NECK: Fijado en la base del cuello del jugador.

  • AAPT_SPINE: Fijado en la sección superior de la columna vertebral.

  • AAPT_SPINE1: Fijado en la sección media de la columna vertebral.

  • AAPT_SPINE2: Fijado en la sección baja de la columna vertebral.

  • AAPT_HIP: Fijado al hueso de la cadera.

  • AAPT_LEFT_SHOULDER: Fijado al hombro izquierdo.

  • AAPT_LEFT_ARM: Fijado al primer hueso del brazo izquierdo, a la altura del hombro.

  • AAPT_LEFT_FOREARM: Fijado al hueso del antebrazo izquierdo.

  • AAPT_LEFT_HAND_INDEX: Fijado en la punta del dedo índice izquierdo.

  • AAPT_RIGHT_SHOULDER: Fijado al hombro derecho.

  • AAPT_RIGHT_ARM: Fijado al primer hueso del brazo derecho, a la altura del hombro.

  • AAPT_RIGHT_FOREARM: Fijado al hueso del antebrazo derecho.

  • AAPT_RIGHT_HAND_INDEX: Fijado en la punta del dedo índice derecho.

  • AAPT_LEFT_UP_LEG: Fijado al hueso superior de la pierna izquierda.

  • AAPT_LEFT_LEG: Fijado al hueso inferior de la pierna izquierda.

  • AAPT_LEFT_FOOT: Fijado al tobillo de la pierna izquierda.

  • AAPT_LEFT_TOE_BASE: Fijado en la punta del dedo del pie de la pierna izquierda.

  • AAPT_RIGHT_UP_LEG: Fijado al hueso superior de la pierna derecha.

  • AAPT_RIGHT_LEG: Fijado al hueso inferior de la pierna derecha.

  • AAPT_RIGHT_FOOT: Fijado al tobillo de la pierna derecha.

  • AAPT_RIGHT_TOE_BASE: Fijado en la punta del dedo del pie de la pierna derecha.

  • .AAPT_NAME_TAG: Flota justo encima del name tag del jugador, no se ve afectado por las animaciones del jugador.

    Nota: La altura del name tag se ajusta dinámicamente según la altura de los wearables que tenga un jugador. Por lo tanto, un jugador que lleve un sombrero alto tendrá su name tag un poco más alto que otros.

  • AAPT_POSITION DEPRECATED: La posición general del jugador. Esto aparece a una altura de 0.8 por encima de los pies del jugador.

circle-exclamation
circle-info

💡 Tip: Para usar estos valores, escribe AvatarAnchorPointType. y VS Code mostrará la lista completa de opciones en un desplegable.



El renderizado de entidades se determina localmente en cada instancia de la escena. Adjuntar una entidad a un jugador no hace que sea visible para otros jugadores que estén viendo a ese jugador. Si una entidad está adjunta al jugador local por defecto, cada jugador experimentará la entidad como adjunta a su propio avatar.

circle-exclamation

El AvatarAttach component sobrescribe los valores en el Transform component. Cualquier valor que pongas en el Transform component es reemplazado por la posición relativa de la entidad respecto a la del Transform del jugador; estos valores se actualizan cuadro por cuadro a medida que el jugador se mueve y anima.

Si necesitas posicionar una entidad con un offset desde el punto de anclaje en el avatar, o una rotación o escala diferente, hazlo mediante una entidad padre.

  1. Crea una entidad invisible con solo un Transform y un AvatarAttach component. Sus Transform valores serán sobrescritos a medida que el jugador se mueva

  2. Establece la entidad que quieres adjuntar como hija de este padre. Sus Transform valores pueden describir el offset desde el punto de anclaje.

circle-exclamation
circle-exclamation

Adjuntar a otros jugadores

Puedes usar el AvatarAttach component para adjuntar una entidad a otro jugador. Para hacer esto, debes conocer el id del jugador.

Para adjuntar una entidad al avatar de otro jugador, debes proporcionar el ID del usuario en el campo avatarId. Hay varias manerasarrow-up-right de obtener estos datos.

circle-exclamation

Obtén el userId para todos los demás jugadores cercanos vía getPlayer()

Usándolo junto con AvatarAttach, podrías usar el siguiente código para añadir un cubo flotando sobre la cabeza de cada otro jugador en la escena:

Ve otras formas de obtener los IDs de otros usuarios en Get Player Dataarrow-up-right.

Límites de la escena

Todas las entidades en tu escena deben caber dentro de los límites de la escena, ya que lo que esté fuera de esos límites son parcelas de tierra propiedad de otros jugadores.

Si alguna parte de tus modelos se extiende más allá de estos límites al ejecutar una preview, esas partes que se extiendan serán recortadas y no se renderizarán, tanto al ejecutar una preview como en la escena publicada.

La posición de las entidades en tu escena se comprueba constantemente mientras se mueven; si una entidad sale de la escena y luego vuelve, será eliminada y luego renderizada normalmente otra vez.

Una cuadrícula en el suelo de la escena muestra los límites de la escena, que por defecto van de 0 a 16 en el eje x y z y hasta 20 en el eje y . Puedes colocar entidades bajo tierra, por debajo de 0 en el y eje.

circle-info

💡 Tip: Si tu escena necesita más parcelas, puedes añadirlas en el archivo del proyecto scene.json . Ver Scene metadataarrow-up-right para las instrucciones. Una vez añadidas, deberías ver la cuadrícula extenderse para cubrir las parcelas adicionales.

Última actualización