Jump to content

Recommended Posts

Buenas!!! Buen dia!!!!

Introducción:
Como algunos saben estoy trabajando en un projecto que me es muy importante para mi, de no saber nada de programacion a meterme en este mundo desde 0, aprendiendo varios idiomas hace 4 meses, y empece a programar junto con Unity, lo que voy aprendiendo lo vuelco en este proyecto que lo vengo haciendo solo, esperando obtener buenos resultados! y metiendo le mis mejores energías a esto!

KUBOI ®https://vimeo.com/236833302

Bueno resulta que estoy en una nueva mecanica innovadora que hasta ahora no la e visto:
giphy.gif
(Obviamente esto es bien criollo en el diseño artístico voy a incluir marcas en las rotaciones y mejorar algunas tonalidades)

Necesito de ustedes ya que comencé esto solo y necesito ayuda a nivel avanzado matemático, me esta costando mas de lo que esperaba...
(Van a obtener algo a cambio y es ser nombrados y valorados en parte del equipo que me ha ayudado a poder hacer esto posible, los que me ayuden en esta mecánica)
Ademas de ser nombrados y valorados les voy a dar una Copia original digital, del juego completo.

Desarrollo:
La cuestion es asi, necesito ayuda en el "ambito" radial de matematica y el manejo de los ejes XYZ.
Mi problema es el siguiente(vamos con ejemplos claros):
giphy.gif

Este es mi problema, miren la direccion que se supone que deberia saltar, y miren como salta...
ESTO DEBERIA SUCEDER:
IXqNm2x.png

Presten atencion, si no entienden releean, voy a ser claro.

  • La camara de escena  que veran acontinuacion es una vista derecha(es decir sin ser rotada)
    Explico:
  • Tengo programado que el Raycast AZUL al ser golpeado en cuanto se poscicione el cubo en este caso salte apartir de ahi
  • Las lineas VERDES son dibujadas como referencia
  • Si escribo MODO ILUSTRATIVO es por que no SUCEDE, sino que es lo que necesito que SUCEDA
  • BoxJump: El gameObject con script de Salto o empuje (En este post solo muestro a modo de representación el salto)
  • Lean todo con atencion porfavor :)

4fgz8e1.png haYkFGM.png
Transform del BoxJump:
Position: -1,-1,-8
Rotation: 270,0,270

  • Esas imagenes representan como lo tengo programado actualmente
  • Si me posiciono donde empieza la linea verde se ejecuta el salto con una longitud X y altura X
    ACA NECESITO SU AYUDA:

Como pueden Observar el salto se provoca asi talcual con una longitud X y altura X
El salto no es una animacion, es un calculo matematico radial que calcule, es muy basico, necesito algo mas avanzado
Este es el calculo que hice, que provoca lo siguiente:
Esta desmeruzado por completo, solo posteo el calculo matematico, y voy explicando que es lo que necesito mejorar y alcanzar con la matematica.
https://ghostbin.com/paste/au2tg
(Esta plasmado lo que importa)
 

  • Entonces ilustremos esto:
    Hasta ahora explique muy clarito (sino releean porfavor y si se sigue sin entender avisenme) lo siguiente:
    Veamos de vuelta esta imagen:
    haYkFGM.png
    Con el calculo mostrado en el "Pastebin" anterior (y obviamente si saben matematica) deberian entender esto y el calculo matematico que aplique.
    AHORA VIENE LA CUESTIÓN:
  • YO NECESITO ESTO:
    q4bAnnu.png
    (Modo ilustrativo, esto no sucede. Sucede lo anterior mostrado)
     
  • Si prestaron atención, un poco mas arriba, escribi el transform del BoxJump, miren la rotacion (270,0,270)
  • Esta rotado, okey? Pero si se fijan en la Segunda de las primeras dos imagenes, el salto se provoca como si el BoxJump estuviese en una rotacion de (0,0,0) Ya que el algoritmo del script que les mostre, "SALTA/SE EJECUTA" DESDE el punto de "golpeo y acomodo" del Player (donde golpea el raycast AZUL) y desde ahi hace esto:
    850xKqa.png
    (Como si BoxJump estuviese en Rotation: 0,0,0)

    PERO QUE EN REALIDAD DEBERIA SUSEDER ESTO
    VR478qM.png
    (Modo ilustrativo)
    Ya que BoxJump tiene una rotacion 270,0,270 yo quiero que se RESPETE El sistema RADIAL
  • La cuestion aca es: El calculo matematico radial, no necesitaria cambiarse, PERO alguien se le ocurre alguna forma de que player.transform.position en sus coordenadas XYZ sea afectado como merece ser afectado, si BoxJump esta rotado el player si golpea el HIT va a ir hacia donde yo quiero que vaya, que respete la rotacion, el sistema radial.

