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

Preguntas y respuestas relacionadas con el uso y desarrollo de scripts Python y plugins para Blender 3D
Responder
kevek
Mensajes: 27
Registrado: Mar Ene 24, 2012 6:19 pm
Nombre:

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

Mensaje por kevek » Sab Abr 21, 2012 11:43 am

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.

Bucefalo
Mensajes: 882
Registrado: Mar Dic 21, 2004 11:48 am
Nombre:

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

Mensaje por Bucefalo » Sab Abr 21, 2012 1:40 pm

Hoal kevek

Lo quieres usar para animar o para game engine?
Quieres saber que es un \"Pequeño Saltamontes\"

http://www.henciclopedia.org.uy/autores ... Morita.htm

kevek
Mensajes: 27
Registrado: Mar Ene 24, 2012 6:19 pm
Nombre:

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

Mensaje por kevek » Sab Abr 21, 2012 4:15 pm

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.

Leandrosz
Mensajes: 117
Registrado: Dom Mar 13, 2011 10:33 am
Nombre:

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

Mensaje por Leandrosz » Dom Abr 22, 2012 12:45 am

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!

Agestevez
Mensajes: 62
Registrado: Dom Oct 15, 2006 7:47 am
Nombre:
Contactar:

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

Mensaje por Agestevez » Dom Abr 22, 2012 2:50 am

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
Lí­nea de gansos en vuelo
al pie de la colina
la luna como un sello

http://www.pawean.com/MVM/index.html

kevek
Mensajes: 27
Registrado: Mar Ene 24, 2012 6:19 pm
Nombre:

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

Mensaje por kevek » Dom Abr 22, 2012 5:42 pm

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.

Responder