Rotación/traslación sobre un eje cualquiera en python
Rotación/traslación sobre un eje cualquiera en python
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.
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
Hoal kevek
Lo quieres usar para animar o para game engine?
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
http://www.henciclopedia.org.uy/autores ... Morita.htm
Re: Rotación/traslación sobre un eje cualquiera en python
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.
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
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!
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
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
# 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
al pie de la colina
la luna como un sello
http://www.pawean.com/MVM/index.html
Re: Rotación/traslación sobre un eje cualquiera en python
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).
Y la llamada a la función:
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.
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
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 )
Y nada, aquí os la dejo por si a alguien le interesa.
Gracias.