Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

[Ayuda]Como calcular la posición de un objeto cuando interviene una rotación. SOLUCIONADO

Iniciado por Naxz, Septiembre 23, 2015, 04:50:08 PM

Tema anterior - Siguiente tema
Buenas, tengo una duda con respecto a lo siguiente:

Si hay un objeto (A) a una posición http://docs.unity3d.com/ScriptReference/Vector3.html">Vector3(0,0,0) y otro objeto (B) que quiero que se desplace a la coordenada X=1 http://docs.unity3d.com/ScriptReference/Vector3.html">Vector3(1,0,0), pues fácilmente se hace un cambio sin problema como se ve en la figura siguiente:(A)                                                           (B)

Yo lo que veo es:1er caso:  Los dos cubos en el mismo gameobject, rotación del cubo azul2o caso: Los cubos por separado y rotación de los dos cubos por separado. O los dos cubos en el mismo gameobject y aplicar rotación local a cada uno de ellos (localrotation)Para rotaciones más o menos complejas, deberás entrar con los Quaternions.

Bueno, primero que nada gracias por responder.Los cubos no están en un mismo http://docs.unity3d.com/ScriptReference/GameObject.html" rel="external nofollow">GameObject, otra cosa de aplicar rotaciones no tengo problema, lo que sucede es que al darle la misma rotación a ambos cubos, quiero que estos se posicionen como el de la tercera figura, esto implica a que debo de aplicar un calculo, tomando como base transform.position del cubo rojo, transform.rotation y la  posición o dirección de donde quiero que se realice el movimiento. Creo que para ello es usar así como dices http://docs.unity3d.com/ScriptReference/Quaternion.html" rel="external nofollow">Quaternion y http://docs.unity3d.com/ScriptReference/Mathf.html" rel="external nofollow">Mathf, en pocas palabras un calculo matemático.transform.position = new Vector3(0,0,0);transform.rotation = new Vector3(0,45,0);posición o dirección = new Vector3(1,0,0);Realizar el movimiento sin rotación es fácil, porque solo cambias una coordenada ya sea X,Y,Z y este se mueve de la forma deseada como la segunda figura. Pero si añades un angulo de rotación la posición cambia considerablemente.. Por lo que busco un calculo que usando cualquier angulo, y teniendo los datos mencionados que den como resultado la posición deseada.Espero que podáis ayudarme, y de verdad lo agradezco.

No puedes usar Vector3 para rotaciones directamente, ya que un Quaternion utiliza 4 dimensiones y un Vector3 solamente tiene 3, a menos que lo conviertas a eulerAngles el Quaternion, cosa que no te recomiendo ya que tendrás otros problemas relacionados con la imposibilidad de rotar más allá de 180 grados. No te lío con esto.Pero, para rotar un objeto es:transform.rotation = Quaternion... y aquí tienes muchas funciones para mirarte.Esta te puede interesar más:Quaternion.LookRotation 

Es raro,  se ve como si en la tercera imagen además de rotación hubo un traslado, tomando como referencia la grilla.En las imágenes la vista es isometrica o en perspectiva? Esa rotación de la imagen 3, es como si hubieras seleccionado ambos gameObjects y luego hubieras aplicado una rotación. Luego sus posiciones también cambiaron no por tu mano, si no por el editor usando como referencia ese punto medio que ha generado a partir de la selección múltiple. Ese efecto lo conseguirias si haces hijos ambos gameobjects de otro vacío y luego aplicas la rotación al componente Transform del objeto vacío.Pero hay que tener en consideración la posición local de cada objeto hijo para lograr el efecto,  según mi apreciación, las mismas que has descrito antes.No veo mayor complejidad. 

Bye Bye



