Hola Visitante

Godot 3D, Giro por desliz

  • 0 Respuestas
  • 37 Vistas
*

bizarman

  • *
  • 15
  • +3/-0
    • Ver Perfil
Godot 3D, Giro por desliz
« en: 05 de Junio del 2019, 00:59 »


Un personaje que al contacto con inclinaciones gira con estas.
No es un RigidBody es un KinematicBody2D.
La forma de la colisión (CollisionShape) no gira, gira la malla
(el nodo MeshInstance), puedes modificarlo para que gire todo, pero los
resultados son un poco inestables.



Ingredientes:
En este caso tiene una colisión (CollisionShape) en forma de
cubo (BoxShape)



Posicionamos el personaje, en este caso mira contrario
al eje: x, el personaje debe estar bien centrado en todos los ejes:
centrado en el eje: x
centrado en el eje: y
centrado en el eje: z
No lo centres en godot, centralo en Blender, o el programa
que usastes para crearlo.



Código: [Seleccionar]

extends KinematicBody


var velocidad_caminar = 500
var velocidad_giro = deg2rad(30)
var velocidad_salto = 600
var gravedad = -9.8
var giro = 0
var saltando = false
var direccion = Vector3()


var velocidad_torque = 9
var velocidad_amortiguacion = 5
onready var posicion_rampa = get_node("MeshInstance").get_translation() + Vector3(0, -0.5, -0.25)
onready var posicion_suelo = get_node("MeshInstance").get_translation()




func _physics_process(delta):
direccion.x = 0
direccion.z = 0

if Input.is_action_just_pressed("ui_select") and is_on_floor():
saltando = true
direccion.y = velocidad_salto * delta

if Input.is_action_pressed("ui_left"):
giro += velocidad_giro * delta

if Input.is_action_pressed("ui_right"):
giro -= velocidad_giro * delta

if Input.is_action_pressed("ui_up"):
direccion.x = -velocidad_caminar * delta

if Input.is_action_pressed("ui_down"):
direccion.x = velocidad_caminar * delta

direccion.y += gravedad * delta
direccion = direccion.rotated(Vector3(0, 1, 0), giro)

get_node("CollisionShape").set_rotation(Vector3(0, giro, 0))
get_node("MeshInstance").rotate_object_local(Vector3(0, 1, 0), giro - get_node("MeshInstance").get_rotation().y - deg2rad(90))

direccion = move_and_slide(direccion, Vector3(0, 1, 0))

if saltando and is_on_floor():
saltando = false

if get_slide_count() > 0:
var choque = get_slide_collision(0)
var normal = choque.get_normal()
if not is_on_wall():
var angulo_inicial = Vector2(normal.y, normal.z).angle()
var global = get_node("MeshInstance").get_global_transform().basis
var angulo_global = Vector2(global[1].y, global[1].z).angle()
var angulo_final = angulo_inicial - angulo_global
get_node("MeshInstance").global_rotate(Vector3(1, 0, 0), angulo_final * delta * velocidad_torque)

if abs(angulo_inicial) > deg2rad(1):
var pos_inicial = get_node("MeshInstance").get_translation()
var pos_final = posicion_rampa - pos_inicial
get_node("MeshInstance").global_translate(pos_final * delta * velocidad_amortiguacion)

if abs(angulo_inicial) < deg2rad(1):
var pos_inicial = get_node("MeshInstance").get_translation()
var pos_final = posicion_suelo - pos_inicial
get_node("MeshInstance").global_translate(pos_final * delta * velocidad_amortiguacion)


Nota:
Probado en Godot 3.1