Página 1 de 1

Rotación/traslación sobre un eje cualquiera en python

Publicado: Sab Abr 21, 2012 11:43 am
por kevek
Hola,

Estoy intentando hacer en python que un objeto gire alrededor de otro objeto, como lo hace por ejemplo un planeta alrededor del Sol.

Según he estado investigando se puede hacer con matrices de transalación/rotación... pero estoy seguro que la libreria math debe tener funciones que lo hagan, pero no sé cuales son ni como usarlas.

Alguien tiene algún ejemplo?

Gracias por adelantado.

Re: Rotación/traslación sobre un eje cualquiera en python

Publicado: Sab Abr 21, 2012 1:40 pm
por Bucefalo
Hoal kevek

Lo quieres usar para animar o para game engine?

Re: Rotación/traslación sobre un eje cualquiera en python

Publicado: Sab Abr 21, 2012 4:15 pm
por kevek
Para game.

Más concretamente lo que pretendo es controlar este movimiento con las flechas izquierda/derecha del teclado.

El control de teclado ya lo tengo hecho, el objeto se mueve en el sentido que yo le indico, pero necesito que este movimiento hacia izquierda/derecha describa un movimiento circular tomando como eje un punto en el espacio.

Espero haberme explicado bien.

Re: Rotación/traslación sobre un eje cualquiera en python

Publicado: Dom Abr 22, 2012 12:45 am
por Leandrosz
Ya se que no es la respuesta que estás esperando, pero y si emparentás el objeto a otro invisible (un empty, o algo así) que esté en el centro de rotación y hacés que el teclado controle la rotación de este? Es un workaround, pero por ahí te facilita las cosas...

Por las dudas aclaro: nunca usé el game engine! No es la parte de Blender que maś me atraiga...

Saludos!

Re: Rotación/traslación sobre un eje cualquiera en python

Publicado: Dom Abr 22, 2012 2:50 am
por Agestevez
Hola kevek, yo creo que es relativamente fácil hacer lo que quieres.


# define el controlador
controller = GameLogic.getCurrentController()

# defines el objeto que mueve el controlador
obj = controller.owner

# defines la cantidad de rotación (X, Y, Z)
rotation = [ 0.0, 0.0, 0.1]

# usas el eje \"world\"
local = False

# mueves el objeto en el GE
obj.applyRotation( rotation, local)


Saludos

Re: Rotación/traslación sobre un eje cualquiera en python

Publicado: Dom Abr 22, 2012 5:42 pm
por kevek
Hola, gracias por vuestras ideas, ya pude hacerlo!

Pero al final opté por la trigonometría.

Primero intenté hacerlo emparentando, desplazando el eje pivote en el centro del objeto del cual quería tomar como eje... y luego hacerle el ApplyRotation, pero me encontré con el problema que si el otro objeto se mueve... arrastra consigo al otro objeto también.

Al final me monté una función en la que uso un sistema de ecuaciones de rotación 2D, a la que le meto la longitud de arco de circunferencia que quiero recorrer y el sentido (-1 para izquierda y 1 para derecha), y me devuelve la nueva posicion (x,y).

Código: Seleccionar todo

def desplazamiento_lateral( longitud_arco, sentido ):
    
    posx = 0
    posy = 0
    
    x2 = player.position[0]
    y2 = player.position[1]
    
    x1 = enemy.position[0]
    y1 = enemy.position[1]
    
    radio = m.sqrt( (x2 - x1)**2 + (y2 - y1)**2 )
    
    angulo = longitud_arco / radio
    
    angulo = angulo * sentido

    posx = x1 + ( x2 - x1 ) * m.cos(angulo) - ( y2 - y1 ) * m.sin(angulo)
    posy = y1 + ( x2 - x1 ) * m.sin(angulo) + ( y2 - y1 ) * m.cos(angulo)
    
    return posx, posy
Y la llamada a la función:

Código: Seleccionar todo

import GameLogic as gl
from bge import events
import math as m

scene  = gl.getCurrentScene()
player = scene.objects[\"Player\"]
enemy  = scene.objects[\"Enemy\"]

# keyboard control    
    keyboard = gl.keyboard.events
    if keyboard[events.LEFTARROWKEY]:
        player.position[0], player.position[1] = desplazamiento_lateral( 0.1, -1 )
        
    if keyboard[events.RIGHTARROWKEY]:
        player.position[0], player.position[1] = desplazamiento_lateral( 0.1, 1 )
En la función, el objeto enemy lo tomo como el eje de rotación, y el objeto player es el que roto alrededor de dicho eje.

Y nada, aquí os la dejo por si a alguien le interesa.

Gracias.