Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Ayuda para deformar imagen a un poligono de 4 puntos...

Iniciado por amacedo, 16 de Octubre de 2008, 07:15:17 PM

« anterior - próximo »

amacedo

Necesito aplicarle una textura a un poligono cerrado representado por puntos en un mismo plano, poder hacerle un tile a la textura de forma q esta se repita, pero antes necesio aplicarle una deformacion o una correccion perspectiva a esa textura usando un poligono de 4 puntos (trapecio) de forma q cuando mueva alguno de los 4 vertices se adapte la textura del poligonoo a esta perspectiva, como puedo hacerlo usando dx_lib32???? ayuda please.... ahhh excelnte trabajo esta libreria... saludos

[EX3]

No entendi bien. El poligono cerrado que mencionas al principio es el mismo de 4 lados que mencionas al final? un trapezoide? Lo mas cercano que pides que seria dibujar un sprite deformable por sus 4 vertices es mediante una de las nuevas funciones de la ultima version, DRAW_VertexMap(), esta funcion te pide la posicion de los 4 vertices para dibujar el mapa o textura por lo que podrias adaptarlo a necesidad. Sobre tilear el sprite eso ya tendrias que hacerlo tu ya que dx_lib32 no tiene mecanismos para tilear sprites.

Bajate la CTP y prueba si te sirve la funcion mencionada. Si el poligono es un trapezoide esta funcion te permitira cubrirlo sin problemas.

salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

amacedo

Los poligonos son dos, me explico en mas detalle, estoy haciendo una aplicacion q dada una foto real digamos del frente de una casa, clicleando con el mouse formar un poligono de N puntos q cubre un area, por ejemplo de la acera o del piso de la cochera o de una pared, a ese poligono poderle aplicar una textura, variando la escala en las X y en las Y y despues manualmente usando como modelo un trapezoide poder ajustar por los 4 puntos de este ultimo, la perspectiva de la textura, de forma q coincida con la perspectiva de la foto tomada, para q al final parezca q el poligono incial texturizado es de hecho el piso, la cochera o la pared de la casa en la foto real, esto lo necesitamos pues queremos mostrarle al cliente como quedara su casa cuando nosotros le hagamos el trabajo del piso y las variantes de colores q puede utilizar y verlo tal y como quedaria en la vida real. No se si me comprendiste, ha tratado de hacerlo usando otras cosas pero no me ha sido posible a ver si usando dx-lib32 pueda llegar al resultado esperado, lo q no se, es que seria mas apropiado ajustar la perspectiva de la textura y luego mapearla al poligono de N lados o viceversa, mapear la textura primero y ajustarle la perspectiva despues, puedes darme alguna otra idea???? de la funcion q me comentas tienes algun segmento de codigo de ejemplo??? pues no he podido encontrar los tutoriales para esa nueva version con esa funcion... ahh lo ultimo, no te desalientes, tu trabajo es muyyyyy bueno, siempre habemos nuevos programadores sobre VB6 y necesitamos toda la ayuda posible para poder seguir usando nuestro amado vb... de nuevo muchas gracias por tu excelente trabajo asi como todo el soporte q nos das...

[EX3]

Estais intentando montar un software de simulacion 3D de casas? Mala eleccion usar una libreria como dx_lib32 diria yo, no esta pensado para llegar a ese punto mas que nada por que trabaja totalmente sobre 2D :( Me explico un poco. Intentar proyectar un plano con DRAW_VertexMap podria ser posible pero cuenta con que no trabajarias en un espacio 3D real por lo que no podrias aplicar profundidad progresiva sobre los poligonos o planos proyectados ni entre ellos asi como tampoco podrias navegar sobre la escena recreada ni rotarla, en pocas palabras, tendrias muchas limitaciones importantes para trabajar un entorno tridimensional con estas funciones. Si lo que estamos es hablando de escenas o vistas fijas, que no van a ser navegables por el usuario o por una camara todavia podria ser aunque tampoco se que resultado daria el asunto ya que nunca he intentado nada semejante.

Sobre la funcion en si, no hay tutoriales listos todavia en la web (y me apunto uno para los nuevos que no tengo ninguno de esta funcion) solo la entrada en la documentacion que viene con la version CTP donde se explica su funcionamiento, sintaxis y descripcion de los parametros. La funcion tiene la ventaja de tener practicamente los mismos parametros de la funcion DRAW_MapEx salvo que en vez de X Y Z se le tiene que pasar un array de 4 elementos de tipo VertexData con la informacion de la posicion de los vertices por lo que el uso del resto de sus parametros los podeis basar en los ejemplos existentes de la version 2.1 de la libreria. Luego igual, cuenta con que segun las posiciones que deis a los vertices se podra deformar la imagen de una forma que quizas no sea la esperada. Esto ocurre por el simple hecho de que las imagenes se montan sobre dos triangulos, mas o menos asi:



Al renderizarse puede quedar como doblada por la diagonal la imagen. En verdad esta funcion se penso para usarse para generar efectos como este ejemplo de la libreria IndieLib donde esas imperfecciones se aprovechan en conjunto para generar efectos como ondas:


Pulsa en ella para ver con detalle

Aun asi, pensar bien si realmente esta opcion es la mas adecuada para lo que buscais.

Salu2...

P.D.: Por si acaso, la version CTP solo se puede descargar desde la noticia de la pagina, no esta en la seccion de descargas.

P.D.2: Gracias a vosotros por el interes en el proyecto ;)
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