Si observan el primer GIF, salta bien Cuando piso el BoxJump que estoy mostrando como ejemplo

  • Por que salto bien?:
    Bueno la cuestion es simple, miren esto(De vuelta):
    850xKqa.png 
    (Presten atencion a los EJES XYZ de la escena)
    Si yo hago roto el mundo pasa esto:
    20wrzao.png
  • El mundo lo rote (ROTE EL GAMEOBJECT QUE CONTIENE EL NIVEL, OSEA QUE TODOS SON HIJOS DE "LEVEL" ROTE LEVEL)
  • LAS ROTACIONES DE LOS HIJOS SIGUEN INTACTAS, YA QUE SUS TRANSFORM LOCAL NO CAMBIARON
  • SOLO LA DEL PADRE
  • Por esta razon, en el gif del principio el player ejecuto bien el salto, PERO cuando el mundo gira de vuelta Revisemos de vuelta esto:
    850xKqa.png
  • Entienden lo que me sucede???
  • La el TRANSFORM QUE CAMBIA DEL PLAYER NO RESPETA COMO QUIERO QUE SEA RESPETADO

IDEAS? ESUCHO PROPUESTAS
 

ETAPA 2 DEL POST:
Estoy hace una hora y media haciendolo va bien resumido.
En cuanto a la parte matematica avanzada

  • Necesito un nuevo calculo matematico donde pueda calcular NO solo el Largo y la Altura del salto, que tambien no solo caiga asi:
    fU4Qu9l.pngQue ademas pueda ->YKoOkrB.png
  • Esto es MUY avanzado a nivel matematico, no se si puedan ayudarme en esto pero lo agradeceria mucho.
     

Conclucion:

Les agradezco mucho de ante mano cualquier aporte que me hagan, espero con ansias respuestas, ideas, y demas (Seran notificado si me aportaron y me voy a poner en contacto para avisarle que va a pertenecer al grupo del desarrollo).

Abrazo a todos
enelmenu :134_spy:

 

Edited by enelmenu

Share this post


Link to post
Share on other sites

o sea lo mejor es poderle pasar el punto final del salto, cierto? y que haga la animacion de la parabola desde el punto inicial?

Share this post


Link to post
Share on other sites
hace 2 minutos, Braltor said:

o sea lo mejor es poderle pasar el punto final del salto, cierto? y que haga la animacion de la parabola desde el punto inicial?

@BraltorExactamente, pero el punto final del salto se desconoce, ya que el mundo rota los vectores cambian
Lo que se puede calcular el el radial y los ejes XYZ que vayan en costeleta o recto

hace 3 minutos, francoe1 said:

Desde mi punto de vista debería utilizar Parábolas. 

@francoe1 Claro, de echo se esta utilizando una parabola en el calculo matematico que aplico, lo que necesesito es manipular los XYZ que aplica la parabola, para que cuando gire el mundo siga respetandolo, me explico?

Share this post


Link to post
Share on other sites
hace 1 minuto, enelmenu said:

@BraltorExactamente, pero el punto final del salto se desconoce, ya que el mundo rota los vectores cambian
Lo que se puede calcular el el radial y los ejes XYZ que vayan en costeleta o recto

eso es xq no lo estas haciendo relativo… el mundo debe ser fijo en XYZ, pero montado en un pivote que da el efecto de giro

ademas del punto final ya veo que necesitas una orientacion de la parabola, para eso es mejor "dibujar" la curva, entonces puedes usar splines:

http://catlikecoding.com/unity/tutorials/curves-and-splines/

hay muchas libs de splines y otros tipos de curvas

Share this post


Link to post
Share on other sites

yo haria un script nuevo para el objeto que te hace saltar, con tres variables Vector3 que puedas cambiar desde el editor: Vector3 posicion final(posicion en la que acabas despues del salto) Vector3 direccion de salto), y Vector3 torque(angulo(vultas)que gira el cubo en cada eje)... y asignas diferentes valores a cada "objetoQueTeHaceSaltar"

si quieres te hago un script pero tendras que decirme el tamaño de cada "cuadrado" (miden1?)