iRobb si se que se usa Quaternion para hacer cambios de rotación...La cosa es la siguiente, estoy realizando un editor en tiempo real, en el que creo un objeto por decir un cubo si ves un cubo tiene 6 lados de los cuales yo tomo solo 4 que son los lados: Frontal, Trasero, Izquierdo y derecho, en cada uno de esos puntos agregue scripts que tiene datos de Posición, Rotación y Dirección.Entonces si yo apunto una de las 4 caras del cubo digamos la Frontal, hay esta un script de datos, automáticamente el objeto que quiera colocar nuevo toma los datos de esa cara.Si no tiene rotación, el efecto que hace es como el de la imagen 2, lo cual es fácil de hacer.Pero si tiene rotación es como el de la imagen 4 cuando quiero que sea como el de la imagen 3.Si se fijan en la imagen 4 y 3, se observa que hay una rotación y un traslado como dice http://unityspain.com/profile/25934-oak-human-flesh/?do=hovercard&referrer=http%253A%252F%252Funityspain.com%252Ftopic%252F26002-ayudacomo-calcular-la-posici%25C3%25B3n-de-un-objeto-cuando-interviene-una-rotaci%25C3%25B3n%252F" title="Go to Oak Human Flesh's profile" id="ips_uid_6" style="box-sizing: border-box; color: inherit; text-decoration: none; outline: 0px; background-color: transparent;" href="<___base_url___>/profile/25934-oak-human-flesh/">Oak Human Flesh, hasta los momentos mi resultado es la imagen 4, los cubos no están en un mismo GameObject y no pienso colocarlo dentro, ya que podría seleccionar otra cara del cubo. http://unityspain.com/profile/25934-oak-human-flesh/?do=hovercard&referrer=http%253A%252F%252Funityspain.com%252Ftopic%252F26002-ayudacomo-calcular-la-posici%25C3%25B3n-de-un-objeto-cuando-interviene-una-rotaci%25C3%25B3n%252F" title="Go to Oak Human Flesh's profile" id="ips_uid_6" style="color: inherit; box-sizing: border-box; text-decoration: none; outline: 0px; background-color: transparent;" href="<___base_url___>/profile/25934-oak-human-flesh/">Oak Human Flesh:  con respecto a la vista, la hice en perspectiva desde arriba, el cubo rojo nunca cambia de posición, solo su rotación.Espero que me podáis entender .

¿Porque no creas un objeto vacio en el medio de los cubos? Haces que los cubos sean hijos de este y le aplicas rotación al objeto padre... 

http://unityspain.com/profile/20968-uli/?do=hovercard&referrer=http%253A%252F%252Funityspain.com%252Ftopic%252F26002-ayudacomo-calcular-la-posici%25C3%25B3n-de-un-objeto-cuando-interviene-una-rotaci%25C3%25B3n%252F" title="Go to Uli's profile" id="ips_uid_4" style="box-sizing: border-box; color: inherit; text-decoration: none; background-color: transparent;" href="<___base_url___>/profile/20968-uli/">Uli Por que lo que busco es editar solo 1 cubo azul, el rojo ya tiene su posición, rotación y dirección, quiero que el azul tome esos datos y los use para dar posición como en el caso de la imagen 3.Aquí una vista previa de cubo sin rotación y con rotación resultado desastroso.

[quote author=alex_azuaje date=1443037148" data-ipsquote="" data-cite="alex_azuaje">http://unityspain.com/profile/20968-uli/?do=hovercard&referrer=http%253A%252F%252Funityspain.com%252Ftopic%252F26002-ayudacomo-calcular-la-posici%25C3%25B3n-de-un-objeto-cuando-interviene-una-rotaci%25C3%25B3n%252F" data-ipshover="">Uli Por que lo que busco es editar solo 1 cubo azul, el rojo ya tiene su posición, rotación y dirección, quiero que el azul tome esos datos y los use para dar posición como en el caso de la imagen 3.Aquí una vista previa de cubo sin rotación y con rotación resultado desastroso.[/quote]entonces quieres heredar la posición y rotación del cubo rojo para calcular la rotación del cubo azul sumado en 1mt en al gun eje?sigo sin comprender por que bastaría con usar el transform de algún objeto de referencia y hacer hijos los otros y luego rotarlos usando el padre...pero tengo dos teorías jajajajaesta es la primera obviamente:
selectionReference.name = "SelectionReferenceObj";
        selectionReference.transform.position = Vector3.zero;
        selectionReference.transform.rotation = Quaternion.identity;
        selectionReference.transform.localScale = new Vector3(1, 1, 1);
    }
    // Update is called once per frame
    void Update()
    {
        // llama una vez por frame el metodo StepRotateControl().
        StepRotateControl();

    }
    /// <summary>
    /// rota en un paso, segun la cantidad de grados del valor del float rotacion.
    /// </summary>
    private void StepRotateControl()
    {
        if (Input.GetButtonDown("Fire1"))
        {
            if (objects.Length > 0)
            {
                // crea un objeto para usarlo como referencia de transformaciones.
                InitSelectionObject();
                // calcula la posicion central
                selectionReference.transform.position = (objects[0].position + objects[objects.Length - 1].position) * 0.5f;
                for (int i = 0; i < objects.Length; i++)
                {
                    // hace hijos todos los gameObjects seleccionados en la variable objects
                    objects.parent = selectionReference.transform;
                    // rota el object usando como eje el eje z y la posicion del selectionReference obj.
                    objects.RotateAround(selectionReference.transform.position, Vector3.forward, rotacion);
                }
            }
        }
        if (Input.GetButtonUp("Fire1"))
        {
            if (selectionReference.transform.childCount > 0)
            {
                // Unparents all children of the selectionReference gameObject.
                selectionReference.transform.DetachChildren();
                // quita de escena el objeto de referencia
                Destroy(selectionReference);
            }
        }
    }
}
ese script rota los objetos según la posición de un objeto de referencia como en la imagen 3 sumándole la cantidad de grados de la variable rotación, este valor es sumado a su rotación actual cada vez. las transformaciones serian con respecto al eje global.la segunda es usar los hinge joint de Unity para hacer un efecto como de visagra, mas complejo de usar por la cantidad de parámetros:ref:http://docs.unity3d.com/es/current/Manual/class-HingeJoint.html