amacedo

Gracias por tu pronta respuesta, te dire q mi intencion no es montar un escena 3D, tengo alguna esperiencia con 3D usando un motor 3D llamado morfit, o 3DState, pero para lo q necesito no me ha dado buen resultado, te adjunto 4 imagenes de algo muy parecido, si no exacto lo q quiero hacer y como veras es totalmente 2D, primero seleccionan o dibujan un poligono, luego aplican una textura, y le corrijen la perspectiva y queda como si fuera 3D real, eso mismo es lo q necesito... alguna otra idea??


[EX3]

Ya me ha quedado un poco mas claro lo que buscais hacer. Salvo el tema del tileado que tocaria hacerlo a pelo, lo de que daria el pequeño desajuste del efecto doblado del poligono segun la posicion de los vertices y que, por lo que veo de la imagen, las zonas a rellenar serian irregulares (ahora entiendo lo del poligono de n puntos) para hacer lo que pides con la dxlib32 deberias recortar las zonas a editar de la imagen (el piso de entrada al garaje por ejemplo) con un programa externo (cosa que no seria practica) ya que de otra forma no podrias realizar selecciones poligonales y rellenarlas con una textura, dx_lib32 no proporciona funciones para ello.

El problema de dx_lib32 es que no trabaja a nivel de pixel si no en base a poligonos, funciona mas como un colage de texturas cuadradas en plan pego aqui y pego alla pudiendo jugar como mucho con transparencias en la imagen para lograr formar irregulares en imagenes. Esta pensada para realizar tareas graficas sencillas de dibujar sprites con efectos pero poco mas, por eso te decia que quizas para vuestro proyecto nos serviria de mucho. Deberiais buscar una libreria que trabaje a mas bajo nivel pero el problema es que para Visual Basic a parte de DirectX no es que haya mucho mas donde elegir debido al lenguaje sobre todo.

Solo me queda recomendaros que pregunteis en el foro de programacion grafica a ver si alguien conoce alguna libreria o motor que os permita realizar selecciones poligonales y rellenarlas con un patron tileado de una textura.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

amacedo

Dejame probar a ver q tan sale con esa funcion, solo necesito un pequeño ejemplo para quiarme, los vertices los espera a partir de 0 o de 1?? quiero decir el arreglo?? en q orden, el primer vertice cual es esquina inferior izq?? despues los demas como se enumeran???

amacedo

#8
Mira, hice este ejemplo pero solo me muestra un triangulo???HELP!!, es el tutorial  03 solo le puse los vertices e hice la llamada a la funcion... es como q el 4to vertice no lo agarra o algo??? ya probe a mover las coordendas y me di cuenta q el q no agarra es el ultimo vertice, ahh le puse 0 al color del ultimo vertice p q estaba probando a ver cual era el q no agarraba.. aun cuando le pongo los mismos valores q los de arriva sale solo un triangulo

Dim pos(0 To 3) As Vertex
Dim co(0 To 3) As Long

pos(0).X = 300
pos(0).Y = 300
pos(0).Z = 0
pos(0).Color = -12665345

pos(1).X = 0
pos(1).Y = 300
pos(1).Z = 0
pos(1).Color = -12665345

pos(2).X = 128 - 64
pos(2).Y = 128 - 64
pos(2).Z = 0
pos(2).Color = -12665345

pos(3).X = 128
pos(3).Y = 128 - 64
pos(3).Z = 0
pos(3).Color = 0
'Mostramos la ventana:
Me.Show

'Creamos la instancia de la clase dx_GFX:
Set m_gfx = New dx_GFX_Class

'Inicializamos la clase y el modo de video a 640x480 en modo ventana:
Call m_gfx.Init(Me.hWnd, 640, 480, , True)

'Cargamos un grafico en memoria:
Sprite = m_gfx.MAP_Load(App.Path & "\Texture.png", 0)

'Definimos los valores iniciales para la estructura Color:
With Color
    .Alpha = 255
    .Red = 255
    .Green = 127
    .Blue = 0

End With

Looping = True

Do While Looping
   
    'Normal:
    m_gfx.DRAW_VertexMap Sprite, pos(), 0, co(), Blendop_Color, Mirror_None, Filter_Trilinear
    'Call m_gfx.DRAW_MapEx(Sprite, 128, 128, 0, 128, 128, 0, Blendop_Color, &HFFFFFFFF, Mirror_None, Filter_Trilinear, True)
   

[EX3]

