Jump to content
UnitySpain

Aceptamos donaciones vía Paypal.

UnitySpain.com es un servicio gratuito, pero mantener la Comunidad conlleva una serie de gastos.

Fondo Anual Unityspain: Donados 0€ de 150,00€

  • Servidor: Dominio.com y Hosting Web
  • Mantenimiento de los Foros
  • Contenido y Servicios Extras
  • Mantenimiento para Redes Sociales
Sign in to follow this  
Naxz

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

Recommended Posts

Buenas, tengo una duda con respecto a lo siguiente:

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

(A)                                                           (B)

Op1.thumb.png.9e017596fbaeae109b780ef7deOp2.thumb.png.fa91caff6cf077dc260d3e61ff

Luego de darle una rotación Vector3(0,45,0) a ambos objetos, al realizar la acción con la rotación los objeto en el Editor de Unity da como resultado:

Op3A.thumb.png.87e890fbc4f3f3391ff777a63

Pero al realizar esta misma operación, por código y rotación por separado me da este resultado:

Op3B.thumb.png.867bdcfe86cf94b99ef1ed195


Cosa que quiero que me de el mismo resultado que me da con el editor de Unity.

Se que para conseguirlo debo usar algún tipo de calculo matemático que desconozco, se que un objeto sin rotación se mueve fácilmente aplicándole un valor a el (X),(Y) o (Z), pero si tiene una rotación creo que hay que aplicar valores a 2 Vectores y calcular ese valor con la rotación o usar alguna función de Mathf.

Espero que me puedan ayudar, se los agradecería mucho gracias :).

 

Edited by alex_azuaje

Share this post


Link to post
Share on other sites

Yo lo que veo es:

1er caso:  Los dos cubos en el mismo gameobject, rotación del cubo azul

2o 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.

Share this post


Link to post
Share on other sites

Bueno, primero que nada gracias por responder.

Los cubos no están en un mismo 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 Quaternion 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.

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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.

 

Share this post


Link to post
Share on other sites

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 Oak Human Fleshhasta 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. 

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 :).

Edited by alex_azuaje

Share this post


Link to post
Share on other sites

¿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...

 

Share this post


Link to post
Share on other sites

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.

asdasdad.thumb.png.84e03b5203b5753939558

Edited by alex_azuaje

Share this post


Link to post
Share on other sites

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.

asdasdad.thumb.png.84e03b5203b5753939558

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 jajajaja

esta es la primera obviamente:

using UnityEngine;
using System.Collections;

public class TransformController : MonoBehaviour
{
    public float rotacion = 45f;
    public Transform[] objects;
    private GameObject selectionReference;
    /// <summary>
    ///  crea un objeto, a todos los gameObjects en escena automaticamente se les asigna el componente transform.
    /// </summary>
    void InitSelectionObject()
    {
        selectionReference = new GameObject();
        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[i]
                    objects[i].parent = selectionReference.transform;
                    // rota el object[i] usando como eje el eje z y la posicion del selectionReference obj.
                    objects[i].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

Edited by Oak Human Flesh

Share this post


Link to post
Share on other sites

aquí un video de lo que me imagine, es mas fácil traspasar la idea que solo con imágenes :D

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

 

 

Edited by Oak Human Flesh

Share this post


Link to post
Share on other sites

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?

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 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

Share this post


Link to post
Share on other sites

aquí un video de lo que me imagine, es mas fácil traspasar la idea que solo con imágenes :D

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

 

 

Como siempre genial!

Edited by iRobb

Share this post


Link to post
Share on other sites

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 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

No hay problema, algunos han creado unos video tutoriales enteros mas de 100 capitulos, esto es nada comparado a eso ;)

tal vez entonces solo para pruebas o entender un poco el concepto, puedes modificar el script en la linea que dice asi:

selectionReference.transform.position = (objects[0].position + objects[objects.Length - 1].position) * 0.5f;

reemplazandola por esta:

selectionReference.transform.position = objects[0].position;

entonces en el inspector se puede asignar el cubo rojo en el elemento 0 de la variable objects.

y en la linea del for tal vez pones esto (a no ser de que desees un efecto en el cubo rojo):

for (int i = 1;...

Bueno es una idea :)

Exito :D

 

 

Edited by Oak Human Flesh

Share this post


Link to post
Share on other sites

 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ásconseguí 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.

asdasdad.thumb.png.84e03b5203b5753939558

Como se hablo anteriormente la duda trataba sobre como obtener o heredar la posición y rotación de un objeto el cual no puede ser modificado, y con esto generar una nueva posición y rotación, para un nuevo objeto.

Como se aprecia en la figura el objeto sin rotación, es un conjunto de cubos los cuales fueron creados 1x1 y al apuntar cada una de sus caras, se iba obteniendo posición y rotación con respecto a la cara y así seleccionar por que lado colocar el cubo (Ordenado).

Ahora con respecto a la figura el objeto con rotación, es un conjunto de cubos creados de la misma forma que el anterior 1x1, pero al apuntar las caras, la posición y rotación que estos me dejaban no eran muy parejas a las del objeto base (Desordenado).

Con todo esto pensé que para ello, debía aplicar un mega calculo matemático, o que debería editar el objeto base, aplicando la idea de colocar un objeto padre, dentro objetos hijos y aplicar la rotación, lo cual me modificaría todos los cubos.. Pero en este caso la solución que encontré pues se podría decir que fue realmente muy fácil, y con todo esto es la siguiente.

-Si tienes un objeto con rotación  y una posición, y quieres generar un nuevo objeto en una nueva posición en el orden como el de la figura sin 
rotación, pues basta con saber: 

transform.position +  transform.TransformDirection(Dirección o lado del objeto ejp: Vector3.Forward); del objeto base, y así obtener posición y rotación, del nuevo objeto a colocar.

Donde tenga el angulo que tenga, esto te generara  una nueva coordenada en el orden deseado.

Resultado:

Dibujo12312312.thumb.PNG.c6d04dc88a08be2

Sin mas que decir, espero que podáis entender, y que os sirva por si tiene alguna duda, ADIOS :)

Edited by alex_azuaje

Share this post


Link to post
Share on other sites
Sign in to follow this  

×
×
  • Create New...