vray sale renders renderizar realistas realista problemas porque oscuro lumion hacer error como blanco delphi graphics gdi+ transform gdi
descargar

delphi - sale - render oscuro vray sketchup



¿Cómo puedo renderizar un mapa de bits cuadrado a un polígono arbitrario de cuatro lados usando GDI? (3)

Eche un vistazo a los gráficos vectoriales 3D Lab . (Especialmente "Campo de fútbol" en la demostración).

Otro recurso genial es AggPas con fuente completa incluida ( descargar )

AggPas es de código abierto y biblioteca de gráficos vectoriales 2D gratuita. Es un puerto nativo de Object Pascal de la biblioteca de Geometría Anti-Grain - AGG, originalmente escrito por Maxim Shemanarev en C ++. AggPas no depende de ninguna API o tecnología gráfica. Básicamente, puede pensar en AggPas como un motor de renderizado que produce imágenes de píxeles en la memoria de algunos datos vectoriales.

Así es como se ve la demostración en perspective :

Después de la transformación:

Necesito pintar una imagen cuadrada, mapeada o transformada en un polígono de cuatro caras desconocido en tiempo de compilación. ¿Cómo puedo hacer esto?

Explicación más larga

El problema específico es representar un mosaico de mapa con una proyección de mapa no rectangular. Supongamos que tengo el siguiente mosaico:

y sé que los cuatro puntos de esquina deben estar aquí:

Dado eso, me gustaría obtener el siguiente resultado:

El azulejo cuadrado puede ser:

  • Girado; y / o
  • Ser más estrecho en un extremo que en el otro.

Creo que el segundo elemento significa que esto requiere una transformación no afín.

Notas adicionales aleatorias

Cuatro lados? Es plausible que para ser completamente correcto, el mosaico se debe mapear a un polígono con más de cuatro puntos, pero para nuestros propósitos y en la escala que se dibuja, un cuadrado -> otra transformación de cuatro polígonos es suficiente.

¿Por qué preferiblemente solo GDI? Toda la representación hasta ahora se hace usando GDI, y quiero mantener el código (a) rápido y (b) requiriendo la menor cantidad posible de bibliotecas adicionales. Estoy al tanto de algún apoyo para las transformaciones en GDI y he estado experimentando con ellos hoy, pero incluso después de experimentar con ellos no estoy seguro de si son lo suficientemente flexibles para este propósito. Si lo son, no he podido descifrarlo, así que realmente apreciaría un código de muestra.

GDI + también está bien, ya que lo usamos en otros lugares, pero sé que puede ser lento, y la velocidad es importante aquí.

Otra alternativa es cualquier cosa Delphi - / C ++ Builder -específico; este programa está escrito principalmente en C ++ usando el VCL, y los gráficos en cuestión están actualmente pintados en un TCanvas con una mezcla de métodos TCanvas y llamadas WinAPI / GDI en bruto.

Superposición de imágenes: una advertencia final es que un color en el mosaico puede ser para la transparencia de la clave de color: es decir, todos los cuadrados blancos (por ejemplo) en el mosaico de arriba deben ser transparentes cuando se dibuja sobre lo que está debajo. Actualmente, las teselas se dibujan a objetivos rectangulares cuadrados o alineados al eje utilizando TransparentBlt .

Lamento todas las advertencias adicionales que hacen que esta pregunta sea más complicada que ''¿qué algoritmo debo usar?'' Pero con gusto aceptaré las respuestas solo con información algorítmica.


También es posible que desee echar un vistazo a Graphics32 . La captura de pantalla bewlow muestra cómo se ve la demo transfrom en GR32


La técnica general se describe en "Digital Image Warping" de George Wolberg. Parece que este resumen contiene las matemáticas relevantes, al igual que este artículo . Necesita crear una matriz de perspectiva que se correlacione de un quad a otro. Los enlaces de arriba muestran cómo crear la matriz. Una vez que tenga la matriz, puede escanear el buffer de salida, realizar la transformación (o posiblemente la inversa, dependiendo de cuál le dé), y eso le dará puntos en la imagen original de la que puede copiar.

Puede ser más fácil usar OpenGL para dibujar un cuadrante texturizado entre los 4 puntos, pero eso no usa GDI como usted quería.