Share this post


Link to post
Share on other sites
hace 6 minutos, Braltor said:

eso es xq no lo estas haciendo relativo… el mundo debe ser fijo en XYZ, pero montado en un pivote que da el efecto de giro

@Braltor :35_thinking::35_thinking::35_thinking: Me parece muy interesante tu propuesat, mantener el XYZ del mundo....
Pero... como logro eso?

Actualmente estoy rotando asi:
u1P2YpR.png

En el momento de rotar, Level ENTRA como hijo de PivotOffSet, PivotOffset ROTA, cuando gira los 90º completos, sale de PivotOffSet. Y asi sucesivamente.

PD: Curves and Splines!! Gracias!! buen dato, voy a leer sobre eso, si no entiendo algo te aviso!!

hace 3 minutos, Igor said:

yo haria un script nuevo para el objeto que te hace saltar, con tres variables Vector3 que puedas cambiar desde el editor: Vector3 posicion final(posicion en la que acabas despues del salto) Vector3 direccion de salto), y Vector3 torque(angulo(vultas)que gira el cubo en cada eje)... y asignas diferentes valores a cada "objetoQueTeHaceSaltar"

@Igor Me paerce buena idea, pero asi tal cual como lo dices, entendi que para hacer lo que mencionas, necesitas obtener la coordenada de inicio y final, antes de ejecutar el salto, y solo sabemos la coordenada de inicio, que es donde player hitea, si bien la coordenada final la sabemos calculando a partir de la del inicio, si logras apartir de vectores aplicar la PARABOLA, como logras que esa PARABOLA RESPETE la rotacion del mundo?

hace 5 minutos, Igor said:

si quieres te hago un script pero tendras que decirme el tamaño de cada "cuadrado" (miden1?)

Si escala 1

Share this post


Link to post
Share on other sites
hace 1 minuto, enelmenu said:

@Braltor :35_thinking::35_thinking::35_thinking: Me parece muy interesante tu propuesat, mantener el XYZ del mundo....
En el momento de rotar, Level ENTRA como hijo de PivotOffSet, PivotOffset ROTA, cuando gira los 90º completos, sale de PivotOffSet. Y asi sucesivamente.

PD: Curves and Splines!! Gracias!! buen dato, voy a leer sobre eso, si no entiendo algo te aviso!!

me refiero a fijo para los calculos, por eso tienes dos opciones:

1. giras el mundo y usas localPosition para hacer cálculos

2. giras la camara alrededor mundo y usas position

el que te quede mas facil

creo que spline es la mejor solucion, y si los dominas puedes hacer animaciones asombrosas, como que el personaje haga un riso en el aire… aunque primero trata de entender los fundamentos jajaj

Share this post


Link to post
Share on other sites

ok me imaginaba que eran de 1, y como se llama el "player"? (para el raycast) 

si quieres en vez de Vector3 posicionFinal, puede ser Vector3 desplazamientoTotal, y pones ahi si quieres que acabe 3casillas a la izquierda y una arriba, o lo que quieras

si quieres mañana te lo hago, ahora no puedo

el script lo llamare como tu: "jumpBox"

quieres tiempo de salto variable dependiendo de la longitud de salto?

 

Share this post


Link to post
Share on other sites

Te dejo algo que arme hace un tiempo y lo modifique ahora para vos.. 

public static class Parabolic
{
    public struct Node
    {
        public Vector3 Point;
        public Vector3 Euler;
        public Quaternion Rotation { get { return Quaternion.Euler(Euler); } }
    }

    public enum ERotation
    {
        Deg0,
        Deg90,
        Deg180,
        Deg270,
    }

    public static Node[] Create(Vector3 point, Vector2 velocity, int segments, ERotation rotation)
    {
        float vel = Mathf.Sqrt((velocity.x * velocity.x) + (velocity.y * velocity.y));
        float angle = Mathf.Rad2Deg * (Mathf.Atan2(velocity.y, velocity.x));
        float time = ;

        time += 0.1f;

        Node[] path = new Node[segments];
        for (int i = ; i < segments; i++)
        {
            float disX = vel * time * Mathf.Cos(angle * Mathf.Deg2Rad);
            float disY = vel * time * Mathf.Sin(angle * Mathf.Deg2Rad) - (Physics2D.gravity.magnitude * time * time / 2.0f);

            path[i].Point = new Vector3(point.x + disX, point.y, point.z);
            if (rotation == ERotation.Deg0)
                path[i].Point.y += disY;
            else if (rotation == ERotation.Deg90)
                path[i].Point.z += disY;
            else if (rotation == ERotation.Deg180)
                path[i].Point.y -= disY;
            else if (rotation == ERotation.Deg270)
                path[i].Point.z -= disY;

            path[i].Euler = new Vector3(, , Mathf.Atan2(velocity.y - (Physics.gravity.magnitude) * time, velocity.x) * Mathf.Rad2Deg);
            time += 0.1f;
        }

        return path;
    }
}

