Diciembre 05, 2011, 05:00:27 PM Ultima modificación: Diciembre 05, 2011, 06:36:42 PM por DarkKRuleR
Holap! Pues estoy probando modificaciones en 3D, y el tema me tiene algo frito xD Mirad los siguientes ejemplos, reduci?ndolo todo a lo simple.



d3d_transform_set_identity();
d3d_transform_add_translation(0,0,-20);
d3d_transform_add_rotation_y(variable);
d3d_transform_add_translation(x,y,20);
d3d_draw_cylinder(0,0,0,5,5,20,textura,1,1,1,20);
d3d_transform_set_identity();


Seg?n la anterior imagen y el c?digo que puse, yo dibujo un cilindro, de base circular (0,0,5,5), y altura (0,20), o sea, de z=0 a z=20. Entonces, quiero rotar por el eje y la figura DESDE EL PUNTO MARCADO EN LA IMAGEN. O sea, quiero rotarla poniendo el eje de rotaci?n en ese punto. Por lo tanto, hago translaci?n a x=0, y=0, z=-20, ya que el punto est? situado a z=20, con esto situo ESE PUNTO a z=0, lo roto, y lo vuelvo a transportar a x=x, y=y, z=20. Todo esto para preparar el terreno para ESA rotaci?n, tras eso la dibujo tal cual, y cuando modifique la variable, lo rotar? autom?ticamente.

Ahora pongamos que parto verticalmente el cilindro en DOS CILINDROS, uno de z=0 a z=10 y otro de z=10 a z=20, vamos, lo parto en dos. Y quiero que el de abajo pueda rotar libremente sobre su eje superior en z=10, y el de arriba igual. Pero claro... Esto implica varias rotaciones. Yo tengo esta teor?a

d3d_transform_set_identity();
d3d_transform_add_translation(0,0,-10);
d3d_transform_add_rotation_y(valor1);
d3d_transform_add_translation(0,0,-20);
d3d_transform_add_rotation_y(valor2);
d3d_transform_add_translation(x,y,10);
d3d_draw_cylinder(0,0,0,5,5,10,textura,1,1,1,20); //cilindro inferior
d3d_transform_set_identity();

d3d_transform_add_translation(0,0,-20);
d3d_transform_add_rotation_y(valor2);
d3d_transform_add_translation(x,y,20);
d3d_draw_cylinder(0,0,10,5,5,20,textura,1,1,1,20); //cilindro superior
d3d_transform_set_identity();


Explico: pod?is tomarlo como un BRAZO, donde tenemos dos cilindros unidos por el codo: el primer cilindro rota libremente pegado al codo, y el segundo pegado al hombro, pero el primero siempre sigue al segundo. En teor?a, el ?ltimo c?digo que puse, primero rota el cilindro inferior respecto al eje y un valor1, pero respecto a su m?ximo 10. Luego, lo rota todo de nuevo respecto a su valor 20. Y luego rota este segundo cilindro respecto el 20, el superior.

Vamos, que tengo dos cilindros, y quiero que ambos roten sobre el eje y, el de arriba, que llega de z=10 a z=20, rota sobre el punto z=20, y el segundo, de z=0 a z=10, rota sobre el punto z=10, ambos sobre el eje y. Y para conseguir que se muevan como un brazo hacia adelante y atr?s (eje y), puedo rotar libremente el cilindro inferior respecto a z=10, pero luego tengo que rotar este cilindro inferior respecto a z=20 el valor que rotar? el superior, para que siempre su punto maximo encaje con el cilindro superior a modo de codo.

Pero no funciona ya que no puedo hacer dos translations... y necesito hacer dos translations, ya que tengo que rotar DOS VECES DESDE DOS PUNTOS DISTINTOS, conque tengo que transportarlo a un punto, rotar, transportarlo a otro punto y rotar, y es eso lo que falla... >_<



A la pr?ctica, cuando lo ejecuto, el cilindro inferior desaparece. No s? qu? hago mal, quiz?s en algunos lados tengo que usar un "set" y no un "add", no lo tengo claro...

Hola de nuevo... Ver?s las rotaciones en Game Maker son un asunto un tanto delicado... Pero si lo que necesitas es que rote solo en el eje Y entonces es f?cil....

Mira, el primer brazo (el superior que mide 20) lo giras en torno a su punto de (-20) para que gire en (como si fuera el hombro), luego para articular el codo:

giras el inferior que mide 10 en su punto (-10) y luego lo mueves y lo giras en torno al brazo (-20)

Esto solo funciona cuando es en una direcci?n, porque si son mas, entonces tendr?s que pelear con otro asunto ;)

Te dejo un ejemplo :GM8: para que le heches un vistazo y me avises.


Saludos

Checa mi canal de Youtube para tutoriales y charlas sobre desarrollo de videojuegos.


Bien, dejado de lado unas tonter?as, ha sido un exitazo! He conseguido que levante los brazos RESPECTO AL HOMBRO 90? y otros 90? lo del codo, haciendo una barrera vertical. S?lo me falta rotar la z 45?, pero de momento he logrado esto gracias a tu ejemplo, conque ya vale. Consegu? aprender c?mo va lo del translation, que al final tienes que volverlo al punto 0,0,0, cosa que no sab?a ^^
gracias! +karma y tema resuelto, podr?a decirse.
(veamos si en 2 horas me acuerdo de darte el karma, no deja dar dos veces seguidas xD)