Jump to content
Sign in to follow this  
Megadok

Posición según rotación 2d.

Recommended Posts

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

ejemplo_lenght_dir.jpg

Share this post


Link to post
Share on other sites
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

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

Share this post


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

×
×
  • Create New...