Podes armar parabólicas en las 4 rotaciones creería necesarias para tus mecánicas.

Te dejo un componente de prueba...

public class Parabola : MonoBehaviour
{
    public Vector2 Vi = new Vector2(10, 20);
    public Parabolic.Node[] Path = new Parabolic.Node[];
    public int Segments = 50;
    public Parabolic.ERotation Rot = Parabolic.ERotation.Deg0;

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Mouse0))
        {
            Path = Parabolic.Create(transform.position, Vi, Segments, Rot);
        }
    }
    
    private void OnDrawGizmos()
    {
        for (int i = ; i < Path.Length - 1; i++)
        {
            int i2 = i + 1;
            Gizmos.color = Color.white;
            Gizmos.DrawLine(Path[i].Point, Path[i2].Point);
           
            Vector3 dir = (Path[i].Point + Path[i2].Point.normalized);
            Vector3 hDir = dir;
            hDir.y = Path[i].Point.y;
            Vector3 vDir = dir;
            vDir.x = Path[i].Point.x;
            Gizmos.color = Color.red;
            Gizmos.DrawLine(Path[i].Point, hDir);
            Gizmos.color = Color.blue;
            Gizmos.DrawLine(Path[i].Point, vDir);
        }
    }
}

parabola.JPG

parabola2.JPG

parabola3.JPG

 

Espero te sirvan!

Share this post


Link to post
Share on other sites

No entiendo bien la idea del salto parabólico con la rotación del LEVEL porque no logro ver algunas imágenes pero creo que la opción de rotar la cámara sería un tema a considerar 

On Wednesday, October 18, 2017 at 11:40, Braltor said:

me refiero a fijo para los calculos, por eso tienes dos opciones:

1. giras el mundo y usas localPosition para hacer cálculos

2. giras la camara alrededor mundo y usas position

el que te quede mas facil

 

 romperse con un cálculo matemático tan profundo pude dar buenos frutos pero si en el nivel no tienes nada que te indique qué está hacia arriba o de cabeza bien podrías cambiar el sentido de la orientación con la cámara y a lo mejor con luces también. Con esto puede que las parábolas que emplea solo tengan que ser positivas o negativas / en un eje u otro o rotando el cubo. 

Otra opción que te propongo es emplear el cubo como si fuese un proyectil atraído por fuerzas gravitatorias en varios ejes, con esto puede que las parábolas surjan inclinadas respecto a x,y,z , o sea, no sobre los ejes y se pudiera lograrse otro efecto. Creo que con lo del proyectil pudieras determinar el punto final si lo deseas o que sea al azar modificado por las otras fuerzas.

Share this post


Link to post
Share on other sites

Lo más facil es:

1.- Con el script que te ha pasado @francoe1 calculas x posiciones de la parábola, esas posiciones las divides por la rotación que quieres que haga tu cubo en el salto, y por cada nodo por el que pase lo giras lo que le corresponda. Ejemplo:

Mi cubo quiero que gire 90 grados en la parabola y a mi parabola le he puesto 10 posiciones, 90 grados entre 10 son 9 así que por cada posición por la que pase hasta llegar a la posición final sumaré 9 grados al ángulo en el que rota. Ten en cuenta que si pones pocas posiciones se verá una rotación muy poco fluido.

Con este algoritmo lo que se consigue es que solo sabiendo la parábola puedes hacer la animación completa independientemente de qué velocidad lleva el cubo y lo que tardará en recorrerla.

Espero que te sirva. Salu2.

Share this post


Link to post
Share on other sites

Gracias a:

@Braltor 
@Igor
@jhernandez95
@mgarcia

Por intentar ayudarme y unos especiales saludos a @francoe1 con su increíble aporte!!! gracias hermano por tomarte tu tiempo para retocarlo y intentar ayudame!
y a @pioj por destacar el tema.

 

