Una breve discusión sobre cómo usar opengl para desarrollar un programa simple de simulación de fuentes en mfc
El desarrollo de programas de gráficos por computadora con un cierto nivel de GL se ha convertido en el objetivo de muchos estudiosos. Visualmente
En C++ se pueden utilizar tanto Win32 como MFC para programar, cada uno con sus propias características. Este artículo analiza brevemente cómo utilizar Open GL para desarrollar un programa simple de simulación de fuentes en MFC.
1 Inicialización del entorno de dibujo OpenGL
OpenGL es una biblioteca de gráficos 3D multiplataforma que puede ejecutarse en plataformas Windows, Unix y Mac. y la biblioteca de clases básica perfecta MFC de Visual C++ y el asistente de aplicaciones AppWizard facilitan el desarrollo de una aplicación compleja. Si los combinamos, podemos desarrollar aplicaciones de gráficos 3D avanzadas en Windows [1].
En el proceso de renderizado de juegos 3D, los métodos de modelado tradicionales generalmente solo son adecuados para formas relativamente regulares. Para materiales que no tienen una forma fija, como lluvia, nieve, cascadas, fuentes y llamas, y que incluso pueden cambiar con cambios en el entorno externo u otros factores, los métodos tradicionales son impotentes [2]. En 1983 Reeves
W T propuso un nuevo método de modelado llamado modelado de objetos difusos, llamado sistema de partículas, y su aparición simplemente resolvió los problemas anteriores [3].
La biblioteca de funciones OpenGL no tiene nada que ver con el sistema operativo y tiene su propio diseño único. No es consistente con el modelo GDI de la interfaz del dispositivo de imágenes de Windows y el método de creación de la mayoría de las aplicaciones MFC. En los sistemas Windows, este conjunto de funciones se denomina función de movimiento y el prefijo de cada función de movimiento es "wgl".
En Win32, primero debe restablecer el formato de píxeles de la ventana de dibujo para cumplir con los requisitos de formato de píxeles de OpenGL. Para hacer esto, declare una variable de la estructura PIXELFORMATDESCRIPTOR y establezca los valores de los miembros de su estructura de manera adecuada para admitir OpenGL y sus modos de color. Llame a ChoosePixelFormat() con esta variable como parámetro, asigne un número de formato de píxel y luego llame a SetPixelFormat() para configurarlo en el formato de píxel actual.
Después de restablecer el formato de píxeles, debe crear una tabla de descripción del dibujo (Renderizar) para OpenGL.
Contexto). El contexto de dibujo es similar al contexto del dispositivo (DevICe) en Windows.
Contexto). Solo después de establecer la tabla de contexto de dibujo RC, OpenGL puede llamar a primitivas de dibujo para crear gráficos en la ventana. Win32API proporciona varias funciones de tabla de descripción de dibujos, que incluyen crear, copiar, usar, eliminar y consultar. Todas estas funciones tienen el prefijo wgl. RC está basado en subprocesos y cada subproceso debe utilizar un RC como RC actual para ejecutar primitivas de dibujo OpenGL.
WglCreateContext() es una función que crea una tabla de descripción de dibujos. Toma un identificador para un contexto de dispositivo GDI como parámetro y devuelve un identificador al contexto de dibujo asociado con ese contexto de dispositivo. Llame a la función wglMakeCurrent() con estos 2 identificadores como parámetros para hacer que el RC sea el RC utilizado actualmente por el hilo y completar el proceso de inicialización del entorno de dibujo OpenGL en Windows [4].
2. Cree un marco de aplicación de documento único OpenGL
Utilice las clases AppWizard y Visual C++
El asistente puede generar fácilmente una aplicación de documento único OpenGL utilizando MFC. Marco, llamado MyFountain.
2.1 Método de creación previa de ventana
BOOL cmysdopengview::pre crear ventana(crear estructura y cs)
{
cs . estilo | = WS _ clip hijos | WS _ clip hermanos;
Devolver CView::precreate window(cs);
}
Usar WS_CLIPCHILDREN y WS_CLIPSIBLINGS. Diseñe la ventana de visualización para asegurarse de que el formato de píxeles esté configurado correctamente.
2.2 Agregar función de respuesta de mensaje
Utilice MFC
ClassWizard para agregar las funciones de respuesta de los mensajes WM_CREATE, WM_DESTROY, WM_SIZE y WM_TIMER a la clase CMySDOpenGLView.
Primero, inicializa OpenGL y configura el temporizador en el método OnCreate.
Luego agregue la función de respuesta del temporizador y el comando de actualización de escena a la función de respuesta de OnTimer, de modo que el programa se interrumpa de acuerdo con el paso de tiempo establecido por el temporizador y se llame a OnDraw para actualizar la escena de renderizado.
El tercer paso es agregar la función OnSize para responder al mensaje del usuario para ajustar la ventana y ajustar inmediatamente el tamaño de la ventana [5].
Finalmente, al cerrar la ventana, después de asignar el valor NULL (o 0) al parámetro hRC de wglMakeCurrent(), llame a wglDeleteContext() para eliminar la tabla de descripción del dibujo, eliminar la paleta y el temporizador.
3 Simulación de fuentes basada en sistemas de partículas
Las técnicas de modelado para construir sistemas de visualización se pueden dividir a grandes rasgos en dos categorías: modelado geométrico y modelado de comportamiento. El modelado geométrico se ocupa de la representación de la geometría y la forma de los objetos y estudia cuestiones básicas como las estructuras de datos gráficos. El modelado de comportamiento se ocupa de la descripción del movimiento y el comportamiento de los objetos.
Los sistemas de partículas están compuestos por una gran cantidad de vóxeles simples llamados partículas. Cada partícula tiene un conjunto de propiedades, como posición, velocidad, color y vida útil. Las propiedades que tienen las partículas dependen principalmente de la aplicación específica. Los valores iniciales de las partículas se generan mediante un proceso aleatorio. Las partículas suelen ser producidas por una fuente de partículas ubicada en algún lugar del espacio.
Los sistemas de partículas también utilizan procesos estocásticos, a menudo combinando la geometría y el comportamiento de un objeto en un modelo orgánico.
Los sistemas de partículas están en constante evolución. En cada momento del ciclo de vida, se deben completar los siguientes cuatro pasos:
(1) La fuente de partículas genera nuevas partículas. Se genera cualquier número de nuevas partículas, y sus propiedades iniciales se controlan mediante un proceso estocástico. Cada partícula tiene una vida. Si ciertas partículas no se eliminan, se les puede dar una vida infinita.
(2) Actualizar los atributos de partículas existentes. Por ejemplo, si una partícula tiene atributos de posición y velocidad, al simular el movimiento en un campo de gravedad, los atributos de posición y velocidad de la partícula se pueden actualizar de la siguiente manera:
v=v+gts=s+vt p>
En este paso, la vida útil de la partícula se reduce en un paso de tiempo.
(3) Eliminar partículas "muertas". Verifique la vida útil de la partícula; si es 0, elimine la partícula del sistema.
(4) Dibujar partículas. Muestra todas las partículas existentes en el sistema de partículas.
En general, las características geométricas de las partículas son muy simples y pueden representarse mediante un píxel o un pequeño polígono [6].
3.1 Definición de estructura de datos de partículas
La estructura de datos de partículas se define de la siguiente manera:
Estructura de partículas
{
Flotante t; //La vida útil de las partículas
Vel flotante//La velocidad del movimiento de las partículas
Dirección del punto flotante //La dirección del movimiento de las partículas
Punto flotante x, y, z; //Coordenadas de posición de las partículas
float xd, ZD; //Incrementos de dirección de las partículas X y Z
Tipo de carácter; (movimiento o desvanecimiento)
Flotante a; // valor alfa de desvanecimiento
Estructura de partículas *siguiente, * anterior
};
3.2 Dibujar una fuente
3.2.1 Primero construye una escena.
Dado que el foco está en la fuente, basta con construir un terreno simulado para resaltar la fuente. El código de implementación es el siguiente:
GL clear(GL _ COLOR _ BUFFER _ BIT
glload identidad();
glBindTexture(GL_TEXTURE_2D, TEXTURE); [1] );
a+= 0.2;
gluLookAt(cam.x, cam.y, cam.z, 0, 0, 0, upv.x, upv.y , upv.z);
Representaciones de fuentes
El proceso de representación de la fuente utiliza principalmente las funciones y métodos característicos de OpenGL y realiza principalmente dos aspectos del procesamiento: (1) Representación. el modelo de fuente en un archivo de textura [8] (2) Utilice tecnología de representación de textura transparente [9].
Implementación de la fuente
Después de construir una escena de suelo simple, se utiliza una secuencia de puntos uniformes en el círculo centrado en el origen como punto de rociado de la fuente, y la fuente Se completa de acuerdo con el método de dibujo anterior [10] simulación dinámica. El código clave principal para la simulación del sistema de fuente es agregar partículas de renderizado en la memoria, que es la función AddParticles(). Después de eso, las partículas se ejecutarán de acuerdo con la trayectoria predeterminada.
El código de implementación principal es el siguiente:
//Agregar nuevas partículas
void cmycountainview::add partículas()
{
Estructura de partículas* tempp
int i,j;
for(j = 0;j<18;j++)
for(I = 0;i<2;i++ )
{
tempp=(partícula estructural*)malLOC(tamañode(partícula estructural));
if(fn[j])fn[j] - > anterior = tempp
tempp->; siguiente = fn[j];
fn[j]= tempp;
tempp->; -9.9; //Vida útil de la partícula
tempp->; v =(float)(rand()% 200000)/100001;
//Velocidad de la partícula
tempp->;d =(float)(rand()% 400)/100-2;
//Dirección de la partícula
tempp->; cos((j * 3.14159)/180); //Coordenadas de la posición inicial
tempp->; y = 0;
tempp->; j * 3.14159)/180);
tempp->xd = cos((tempp->d * 3.14159)/180)* tempp->v/4 ;
tempp->ZD = sin((tempp->d * 3.14159)/180)* tempp->five;
tempp->type = 0; //El estado de la partícula está en movimiento.
tempp->; a = 1; //Desalinización de partículas
}
}
El efecto de la fuente se muestra en Figura 1.
Al cambiar el valor de alfa (el ángulo central del círculo inscrito de un polígono regular) en el programa, se puede cambiar el número de partes del flujo de partículas de la fuente. El espesor del flujo de partículas de la fuente se puede controlar cambiando el producto de los vectores, cambiando los valores en el lado derecho de la ecuación "vectl. "5;3;2;" resultados.
A través de la comparación experimental anterior, se puede ver que el número de partes del flujo de partículas de la fuente y el número de partículas en cada flujo afectarán el realismo del efecto de simulación de la fuente [11].
Cada vez más personas prestan atención al uso de la visión.
C++ y OpenGL tienen ventajas en el desarrollo de software de animación de gráficos tridimensionales, pero la mayor parte de la información sobre OpenGL presenta la programación básica. principios o algunos principios o métodos básicos, pero hay muy pocos casos de programación relacionados con aplicaciones a gran escala, y la mayoría de ellos se basan en clases Win32 para implementar algunas funciones gráficas simples. Hay muy poca información sobre la conexión entre MFC y OpenGL. . Este artículo implementa principalmente un programa de simulación de fuente simple en MFC. El principal punto de innovación es analizar el mecanismo interno de respuesta de mensajes en MFC, por lo que espero que esta exploración sea útil para desarrollar programas más eficientes que utilicen MFC en el futuro.
Referencia
[1]Estudio Paloma de la Paz. Desarrollo de sistema de visualización y programación avanzada OpenGl (programación avanzada) [M]. Beijing: China Water Conservancy and Hydropower Press, 2007.
[2], Wang Wan. Programación de juegos OpenGl[M]. Beijing: Machinery Industry Press, 2008.
[3]REEVES W. t. Particle systEMS: una técnica para modelar una clase de modelos difusos
Objetos[J]. Transacciones de la Sociedad Estadounidense de Computación sobre Gráficos, 1983, 2(2):359-376.
Xiao Chun y Zhou Jianlong.
Teoría de gráficos por computadora y práctica de programación OpenGl [M]. Guangzhou: Prensa de la Universidad Tecnológica del Sur de China, 2007.
[5]Sun Xin, Yu Anping. VC++ [M] explicación detallada. Beijing: Electronic Industry Press, 2008.
Qian Hu Xiao Lei. Diseño de sistemas de partículas basado en Direct3D[J].
Zhang Qin, Wu Huizhong, Xie Junyi. Investigación sobre el modelo de llama y su método de generación basado en sistema de partículas [J]. Journal of Computer-Aided Design and Graphics, 2001, 13 (1): 78-82.
[8]PHONG B. t. Iluminación generada por ordenador
Imágenes[J]. Comunicaciones de la Asociación de Maquinaria de Computación, 1975, 18(6):311-317.
Hou Yang, Dick. Ejemplos de programación de animación de gráficos tridimensionales[M]. Prensa oceánica, 1993.
Yang Chunyu. Simulación de animación de fuente basada en un sistema de partículas [J]. Changchun: Jilin University Press, 2008.
【11】Ling Yun, Chu Linbo. Uso de MFC y OpenGl para establecer un entorno de aplicación de gráficos tridimensionales en Visual C++ [J Microcomputer and Applications, 1998,
.