Vale, acabo de hacer la prueba creando el tutorial para esta funcion y funciona correctamente (a estas alturas ya tenia hasta dudas de si era error de la funcion o no xD). Me he dado cuenta de que la informacion referente al parametro VertexData de la funcion DRAW_VertexMap en la documentacion es muy escueta :P No cai en el detalle de mencionar que los vertices se definen en orden de las agujas del reloj, de lo contrario te puede suceder lo que dices, que no se te dibuje o que solo dibuje un triangulo (la mitad del poligono que casualmente puede tener bien posicionados los 3 vertices). Te subo todo el codigo para que lo pruebes:

Código (vbnet) [Seleccionar]
Option Explicit

Private Graphics As dx_GFX_Class ' Instancia del objeto grafico de dx_lib32.
Private Render As Boolean ' Controla el bucle de renderizado.
Private Texture As Long ' Identificador de la textura.
Private VertexData(3) As Vertex ' Array que define la informacion de la posicion de los vertices y su color.
Private VertexSpecular(3) As Long ' Array que define el valor del canal Specular de cada vertices (en el ejemplo este array tienes sus valor por defecto a 0)

Private Sub Form_Load()
    Me.Show ' Forzamos al formulario a mostrarse.
    Set Graphics = New dx_GFX_Class ' Creamos la instancia del objeto grafico.
    Render = Graphics.Init(Me.hWnd, 640, 480, 32, True) ' Inicializamos el objeto grafico y el modo de video.
    Texture = Graphics.MAP_Load(App.Path & "\texture.png", 0) ' Cargamos la textura para el sprite.
   
    ' Definimos los vertices en orden de las agujas del reloj:
   
    ' 0 -------------- 1
    ' |                |
    ' |                |
    ' |                |
    ' |                |
    ' |                |
    ' |                |
    ' |                |
    ' 3 -------------- 2
   
    VertexData(0).X = 32: VertexData(0).Y = 96: VertexData(0).Color = &HFFFFFFFF
    VertexData(1).X = 128: VertexData(1).Y = 0: VertexData(1).Color = &HFFFFFFFF
    VertexData(2).X = 256: VertexData(2).Y = 256: VertexData(2).Color = &HFFFFFFFF
    VertexData(3).X = 256: VertexData(3).Y = 64: VertexData(3).Color = &HFFFFFFFF
   
    Do While Render
        Graphics.DRAW_VertexMap Texture, VertexData(), 0, VertexSpecular(), Blendop_Color, Mirror_None, Filter_Trilinear ' Dibujamos la textura.
        Graphics.Frame ' Renderizamos la escena.
    Loop
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Graphics.MAP_Unload Texture ' Descargamos la textura de memoria.
    Render = False ' Termina el bucle de renderizado.
    Graphics.Terminate ' Terminamos la ejecucion de la clase grafica y liberamos los recursos utilizados.
    Set Graphics = Nothing ' Destruimos la instancia del objeto grafico.
End Sub


Al ejecutarlo deberia salir esto:


Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

amacedo

Ya entendi a lo q te referias, es q la funcion no hace una escala correcta de la imagen, si no q la distorciona por pedazos... creo q al final no me va a servir... es una lastima, pero bueno la dejare para cosas q si pueda utilizar, me gusta la calidad de la imagen... saludos

Hechelion

esto es una idea, pero dada las imágenes que publicaste debería funcionar, que utilizaras un motor 3d como podría ser truevision3D (que funciona con vb6), creas un cubo al cual le aplicas la textura y luego lo giras y lo posicionas de tal forma que reemplace al polígono en la imagen 2D.

(Esto me a recordado un tutorial de 3dMax (la versión creo) sobre como modificar una película con una mesa de pool creada con 3dmax )

amacedo

Cierto hechelon, de hecho yo use mucho ese tutorial, se llama CameraMatch, permite adaptar el mundo 3D a una escena real filmada y mapear el movimiento de la camara real a la camara 3D. En cuanto el truevision, yo uso uno para vb6 llamado 3Dstate, antes se llamaba morfit, q es bastante bueno, lo pesado seria como dije al principio estar moviendo ese cubo hasta lograr la perspectiva perfecta, si ves en las imagenes lo hacen tan facil con 2D q creo q es la mejor forma, ya crear una escena 3D para eso es como tratar de matar una mosca con un cañon ajjajajjajja pero aceptada tu sugerencia, pensare en eso.... grcias

[EX3]

Cita de: Hechelion en 17 de Octubre de 2008, 09:01:46 PM
esto es una idea, pero dada las imágenes que publicaste debería funcionar, que utilizaras un motor 3d como podría ser truevision3D (que funciona con vb6), creas un cubo al cual le aplicas la textura y luego lo giras y lo posicionas de tal forma que reemplace al polígono en la imagen 2D.

(Esto me a recordado un tutorial de 3dMax (la versión creo) sobre como modificar una película con una mesa de pool creada con 3dmax )
El unico problema es que creo que recientemente Truevision3D se ha hecho de pago y la version gratuita es una simple Trial por ello hace tiempo que no lo recomiendo como opcion gratuita para VB6 :( (se ve que les fue bien el negocio a esta gente) Aun asi creo que algun motor 3D mas hay disponible para VB6, en esta lista habia unos cuantos: GP-Wiki

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






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.