Lamento informarles que mas allá de la responsabilidad mia ante sus esfuerzos por ayudarme en lo comentado, no eh podido solucionar mi problema con los recursos que me intentaron faciltar, si bien aprendi sobre otras cuestiones necesarias y que me dieron un impulso de ideas, no fueron la clave de mi solucion.

Despues de darle varias vueltas a la tuerca noche y dia, lo solucione a lo "primate" o lo que yo llamo "el camino largo"
Basicamente tomo cada situacion y la condiciono como debe ser condicionada cada especifica situacion de rotacion en el mundo y demas.
Dejo el script para que chusmeen por si les interesa.

No manejo los Gizmos, si bien me explicaron sobre los Curves y Splines, no lo veo algo realmente necesario de trayectar en mi caso, por que con solo saber altura y largo ya me doy una idea de su trayectoria sin Gizmos.
@francoe1 Demostro mediante un calculo increible de parabola, ademas en Gizmos demostro un nivel imprecionante del manejo de la programacion. Gracias de todas formas Franco!!.

Codigo SOLUCION:
https://ghostbin.com/paste/ymc4a
Eliminen todo lo relacionado a PlayerMovements y tienen parabolas con rotacion en ejes cartesiano.

Me da mucha impotencia en cuanto al resultado de mi solucion, ya que no puedo nombrar a nadie en los creditos u.u :35_thinking::35_thinking:
PERO los voy a nombrar en agradecimientos!!! :)
Pronto me voy a estar comunicando con ustedes por privado de esta pagina para que me pasen algunos datos.

Abrazo
enelmenu :134_spy:

@lightbug Avos tambien juancito! me ayudaste mucho en mis comienzos! <3

Share this post


Link to post
Share on other sites
hace 12 horas, enelmenu said:

Gracias a:

@Braltor 
@Igor
@jhernandez95
@mgarcia

Por intentar ayudarme y unos especiales saludos a @francoe1 con su increíble aporte!!! gracias hermano por tomarte tu tiempo para retocarlo y intentar ayudame!
y a @pioj por destacar el tema.

 

Lamento informarles que mas allá de la responsabilidad mia ante sus esfuerzos por ayudarme en lo comentado, no eh podido solucionar mi problema con los recursos que me intentaron faciltar, si bien aprendi sobre otras cuestiones necesarias y que me dieron un impulso de ideas, no fueron la clave de mi solucion.

Despues de darle varias vueltas a la tuerca noche y dia, lo solucione a lo "primate" o lo que yo llamo "el camino largo"
Basicamente tomo cada situacion y la condiciono como debe ser condicionada cada especifica situacion de rotacion en el mundo y demas.
Dejo el script para que chusmeen por si les interesa.

No manejo los Gizmos, si bien me explicaron sobre los Curves y Splines, no lo veo algo realmente necesario de trayectar en mi caso, por que con solo saber altura y largo ya me doy una idea de su trayectoria sin Gizmos.
@francoe1 Demostro mediante un calculo increible de parabola, ademas en Gizmos demostro un nivel imprecionante del manejo de la programacion. Gracias de todas formas Franco!!.

Codigo SOLUCION:
https://ghostbin.com/paste/ymc4a
Eliminen todo lo relacionado a PlayerMovements y tienen parabolas con rotacion en ejes cartesiano.

Me da mucha impotencia en cuanto al resultado de mi solucion, ya que no puedo nombrar a nadie en los creditos u.u :35_thinking::35_thinking:
PERO los voy a nombrar en agradecimientos!!! :)
Pronto me voy a estar comunicando con ustedes por privado de esta pagina para que me pasen algunos datos.

Abrazo
enelmenu :134_spy:

@lightbug Avos tambien juancito! me ayudaste mucho en mis comienzos! <3

Hola, el código está muy poco optimizado. Deberías darle un poco más de vueltas al algoritmo. Basicamente porque es un juego con muy poca carga a nivel gráfico, así que esforzarse en mejorar el código nunca está de más jeje (Uno no puede llamarse coder por hacer las cosas a "la cuenta la vieja" xD)

 

Sobre nombrarme en agradecimientos no hace falta que lo hagas, no te he ayudado por eso. Simplemente me parecía interesante el método que se me ha ocurrido a mi para hacer la animación del cubo en los saltos parabólicos con pocos recursos.

Un saludo. Y suerte!

Share this post


Link to post
Share on other sites

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...