Game Development Community

A brief example of rotate objects in the Playgui

by ERICK MIRANDA M · in Torque Game Engine · 07/23/2009 (10:21 am) · 0 replies

Les comparto un ejemplo que es muy básico pero que nos ayuda a rotar objetos en tiempo real directamente sobre el playgui.

Antes que nada debemos tener en consideración la instrucción getTransform y setTransform. La instrucción getTransform nos provee de datos importantes, los 3 primeros parámetros nos dan la posición del objeto... los siguientes 3 parámetros nos dan el eje de giro del objeto y el último parámetro nos da el grado de rotación que le daremos a nuestro objeto.

A continuación les pongo un ejemplo básico.

function TurnShape(%shape, %angle)

{
	
	if($onMenu)
	{
        //%nuevoAng = %angle * 3.1415926 / 180;	
	%gradoProc = mDegToRad(%angle);
	}
	else
	%gradoProc = mDegToRad($nuevoGrad);
		
   %xfrm = %shape.getTransform();
   %lx = getword(%xfrm,0);
   %ly = getword(%xfrm,1);
   %lz = getword(%xfrm,2);
   %rx = 0; //getword(%xfrm,3);
   %ry = 0; //getword(%xfrm,4);
   %rz = 1; //getword(%xfrm,5);
   //%rd = getword(%xfrm,6);

   %rd = %gradoProc;
   %nuevaRotacion = (%lx SPC %ly SPC %lz SPC %rx SPC %ry SPC %rz SPC %rd);
   echo(%nuevaRotacion);
	%shape.setTransform(%nuevaRotacion);
	$nuevoGrad = mRadToDeg(%rd);
	$nuevoGrad += $rot;
	$onMenu = false;
}

Lo explicaré con mas detalle.

Suponemos que tenemos un botón que llama un menú (Canvas.popDialog(RotateShape)), en ese menú tenemos un GuiTextEditCtrl que le asignaremos la variable $rot y un botón que al presionarlo nos permitirá girar el objeto (rotará con la dirección de las manecillas del reloj), al botón le asignaremos el command TurnShape($objetoID, $rot); Como se darán cuenta nuestra función recibe dos datos, el ID de nuestro objeto (el cual vamos rotar) ya nos las ingeniamos para darle ese valor, y el otro dato que recibe es el número de grados que va a girar nuestro objeto que es la variable $rot.

Ahora nos centramos en el código de la función. Al dar click en el botón llamamos la función TurnShape y le estamos pasando dos datos. Al inicio comparamos con una variable llamada $onMenu, si "onMenu = true", esta variable es verdadera cada vez que entre al menu de rotar objeto para que se asigne por primera vez el ángulo que nosotros estamos dando. Si se dan cuenta aparece una línea comentada, que es una formula para convertir los grados a radianes, ya que para la manipulación de nuestro shape debemos dar el ángulo en radianes, normalmente nosotros estamos acostumbrados a dar los ángulos en grados 90 180 360... Entonces lo que se hace es que el ángulo lo convertimos de grados a radianes. Después obtenemos la información necesaria de nuestro objeto, su posición y sus ejes para saber en que eje se aplicará el giro...

Nota: podemos asignar previamente el ángulo de giro de nuestros objetos, generalmente es de esta manera x y z, donde todos los ejes son 0 a excepción del eje donde aplicaremos el giro que será 1, entonces si queremos girar sobre el eje z la instrucción sería "rotation = "0 0 1 0"; el último valor indica el giro sobre el eje seleccionado.

... en el caso del ejemplo, para asegurar el eje de giro asigno al eje z el valor 1, de tal manera que mi objeto girará sobre el eje z.

Lo que se hace en es parte del código es separar individualmente cada valor del getTransform del objeto y se guardan los valores en variables individuales. Si se dan cuenta %rd esta comentado, esa variable nos da el ángulo de giro actual de nuestro objeto, no lo necesitamos porque nosotros le asignamos el nuevo valor de giro en la siguiente linea. Ese ángulo lo obtuvimos del principio cuando convertimos nuestro ángulo en radianes.

En seguida asignamos los nuevos valores, tanto de posición como de giro a un nuevo vector que en este caso es %nuevaRotacion y aplicamos ese vector al objeto con la instruccion setTransform y de esa manera hemos girado nuestro objeto.

Las siguientes lineas son para que si el usuario sigue dando click sobre el objeto, este continue girando. Lo que hacemos es convertir nuevamente de radianes a grados el ángulo que estamos aplicando y le sumamos el ángulo que aparece en el cuadro donde el usuario ingreso el ángulo de giro en el menu, por eso aparece $rot en la suma ya que es el ángulo del usuario y terminamos haciendo nuestra variable onMenu = false para que en la siguiente pasada no genere un nuevo ángulo si no que sume al actual ángulo con el ángulo del usuario, eso lo podemos ver en la linea de %gradoProc = mDegToRad($nuevoGrad); que se encuentra en el else del if.

Básicamente eso es todo y nos permite girar nuestro objeto sin ningún problema. Hay un pequeño problema todavia es cuando el usuario cambia el ángulo en el menu este no se actualiza hasta la segunda vez que se da click en el boton, es decir, que el primer giro conserva el ángulo anterior y después actualiza al nuevo angulo.

Se piensa implementar un botón que diga nuevo ángulo, de manera que limpie $rot, la variable onMenu sea true y asi el usuario ingrese nuevamente el ángulo para saltarnos ese error.

See you pals...