En cuanto a cuerpos físicos 3D, no hay demasiada diferencia con los cuerpos físicos para el 2D. Quizás la diferencia más importante es que existe un tipo extra de cuerpo, llamado PhysicalBone3D.
PhysicalBone3D y Skeletons
El PhysicalBone3D serviría para crear huesos y armar nuestro personaje o Skeleton en base a esto, lo cual permitirá incluso animarlo. De todas formas, hay que tener en cuenta que la mayoría opta y prefieren riggear y armar las animaciones fuera del engine, y luego importar todo hecho.
No entraré en detalle ya que es un tema que no comprende lo básico, sino algo más complejo. Sin embargo, puedo decirte que el PhysicalBone3D
posee propiedades físicas, tales como un cuerpo rígido (mass, friction, bounce), pero además va uniendo muchos de estos para conformar nuestro Skeleton o esqueleto. Así que de alguna forma tienen que unirse, y esto lo podemos hacer a través de una suerte de resortes o Joints, que incluso están disponibles para el 2D. Por ello es que disponemos de la propiedad Joint, para especificar incluso el tipo de resorte que vamos a utilizar.
Recordemos que un conjunto de estos PhysicalBone3D
, conformarán la jerarquía de un Skeleton3D. Como se ve en la imagen también existe un tipo de SkeletonIK3D, lo cual nos permite rotar haciendo uso del sistema de IK (Inverse Kinematics). Todo esto ya entraría en un campo de conocimiento medio-avanzado.
Lo importante a hacer hincapié aquí, es que el resto de los cuerpos maneja la física de una forma similar a la que ya vimos, y que en el caso de Skeletons, lo ideal de momento es acudir a diseñarlo e importarlo desde afuera del engine.
Movimiento en 3D
Entonces, para mover tanto CharacterBody3D
como RigidBody3D
, vamos a utilizar los mismos métodos que utilizábamos para el 2D:
- En el caso de
RigidBody3D
, aplicando una fuerza o impulso directo. - En el
CharacterBody3D
, apelando al uso de la propiedad de velocidad ymove_and_slide
omove_and_collide
.
Lo bueno del script de ejemplo que incluye al crearse sobre un CharacterBody3D
, vemos cómo respeta la dirección de nuestro objeto, permitiéndonos hacer un movimiento hacia adelante (forward) gracias a que considera cuál es la cara hacia arriba o hacia donde incrementa nuestro eje Y (up). Por lo tanto, se identifica a dónde está mirando nuestro objeto (facing), lo cual el movimiento respeta al calcular la velocidad para los ejes X y Z con la función move_toward
(mover hacia).
Esta propiedad Up Direction se puede cambiar desde el Inspector en caso de que estemos deseando alterar alguno de sus sentidos, pero por default debería funcionar bien en la mayoría de casos.
Si quisiéramos un objeto del tipo CharacterBody3D
para adelante en base a una rotación, podríamos utilizar el Vector3.FORWARD
, de la siguiente manera:
velocity = Vector3.FORWARD * velocidadDeseada
Esto es solo si aplicamos rotación al objeto.
Esto fue extraído de mi libro "La Biblia de Godot (Nivel 1)" que podes encontrar clickeando en la siguiente imagen:
0 Comentarios