Bye Bye



aquí un video de lo que me imagine, es mas fácil traspasar la idea que solo con imágenes así fue con lo que lei de lo expuesto, en la descripción esta un unitypack para descargar, lo cree con Unity 5.2.0f3  

Bye Bye



Bueno es sorprendente lo que haces para aclarar una duda, nunca imagine que la gente hiciera es tipo de cosas :D.Con respecto a:
entonces quieres heredar la posición y rotación del cubo rojo para calcular la rotación del cubo azul sumado en 1mt en al gun eje?[/quote]La respuesta es si quiero heredar la posición y rotación, porque en mi caso el cubo rojo es un objeto estático, mientras que el azul es objeto que no tiene posición y rotación especifica, entonces uso http://docs.unity3d.com/ScriptReference/Physics.Raycast.html" rel="external nofollow">Physics.Raycast para observar el cubo rojo, que tiene un script con los datos de posición, rotación y dirección, en ese script es donde tengo que colocar algún tipo de calculo, que me de los datos adecuados, de todas formas mirare muy bien tu script, quizás me este saltando algo y con suerte obtenga lo deseado.Gracias a todos de verdad  tomare en cuenta lo que dijeron y bueno no les quito mas tiempo, que pasen buenos dias, tarde o noche adios =P

[quote author=Oak Human Flesh" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="26002" data-ipsquote-contentcommentid="113046">aquí un video de lo que me imagine, es mas fácil traspasar la idea que solo con imágenes :D

Septiembre 24, 2015, 07:03:34 AM #12 Ultima modificación: Septiembre 24, 2015, 07:19:24 AM por Oak Human Flesh
[quote author=alex_azuaje" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="26002" data-ipsquote-contentcommentid="113081">Bueno es sorprendente lo que haces para aclarar una duda, nunca imagine que la gente hiciera es tipo de cosas :D.Con respecto a:La respuesta es si quiero heredar la posición y rotación, porque en mi caso el cubo rojo es un objeto estático, mientras que el azul es objeto que no tiene posición y rotación especifica, entonces uso http://docs.unity3d.com/ScriptReference/Physics.Raycast.html">Physics.Raycast para observar el cubo rojo, que tiene un script con los datos de posición, rotación y dirección, en ese script es donde tengo que colocar algún tipo de calculo, que me de los datos adecuados, de todas formas mirare muy bien tu script, quizás me este saltando algo y con suerte obtenga lo deseado.Gracias a todos de verdad  tomare en cuenta lo que dijeron y bueno no les quito mas tiempo, que pasen buenos dias, tarde o noche adios =P[/quote]No hay problema, algunos han creado unos video tutoriales enteros mas de 100 capitulos, esto es nada comparado a eso Exito :D

Bye Bye



Gracias http://unityspain.com/profile/25934-oak-human-flesh/?do=hovercard&referrer=http%253A%252F%252Funityspain.com%252Ftopic%252F26002-ayudacomo-calcular-la-posici%25C3%25B3n-de-un-objeto-cuando-interviene-una-rotaci%25C3%25B3n%252F" title="Go to Oak Human Flesh's profile" id="ips_uid_5" style="box-sizing: border-box; color: inherit; text-decoration: none; outline: 0px; background-color: transparent;" href="<___base_url___>/profile/25934-oak-human-flesh/">Oak Human Flesh lo tomare en cuenta .

 Muy buenas, gracias a todos los que me trataron de ayudar con mi duda, luego de un tiempo estudiando un poco las rotaciones y demás, conseguí la solución que tanto esperaba, y pues mencione que si, lo lograba pues os diría, por si alguien también cae en la duda y pues espero que le sirva.[quote author=alex_azuaje" data-ipsquote-contapp="forums" data-ipsquote-contenttype="forums" data-ipsquote-contentclass="forums_Topic" data-ipsquote-contentid="26002" data-ipsquote-contentcommentid="113007">Sin mas que decir, espero que podáis entender, y que os sirva por si tiene alguna duda, ADIOS :)

Etiquetas: