Ver la versión completa : Pasar de un punto 3d a 2d
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
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 :(.
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.
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.
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.
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í, 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);
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 á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 :(.
Una cosilla, si z3d vale 0 ke pasa?al dividir por 0 todo al carajo!
< - >
Acabo de hascer una prueba rá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á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ás de la cámara. Precisamente debes comprobar que z3d sea siempre mayor que cero. Si proyectas puntos que estén tras el punto de vista te pasarán cosas raras, como dices más adelante.
Mí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ón sobre gráficos 3D, matemáticas, matrices, etc. desde la base. Está en inglés, sé 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á cerrado y cualquier día de estos lo borran todo.
No es que tenga u nivel de inglés excelente pero bueno.... algo entiendo.
Powered by vBulletin® Version 4.2.5 Copyright © 2026 vBulletin Solutions Inc. All rights reserved.