Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Mover Objetos Estilo 3d Studio Max

Iniciado por Sergio, 07 de Septiembre de 2004, 09:01:42 PM

« anterior - próximo »

Sergio

 Hola!
Estoy intentando hacer algo como el 3D Studio MAX moviendo objetos con el raton. Aparecen los ejes y si pinchas en uno pues arrastras al objeto por ese eje. El problema es que no se como transformar las coordenadas del raton para pasarlas a 3D y que el objeto siempre siga al raton.
He mirado el source de Wings3D pero al ser en ¿perl? no me he enterado de una mierda xDDD
Me interesa mas la teoria que el codigo, pero se agradece cualquier cosa ;)

Gracias de antemano
Un saludo!!
here are only 10 types of people: those who understand binary and those who don't

Sacrifai

  :rolleyes:  Me parece que yo intenté hacer algo asi y no lo conseguí  (ole)  XDDDDDD.

Sergio

 Ya he encontrado las ecuaciones necesarias para transformarlo y funciona de PM :D
El problema es que no entiendo por que se hace cada cosa, pero bueno xDDD
Aqui teneis, es code de Blitz3D, pero se entiende perfectamente :)

; -----------------------------------------------------------------------------
; PositionEntityFrom2D ()
; -----------------------------------------------------------------------------
; Positions an entity at 3D x/y co-ords translated from given 2D co-ords, at
; specified z position. Useful for positioning an entity at mouse x/y position,
; at its current z depth...
; -----------------------------------------------------------------------------
; PARAMETERS...
; -----------------------------------------------------------------------------
; REQUIRED...
; -----------------------------------------------------------------------------
; entity is the entity to be positioned.
; x2d is the 2D x position you want translated to 3D.
; y2d is the 2D y position you want translated to 3D.
; z3d is the * 3D * z depth at which the translation should occur.
; -----------------------------------------------------------------------------
; OPTIONAL...
; -----------------------------------------------------------------------------
; positionGlobal defaults to false, as per PositionEntity.
; camZoom must be set manually if you've used CameraZoom to change it...
; -----------------------------------------------------------------------------

Function PositionEntityFrom2D (usecam, entity, x2d#, y2d#, positionGlobal = 0, camZoom# = 1)
gw = GraphicsWidth ()
gh = GraphicsHeight ()
x# = -((gw / 2) - x2d)
y# = (gh / 2) - y2d
parent = GetParent (entity)
EntityParent entity, usecam
z3d# = Abs (EntityZ (entity))
div# = (gw / (2 / camzoom)) / z3d
PositionEntity entity, x / div, y / div, z3d, positionGlobal
EntityParent entity, parent
End Function


Espero que os sea util :)
here are only 10 types of people: those who understand binary and those who don't

ethernet

 creo que deberás usar gluUnproject o usar el picking de opengl

saludos

Zaelsius

 Sergio, el tema está en realizar las transformación inversa de la matriz de vista/proyección.

A partir de un par (x,y) en dos dimensiones y una Z arbitraria, multiplicándolos por la inversa de la matriz combinada de vista y proyección(en GL sólo hay vista) obtendrias el punto en 3 dimensiones. Si, por ejemplo realizases la transformación para (x,y,near_plane) y luego para (x,y,far_plane), obtendrias un rayo que recorre el volumen de visión en la dirección de la cámara y que pasa por dichos puntos.

Con ese rayo puedes calcular colisiones con objetos y actuar consecuentemente.

Como ha dicho Ethernet, si usas OpenGL busca en Google ejemplos de glUnproject. Para DirectX, habia un ejemplo de picking en el SDK de DirectX8.1(un tigre del que podias seleccionar triángulos individuales), en el último ya no viene.

BeRSeRKeR

 Para Direct3D tienes la función D3DXVec3Unproject.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Sergio

 Muchas gracias por contestar!! Esta vez en concreto lo necesitaba para Blitz3D, pero ya lo se para cuando lo necesite en DX y OpenGL :)

Muchas gracias de nuevo (ole)  (ole)  
here are only 10 types of people: those who understand binary and those who don't

Pogacha

 Que tal, hace unos años hize un editor en base a construccion por geometria solida para mapas tipo quake, asi que tengo experiencia en el tema.

Primero necesitas, una funcion:

Vector2d Transformar(Vector3d v);

// generalmente esta ya la tienes con el sistema que uses, y constan de un par de matrices y una proyeccion ...

despues la que te cuentan los otros:

Vector3d Anti_Transformar(Vector2d, Z_Arbitrario);

Que sera en ejemplo:

Transformar:

v3d=(v3d * ModelView) * ProjView;
v2d.x= v3d.x/v.z;
v2d.y= v3d.y/v.z;
return v2d;

entonces anti_transformar:

v3d.x= v2d.x*Z_Arbitrario;
v3d.y= v2d.y*Z_Arbitrario;
v3d.z=z_Arbitrario;
v3d=(v3d * ProjView.Inversa()) * ModelView.Inversa();
return v3d;


Y mas inportante aun, por cada objeto tendras que tener un Z de referencia, por ejemplo el varicentro o el centro de gravedad o si tiraste un rayo para determinar que objeto mover, puedez usar el z de intersección.
Este Z ira en Z_Arbitrario.

Obiamente todas estas cordenadas son despues de la transformacion de la camara (creo que ahora le dicen eye-space).

Saludos.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.