News:

SMF - Just Installed!

Main Menu

Capturar posicion subobjeto en una rotacion

Started by Alejandro.Valera, May 12, 2012, 04:51:43 PM

Previous topic - Next topic

Alejandro.Valera

Un saludo.

Tengo un subobjeto de un componente, el cual muevo con una rotacion. (Este se encuentra desplazado de su eje de rotacion), no gira sobre si mismo sino que lo hace describiendo una circunferencia con respecto de un eje.

Puedo capturar la variacion de posicion del subobjeto box[2] si hago desplazamientos del mismo. Pero si realizo una rotacion de box[2] es como si me diera la posicion de centro de giro y no la nueva posicion del objeto, por lo tanto no me refleja los cambios de posicion de las mallas ante giros.

Dejo parte del codigo incompleto, pues ahora no estoy con mi Pc, y creo que esta es la toda la parte el codigo esencial para ver que trato de hacer. 

Quiero capturar la posicion de la malla de box[2] que es diferente de la del centro de su giro con la instruccion box[2].body.position;
para despues asignarsela a box[3], y asi que esta se coloque en la posicion de la malla de box[2].

float n=0;
Vector3 = posicVector;

n += 1;
Editor.RotateZ(2, n+1);
posicVector = box[2].body.position;
Editor.Translate(3, posicVector);

EasyPLC_Master

Por lo que comentas, intentas realizar un movimiento de órbita.
Te adjunto la siguientes indicaciones acerca de la secuencia de operaciones necesarias para movimientos complejos (aquellos que no son simples traslaciones o rotaciones)

Transformation Order

The order that the matrices for scaling, rotating, and translating are combined is significant.
For successful transformations, it is essential that you combine individual
transformations in the following order:
1. Set the Identity.
2. Scale the object.
3. Revolve the object about its axis.
4. Orbit the object about an external point. (This involves a translation followed by a rotation.)
5. Translate the object.
To remember the order of transformations for the Right Hand Rule, use the I.S.R.O.T. sequence. I.S.R.O.T. stands for Identity, Scale, Revolve, Orbit, Translate.

Aplicandolo a un ejemplo concreto, te adjunto el código de un componente con un solo elemento, que realizaría un movimiento de órbita en el eje Y con respecto a un origen (0,0,0). Sería como el movimiento orbital de la luna con respecto a la tierra.

Vector3 scal;
Vector3 pos;
float rot = 0;

public void Init()
{
scal = Editor.ComponentScale();
pos = box[0].body.Position;
}

public void Main(GameTime gameTime)
{
rot += 10 * Compensation(gameTime);
  if(rot > 360)
     rot = 0;
 
Matrix mRotY = Matrix.CreateRotationY(MathHelper.ToRadians(rot));
// I.S.R.O.T
Matrix worldMatrix = Matrix.Identity * Matrix.CreateScale(scal) * Matrix.CreateTranslation(10, 0, 0) * mRotY * Matrix.CreateTranslation(pos);               
box[0].body.Position = worldMatrix.Translation;
box[0].body.Orientation = mRotY;


}

public void Draw(GameTime gameTime)
{

}

public void Finish()
{

}