PDA

Ver la versión completa : Pasar de un punto 3d a 2d



cdrman
18/02/2008, 20:03
Hola, estoy haciendo unas pruebas para construir unos ejemplo en 3dimensiones.
Resulta que no encuentro ninguna web que me explique convertir o proyectar una coordenada 3d a 2d.

Si alguno sabe alguna web o algo para que pueda leer a ver si lo entiendo se lo agrecederia.

PD: He mirado en google y no he encontrado nada que me sirva.

gracias.

anibarro
18/02/2008, 20:11
El concepto basico es este:
x2d = x3d/z3d
y2d = y3d/z3d

Luego, dependiendo de las operaciones que le apliques a las coordenadas en 3D, haras zooms, cambios de perspectiva, etc.
Para alejar ya acercar la camara, multiplicas o divides x3d e y3d. Para cambios de perspectiva, multiplicaras y dividiras la z3d. Por ejemplo si la z3d vale 1 siempre, tendras el efecto de una vista colocada en el infinito, perdiendose le perspectiva

cdrman
18/02/2008, 21:58
El concepto basico es este:
x2d = x3d/z3d
y2d = y3d/z3d

Luego, dependiendo de las operaciones que le apliques a las coordenadas en 3D, haras zooms, cambios de perspectiva, etc.
Para alejar ya acercar la camara, multiplicas o divides x3d e y3d. Para cambios de perspectiva, multiplicaras y dividiras la z3d. Por ejemplo si la z3d vale 1 siempre, tendras el efecto de una vista colocada en el infinito, perdiendose le perspectiva
No quiero hacer nada complicado, simplemente queria hacer alguna tonteria con el wiimote, que dependiendo de donde me mueva pues me aleje de la camara, se acerque o se mueva izquierda derecha (mirandolo de cara), y si algo me saliera pues no se, rotar al camara tb.
Primero queria dibujar un cuadrado y con eso ya me basta para hacer la prueba.

Ñuño Martínez
19/02/2008, 10:11
El concepto basico es este:
x2d = x3d/z3d
y2d = y3d/z3d Sí, la fórmula básica es esa, pero se te ha olvidado la distancia. Este es un cuarto valor que indica la distancia a la que se encuentra el punto de vista a la pantalla.

En uno de mis proyectos calculo la distancia así:

DstPant = (cos (FOV / 2) * (ancho_pantalla / 2)) / sin (FOV / 2);

FOV es "Field Of View", esto es, el ángulo de la "lente". cos es coseno y sin es seno.

Añadiendo esto a lo que ha dicho anibarro, la fórmula quedará así:

x = (x3d / z3d) * DistPant
y = (y3d / z3d) * DistPant


Luego, dependiendo de las operaciones que le apliques a las coordenadas en 3D, haras zooms, cambios de perspectiva, etc.
Para alejar ya acercar la camara, multiplicas o divides x3d e y3d. Para cambios de perspectiva, multiplicaras y dividiras la z3d. Por ejemplo si la z3d vale 1 siempre, tendras el efecto de una vista colocada en el infinito, perdiendose le perspectiva Me parece que el día que dieron eso yo no fui a clase :confused:

Las coordenadas 3D funcionan igual que las 2D: incrementas o reduces los valores de los ejes y el punto se mueve en un sentido o en otro.

