Quiero tener un personaje jugable que pueda "caminar" en una superficie orgánica en cualquier ángulo, incluso de lado y boca abajo. Por niveles "orgánicos" con características inclinadas y curvas en lugar de líneas rectas en ángulos de 90 grados.
Actualmente estoy trabajando en AS3 (experiencia moderada de aficionados) y estoy usando Nape (más o menos un novato) para la física básica basada en la gravedad, para lo cual esta mecánica de caminar será una excepción obvia.
¿Hay alguna forma de procedimiento para hacer este tipo de mecánica de caminar, tal vez usando restricciones de nuca? ¿O sería mejor crear "caminos" para caminar explícitos siguiendo los contornos de las superficies niveladas y usarlos para restringir el movimiento de caminar?
Respuestas:
Aquí está mi experiencia de aprendizaje completa, resultando en una versión bastante funcional del movimiento que quería, todo utilizando los métodos internos de Nape. Todo este código está dentro de mi clase Spider, extrayendo algunas propiedades de su padre, una clase Level.
La mayoría de las otras clases y métodos son parte del paquete Nape. Aquí está la parte pertinente de mi lista de importación:
Primero, cuando la araña se agrega al escenario, agrego oyentes al mundo de Nape para colisiones. A medida que avance en el desarrollo, necesitaré diferenciar los grupos de colisión; por el momento, estas devoluciones de llamada se ejecutarán técnicamente cuando CUALQUIER cuerpo colisiona con cualquier otro cuerpo.
Las devoluciones de llamada cambian la propiedad de "estado" de la araña, que es un conjunto de valores booleanos, y registran los árbitros de colisión de la nuca para su uso posterior en mi lógica de caminar. También establecen y desactivan el Temporizador, lo que permite que la araña pierda contacto con la superficie nivelada hasta 100 ms antes de permitir que la gravedad mundial se apodere nuevamente.
Finalmente, calculo qué fuerzas aplicar a la araña en función de su estado y su relación con la geometría de nivel. Principalmente dejaré que los comentarios hablen por sí mismos.
La verdadera parte pegajosa que encontré fue que el ángulo de movimiento tenía que estar en la dirección de movimiento deseada real en un escenario de múltiples puntos de contacto donde la araña alcanza un ángulo agudo o se sienta en un valle profundo. Especialmente porque, dados mis vectores sumados para la fuerza de adhesión, esa fuerza se alejará de la dirección que queremos mover en lugar de perpendicular a ella, por lo que debemos contrarrestar eso. Así que necesitaba lógica para elegir uno de los puntos de contacto para usar como base para el ángulo del vector de movimiento.
Un efecto secundario del "tirón" de la fuerza de adhesión es una leve vacilación cuando la araña alcanza un ángulo / curva cóncavo nítido, pero en realidad es algo realista desde el punto de vista de la apariencia, así que a menos que cause problemas en el camino, déjalo como está. Si lo necesito, puedo usar una variación de este método para calcular la fuerza de adhesión.
Esta lógica es bastante "perfecta", ya que hasta ahora parece estar haciendo lo que yo quiero que haga. Sin embargo, hay un problema cosmético persistente, ya que si trato de alinear el gráfico de la araña con las fuerzas de adhesión o movimiento, encuentro que la araña termina "inclinada" en la dirección del movimiento, lo cual estaría bien si fuera un velocista atlético de dos patas, pero no lo es, y los ángulos son muy susceptibles a las variaciones en el terreno, por lo que la araña se agita cuando pasa por el más mínimo golpe. Puedo buscar una variación en la solución de Byte56, muestreando el paisaje cercano y promediando esos ángulos, para hacer que la orientación de la araña sea más suave y realista.
fuente
¿Qué tal hacer que cualquier superficie de "palo" que toque un personaje aplique una fuerza a lo largo de la normal inversa de la superficie? La fuerza permanece mientras estén en contacto con la superficie y anula la gravedad mientras esté activa. Por lo tanto, saltar del techo tendrá el efecto esperado de caer al suelo.
Probablemente desee implementar algunas otras características para que esto funcione sin problemas y sea más fácil de implementar. Por ejemplo, en lugar de solo lo que toca el personaje, use un círculo alrededor del personaje y resuma las normales invertidas. Como muestra esta imagen de pintura horrible:
(La imagen de araña representada es propiedad de Byte56)
Las líneas azules son las normales inversas a la superficie en ese punto. La línea verde es la fuerza sumada que se aplica a la araña. El círculo rojo representa el rango que la araña está buscando normales para usar.
Esto permitiría algunas irregularidades en el terreno sin que la araña "pierda su agarre". Experimente sobre el tamaño y la forma del círculo, tal vez solo use un semicírculo orientado con la araña hacia abajo, tal vez solo un rectángulo que abarque las patas.
Esta solución te permite mantener activa la física, sin necesidad de tener que lidiar con caminos específicos que el personaje puede seguir. También está utilizando información que es bastante fácil de obtener e interpretar (normales). Finalmente, es dinámico. Incluso cambiar la forma del mundo es fácil de tener en cuenta, ya que puede obtener valores normales para cualquier geometría que esté dibujando.
Recuerde que cuando no hay caras dentro del alcance de la araña, la gravedad normal se hace cargo.
fuente