Megadok 9 Report post Posted August 26, 2020 Hola de nuevo, quiero aclarar que aunque este post se parezca en contenido a uno mio anterior, no es para nada el mismo.😼 Me gustaría saber cómo posicionar un objeto "B" a una distancia del objeto "A" teniendo en cuenta su dirección y además su rotación. Adjunto una imagen de ejemplo. Es decir que si giro el objeto "A", el "B" que está a una distancia relativa debe girar al son del objeto "A". Gracias.👾 Share this post Link to post Share on other sites
francoe1 536 Report post Posted August 26, 2020 transform.right = target.position - transform.position; Share this post Link to post Share on other sites
Megadok 9 Report post Posted August 26, 2020 1 hour ago, francoe1 said: transform.right = target.position - transform.position; No , me temo no me has comprendido. Por ejemplo: target.transform.position = new Vector3(transform.position.x, transform.position.y + distancia,1); De esta manera el punto B esta en una posición relativa y a una distancia relativa al punto A. Si muevo el punto A, el punto B se desplaza con el punto A a posicion y distancia relativos. Yo lo que quiero es que si , roto el punto A(si lo giro), rote también el punto B, siguiendo respetando la distancia a la que esta con respecto al punto A. Share this post Link to post Share on other sites
lightbug 836 Report post Posted August 26, 2020 Bueno, no se si te entendí bien, pero creo que simplemente buscas rotar un vector. Para eso podés aplicar alguna rotación (Quaternion) al vector deseado. Voy a suponer que tu objeto tiene un componente separado que hace de "voy a seguir a este objeto en base a la distancia que tengo a él, y además voy a rotar con él". Como el objeto va a seguir a otro, podés ir pensando en actualizarlo después de este. Esto lo podés hacer mediante ExecutionOrder (en las opciones), un atributo llamado DefaultExecutionOrder, o simplemente usar LateUpdate. En este caso uso LateUpdate: [SerializeField] Transform target = null; [SerializeField] float distance = 2f; [SerializeField] Transform target = null; Quaternion prevRotation; Vector3 diff; void Start() { prevRotation = target.rotation; diff = distance * ( target.position - transform.position ).normalized } void LateUpdate() { // El target ya se movió y rotó // Calculo la rotación Quaternion rotDif = Quaternion.FromToRotation( prevRotation , target.rotation ); // Ya calculé la diferencia de rotación, ahora actualizo prevRotation prevRotation = target.rotation; // Calculo diff rotado diff = rotDif * diff; // Posiciono este objeto en base a diff transform.position = target.position + diff; } (para rotar un vector siempre la expresión debe quedar en "sanguchito" --> Vector3 = Quaternion * Vector3 ) Seguramente haya una forma más fácil. Share this post Link to post Share on other sites
Megadok 9 Report post Posted August 26, 2020 12 minutes ago, lightbug said: Bueno, no se si te entendí bien, pero creo que simplemente buscas rotar un vector. Para eso podés aplicar alguna rotación (Quaternion) al vector deseado. Voy a suponer que tu objeto tiene un componente separado que hace de "voy a seguir a este objeto en base a la distancia que tengo a él, y además voy a rotar con él". Como el objeto va a seguir a otro, podés ir pensando en actualizarlo después de este. Esto lo podés hacer mediante ExecutionOrder (en las opciones), un atributo llamado DefaultExecutionOrder, o simplemente usar LateUpdate. En este caso uso LateUpdate: [SerializeField] Transform target = null; [SerializeField] float distance = 2f; [SerializeField] Transform target = null; Quaternion prevRotation; Vector3 diff; void Start() { prevRotation = target.rotation; diff = distance * ( target.position - transform.position ).normalized } void LateUpdate() { // El target ya se movió y rotó // Calculo la rotación Quaternion rotDif = Quaternion.FromToRotation( prevRotation , target.rotation ); // Ya calculé la diferencia de rotación, ahora actualizo prevRotation prevRotation = target.rotation; // Calculo diff rotado diff = rotDif * diff; // Posiciono este objeto en base a diff transform.position = target.position + diff; } (para rotar un vector siempre la expresión debe quedar en "sanguchito" --> Vector3 = Quaternion * Vector3 ) Seguramente haya una forma más fácil. // Calculo la rotación Quaternion rotDif = Quaternion.FromToRotation( prevRotation , target.rotation ); Quaternion.FromToRotation es para vectores no para quaternios, me da error. Share this post Link to post Share on other sites
lightbug 836 Report post Posted August 26, 2020 (edited) 44 minutes ago, Megadok said: Quaternion.FromToRotation es para vectores no para quaternios, me da error. Ahhh cierto, perdón. Sí, vas a tener que usar cualquier dirección del target como referencia. Por ejemplo target.forward. En vez de guardar prevRotation vas a tener que guardar el prevForward (Vector3 en vez de Quaternion): void Start() { prevForward = target.forward; diff = distance * ( target.position - transform.position ).normalized } void LateUpdate() { ... // Calculo la rotación Quaternion rotDif = Quaternion.FromToRotation( prevForward , target.forward ); // Ya calculé la diferencia de rotación, ahora actualizo prevRotation prevForward = target.forward; ... } Agrego: se puede calcular la diferencia de rotaciones así: Quaternion deltaRotation = rotationA * Quaternion.Inverse( rotationB ); Hacelo como quieras, con Vector3 o con Quaternions. Edited August 26, 2020 by lightbug Share this post Link to post Share on other sites