Por cierto, que girar puntos o vértices es un pelín complicado. Normalmente se utilizan matrices pero yo conocía unas fórmulas para realizar el giro directamente que funciona muy bien con objetos simples y es más rápido. El problema es que no lo tengo a mano y no lo tendré durante una larga temporada :(.

cdrman
19/02/2008, 10:40
Sí, la fórmula básica es esa, pero se te ha olvidado la distancia. Este es un cuarto valor que indica la distancia a la que se encuentra el punto de vista a la pantalla.

En uno de mis proyectos calculo la distancia así:

DstPant = (cos (FOV / 2) * (ancho_pantalla / 2)) / sin (FOV / 2);

FOV es "Field Of View", esto es, el ángulo de la "lente". cos es coseno y sin es seno.

Añadiendo esto a lo que ha dicho anibarro, la fórmula quedará así:

x = (x3d / z3d) * DistPant
y = (y3d / z3d) * DistPant

Me parece que el día que dieron eso yo no fui a clase :confused:

Las coordenadas 3D funcionan igual que las 2D: incrementas o reduces los valores de los ejes y el punto se mueve en un sentido o en otro.

Por cierto, que girar puntos o vértices es un pelín complicado. Normalmente se utilizan matrices pero yo conocía unas fórmulas para realizar el giro directamente que funciona muy bien con objetos simples y es más rápido. El problema es que no lo tengo a mano y no lo tendré durante una larga temporada :(.
Thnks!!! En cuanto pueda me pongo ha hacer algo de pruebas con el wiimote.

dardo
19/02/2008, 11:41
Sí, la fórmula básica es esa, pero se te ha olvidado la distancia. Este es un cuarto valor que indica la distancia a la que se encuentra el punto de vista a la pantalla.

En uno de mis proyectos calculo la distancia así:

DstPant = (cos (FOV / 2) * (ancho_pantalla / 2)) / sin (FOV / 2);

FOV es "Field Of View", esto es, el ángulo de la "lente". cos es coseno y sin es seno.

Añadiendo esto a lo que ha dicho anibarro, la fórmula quedará así:

x = (x3d / z3d) * DistPant
y = (y3d / z3d) * DistPant

Me parece que el día que dieron eso yo no fui a clase :confused:

Las coordenadas 3D funcionan igual que las 2D: incrementas o reduces los valores de los ejes y el punto se mueve en un sentido o en otro.

Por cierto, que girar puntos o vértices es un pelín complicado. Normalmente se utilizan matrices pero yo conocía unas fórmulas para realizar el giro directamente que funciona muy bien con objetos simples y es más rápido. El problema es que no lo tengo a mano y no lo tendré durante una larga temporada :(.

No es más que un producto de matrices.

Si multiplicas por
(1 0 0)
(0 1 0)
(0 0 1)
Tienes lo mismo. (es a matríz unidad de dimensión 3)

si multilicas por
(sen(alfa) 0 cos(alfa)))
(0 1 0 )
(cos(alfa) 0 sen(alfa)))

Tienes una rotación (si no se me ha ido la olla).

En fin, siempre es multiplicar por la matriz de giro o por un multiplo o submultiplo de la matriz unidad para hacer escalados.

cdrman
19/02/2008, 18:36
Sí, la fórmula básica es esa, pero se te ha olvidado la distancia. Este es un cuarto valor que indica la distancia a la que se encuentra el punto de vista a la pantalla.

En uno de mis proyectos calculo la distancia así:

DstPant = (cos (FOV / 2) * (ancho_pantalla / 2)) / sin (FOV / 2);

FOV es "Field Of View", esto es, el ángulo de la "lente". cos es coseno y sin es seno.

Añadiendo esto a lo que ha dicho anibarro, la fórmula quedará así:

x = (x3d / z3d) * DistPant
y = (y3d / z3d) * DistPant

Me parece que el día que dieron eso yo no fui a clase :confused:

Las coordenadas 3D funcionan igual que las 2D: incrementas o reduces los valores de los ejes y el punto se mueve en un sentido o en otro.

Por cierto, que girar puntos o vértices es un pelín complicado. Normalmente se utilizan matrices pero yo conocía unas fórmulas para realizar el giro directamente que funciona muy bien con objetos simples y es más rápido. El problema es que no lo tengo a mano y no lo tendré durante una larga temporada :(.
Holas! gracias por contestar. Una cosa, el nagulo de la lente cual debe ser? Es que no tengo ni idea. Debe estsar en radianes o en grados? Supongo que en radianes.

Ñuño Martínez
20/02/2008, 10:28
El ángulo debe indicarse en la medida que utilicen las funciones cos y sin. Si son las funciones C de toda la vida, pues sí, serán radianes. En cuanto al tamaño, creo que con 48º (0'838 radianes) se veía bien, aunque no lo recuerdo bien.

cdrman
20/02/2008, 17:43
El ángulo debe indicarse en la medida que utilicen las funciones cos y sin. Si son las funciones C de toda la vida, pues sí, serán radianes. En cuanto al tamaño, creo que con 48º (0'838 radianes) se veía bien, aunque no lo recuerdo bien.

Ya tengo ganas de ponermE!!!
gracias.

< - >

S&#237;, la f&#243;rmula b&#225;sica es esa, pero se te ha olvidado la distancia. Este es un cuarto valor que indica la distancia a la que se encuentra el punto de vista a la pantalla.

En uno de mis proyectos calculo la distancia as&#237;:

DstPant = (cos (FOV / 2) * (ancho_pantalla / 2)) / sin (FOV / 2);

Lo que si he notado es que hay un punto de la figura que siempre se keda en 0,0 de la pantalla, fijo, por lo que se deforma. Que puede pasar?


FOV es "Field Of View", esto es, el &#225;ngulo de la "lente". cos es coseno y sin es seno.

A&#241;adiendo esto a lo que ha dicho anibarro, la f&#243;rmula quedar&#225; as&#237;:

x = (x3d / z3d) * DistPant
y = (y3d / z3d) * DistPant

Me parece que el d&#237;a que dieron eso yo no fui a clase :confused:

Las coordenadas 3D funcionan igual que las 2D: incrementas o reduces los valores de los ejes y el punto se mueve en un sentido o en otro.

Por cierto, que girar puntos o v&#233;rtices es un pel&#237;n complicado. Normalmente se utilizan matrices pero yo conoc&#237;a unas f&#243;rmulas para realizar el giro directamente que funciona muy bien con objetos simples y es m&#225;s r&#225;pido. El problema es que no lo tengo a mano y no lo tendr&#233; durante una larga temporada :(.
Una cosilla, si z3d vale 0 ke pasa?al dividir por 0 todo al carajo!

< - >
Acabo de hascer una prueba r&#225;pidilla pero el resultado no es lo que esperaba. Trabajo con enteros, por lo que se pierde algo.
Defino 12 puntos 3d, transformo esos 12 puntos a 2d y luego dentro de un bucle segun tocas un cursor o otro incremento distancia o decremento o tb cambio la x y la Y de la c&#225;mara. Pero no lo acabo de ver bien del todo. PAsan cosas raras.


p1 = new Point3D(1, 1, 1);
p2 = new Point3D(2, 1, 1);
p3 = new Point3D(1, 1, 2);

p4 = new Point3D(1, 2, 1);
p5 = new Point3D(1, 1, 1);
p6 = new Point3D(1, 1, 2);

p7 = new Point3D(1, 2, 1);
p8 = new Point3D(2, 1, 1);
p9 = new Point3D(1, 1, 1);

p10 = new Point3D(1, 2, 1);
p11 = new Point3D(2, 1, 1);
p12 = new Point3D(1, 1, 2);

como vereis repito algun punto pero no pasa nada. En principio esto tendria que ser una piramide con 4 caras.
no se si se me escapa algo.

Bueno, he solucionado una cosa, simplemente trabajndo con floats y a la hora de pintar pues lo paso a entreros. Con esto keda algo mejor, pero... de ahi hasta que parezca algo guapo...

Ñuño Martínez
21/02/2008, 09:36
Una cosilla, si z3d vale 0 ke pasa?al dividir por 0 todo al carajo! No debes dibujar nada que quede detr&#225;s de la c&#225;mara. Precisamente debes comprobar que z3d sea siempre mayor que cero. Si proyectas puntos que est&#233;n tras el punto de vista te pasar&#225;n cosas raras, como dices m&#225;s adelante.

M&#237;rate este tutorial (http://www.flipcode.net/archives/Building_a_3D_Portal_Engine-Issue_01_Introduction.shtml). Aunque se llama "crear un motor de portales 3D" incluye mucha informaci&#243;n sobre gr&#225;ficos 3D, matem&#225;ticas, matrices, etc. desde la base. Est&#225; en ingl&#233;s, s&#233; que es una perrada pero es de lo mejor que he encontrado y merece la pena el esfuerzo. Aprovecha a leerlo porque el sitio web est&#225; cerrado y cualquier d&#237;a de estos lo borran todo.

cdrman
21/02/2008, 13:18
No es que tenga u nivel de ingl&#233;s excelente pero bueno.... algo entiendo.