public void Paint(object sender, PaintEventArgs e) { if (null == sender) { return; } if (false == (sender is CSGL12Control)) { return; } //Sacar el control de GL y sus dimensiones CSGL12Control csgl12Control = (sender as CSGL12Control); GL gl = csgl12Control.GetGL(); int clientWidth = csgl12Control.ClientRectangle.Width; int clientHeight = csgl12Control.ClientRectangle.Height; if (clientWidth <= 0) { clientWidth = 1; } if (clientHeight <= 0) { clientHeight = 1; } //Asignar un viewport del tamaño del control gl.glViewport(0, 0, clientWidth, clientHeight); //Limpiar la pantalla con un color de fondo gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); //Asignar la vista del modelo y la proyeccion gl.glMatrixMode(GL.GL_PROJECTION); gl.glLoadIdentity(); double aspectRatio = 1.0; if (0 != clientHeight) { aspectRatio = ((double)(clientWidth) / (double)(clientHeight)); } double verticalFieldOfViewAngle = 45.0; gl.gluPerspective ( verticalFieldOfViewAngle, // Field of view angle (Y angle; degrees) aspectRatio, // width/height 0.1, // distance to near clipping plane 64000.0 // distance to far clipping plane ); gl.gluLookAt(0, poscamara*Math.Sin(acamara), poscamara*Math.Cos(acamara), // pos camara 0, 0, 0, // pos objetivo 0, Math.Cos(acamara), -Math.Sin(acamara)); // orientación UP gl.glMatrixMode(GL.GL_MODELVIEW); gl.glLoadIdentity(); //Aquí va tu dibujito chido //Espacio para guardar las mallas de las esferas gl.glTranslatef(0.0f, 0.0f, -10.0f); GLUTShapes obj = new GLUTShapes(gl); gl.glScalef(2.0f, 0.0f, 0.0f); gl.glColor3f(1.0f, 0.0f, 0.0f); obj.glutSolidCube(5.0); Vagon(gl); // Forzar el dibujado de todo y cambiar el buffer de ser necesario gl.wglSwapBuffers(csgl12Control.GetHDC()); }
//Metodo Paint public void Paint(object sender, PaintEventArgs e) { if (null == sender) { return; } if (false == (sender is CSGL12Control)) { return; } //Sacar el control de GL y sus dimensiones CSGL12Control csgl12Control = (sender as CSGL12Control); GL gl = csgl12Control.GetGL();//Pedimos el control de OpenGl int clientWidth = csgl12Control.ClientRectangle.Width; int clientHeight = csgl12Control.ClientRectangle.Height; if (clientWidth <= 0) { clientWidth = 1; } if (clientHeight <= 0) { clientHeight = 1; } //Asignar un viewport (el unico que maneja la vista fisica) gl.glViewport(0, 0, clientWidth, clientHeight); //Nos dice de que tamaño es la pantalla fisica, yo le digo la vista fisica tiene este tamaño //Limpiar la pantalla con un color de fondo gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); //Limpia la pantalla blanco, trasparencia 10% opaco gl.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); //Limpia el Buffer de color y de profundidad (diferente del buffer de profundidad -> que sabe que esta atras de que) //Asignar la vista del modelo gl.glMatrixMode(GL.GL_PROJECTION); //Lo que voy a hacer ahorita modifica a la proyeccion unicamente gl.glLoadIdentity(); double aspectRatio = 1.0; if (0 != clientHeight) { aspectRatio = ((double)(clientWidth) / (double)(clientHeight)); } double verticalFieldOfViewAngle = 45.0; gl.gluPerspective //maneja la perspectivz ( verticalFieldOfViewAngle, // Field of view angle (Y angle; degrees) aspectRatio, // width/height 0.1, // distance to near clipping plane 64000.0 // distance to far clipping plane ); //Movimiento circular de la camara gl.gluLookAt(0, poscamara * Math.Sin(acamara), poscamara * Math.Cos(acamara), 0, 0, 0, 0, Math.Cos(acamara), -Math.Sin(acamara)); gl.glMatrixMode(GL.GL_MODELVIEW); //VIsta de modelo gl.glLoadIdentity(); //Aquí va tu dibujito chido //Material del tren vagon 1 float[] sombratren = { 0.0f, 0.2f, 0.0f, 1.0f }; float[] luztren = { 0.0f, 1.0f, 0.0f, 1.0f }; float[] reflejotren = { 1.0f, 1.0f, 1.0f, 1.0f }; float[] brillotren = { 0.0f, 0.0f, 0.0f, 1.0f }; float intensidadbrillotren = 40.0f;//0 - 128 gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, sombratren); //color a la sombra gl.glMaterialfv(GL.GL_FRONT, GL.GL_DIFFUSE, luztren); //color a la luz gl.glMaterialfv(GL.GL_FRONT, GL.GL_SPECULAR, reflejotren); //color del reflejo gl.glMaterialf(GL.GL_FRONT, GL.GL_SHININESS, intensidadbrillotren); //intensidad del reflejo gl.glMaterialfv(GL.GL_FRONT, GL.GL_EMISSION, brillotren); //color de luz emitida //Trayectoria en elipse del tren TrenX = (float)(Elipsea*Math.Cos(trayectoria)); TrenY = (float)(Elipseb*Math.Sin(trayectoria)); PendienteTan = ((Elipseb*TrenX)/(Elipsea*(Math.Sqrt(Math.Pow(Elipsea,2)-Math.Pow(TrenX,2))))); AnguloTan = (float)(Math.Abs((Math.Atan(PendienteTan)))*(180/Math.PI)); if (TrenX > 0 && TrenY > 0) TrenA = (180 - AnguloTan); else if (TrenX < 0 && TrenY > 0) TrenA = (180 + AnguloTan); else if (TrenX < 0 && TrenY < 0) TrenA = (AnguloTan * (-1)); else if (TrenX > 0 && TrenY < 0) TrenA = AnguloTan; //Debujar el vagon gl.glPushMatrix();//Condiciones iniciales gl.glTranslatef(TrenX, TrenY, 0.5f); gl.glRotatef(TrenA, 0.0f, 0.0f, 1.0f); gl.glScalef(2.0f, 1.0f, 1.0f); GLUTShapes shape = new GLUTShapes(gl); shape.glutSolidCube(1); //Luz Spot del tren gl.glTranslatef(0.5f, 0.0f, 0.0f); float[] light1_pos = { 0.0f, 0.0f, 0.0f, 1.0f }; //x,y,z, w w=0 luz direccional, else posicional float[] light_Ka = { 1.0f, 1.0f, 1.0f, 1.0f };//white light float[] light_Kd = { 1.0f, 1.0f, 1.0f, 1.0f };//white light float[] light_Ks = { 1.0f, 1.0f, 1.0f, 1.0f };//white light float[] light_dir = {1.0f, 0.0f, 0.0f}; gl.glLightfv(GL.GL_LIGHT1, GL.GL_POSITION, light1_pos); //posición de la luz gl.glLightfv(GL.GL_LIGHT1, GL.GL_AMBIENT, light_Ka); //color luz ambiental gl.glLightfv(GL.GL_LIGHT1, GL.GL_DIFFUSE, light_Kd); //color de luz difusa gl.glLightfv(GL.GL_LIGHT1, GL.GL_SPECULAR, light_Ks); //color del brillo gl.glLightf(GL.GL_LIGHT1, GL.GL_SPOT_CUTOFF, 20.0f); gl.glLightfv(GL.GL_LIGHT1, GL.GL_SPOT_DIRECTION, light_dir); gl.glLightf(GL.GL_LIGHT1, GL.GL_SPOT_EXPONENT, 40.0f); //0 - 128, 0 es pareja gl.glPopMatrix(); //Regresa a condiciones iniciales //Material del plano de abajo float[] sombratierra = { 0.545f, 0.255f, 0.005f, 1.0f }; float[] luztierra = { 0.91f, 0.42f, 0.005f, 1.0f }; float[] reflejotierra = { 1.0f, 1.0f, 1.0f, 1.0f }; float[] brillotierra = { 0.0f, 0.0f, 0.0f, 1.0f }; float intensidadbrillotierra = 40.0f;//0 - 128 gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, sombratierra); //color a la sombra gl.glMaterialfv(GL.GL_FRONT, GL.GL_DIFFUSE, luztierra); //color a la luz gl.glMaterialfv(GL.GL_FRONT, GL.GL_SPECULAR, reflejotierra); //color del reflejo gl.glMaterialf(GL.GL_FRONT, GL.GL_SHININESS, intensidadbrillotierra); //intensidad del reflejo gl.glMaterialfv(GL.GL_FRONT, GL.GL_EMISSION, brillotierra); //color de luz emitida //Dibuja plano en el centro gl.glPushMatrix(); gl.glTranslatef(-(plano_quads*plano_sizequads)/2,-(plano_quads*plano_sizequads)/2,0.0f); planoX = 0.0f; planoY = 0.0f; dibuja_plano(gl, plano_quads, plano_sizequads); gl.glPopMatrix();//Regresa a condiciones iniciales gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, sombratren); //color a la sombra gl.glMaterialfv(GL.GL_FRONT, GL.GL_DIFFUSE, luztren); //color a la luz gl.glMaterialfv(GL.GL_FRONT, GL.GL_SPECULAR, reflejotren); //color del reflejo gl.glMaterialf(GL.GL_FRONT, GL.GL_SHININESS, intensidadbrillotren); //intensidad del reflejo gl.glMaterialfv(GL.GL_FRONT, GL.GL_EMISSION, brillotren); //color de luz emitida gl.glTranslatef(10.0f, 0.0f, 0.0f); dibuja_arbol(gl); trayectoria += 0.02f; // Forzar el dibujado de todo y cambiar el buffer de ser necesario gl.wglSwapBuffers(csgl12Control.GetHDC()); //Pasa del buffer a la pantalla (plancha cuando ya acabe esto) no cuando tu quieras //Es estoy listo cuando hagas el re-fresco para planchar en la pantalla }
public void Vagon(GL gl) { float[] sombra = { 0.0f, 0.0f, 0.2f, 1.0f }; float[] luz = { 0.0f, 0.0f, 1.0f, 1.0f }; float[] reflejo = { 1.0f, 1.0f, 1.0f, 1.0f }; float[] brillo = { 0.0f, 0.0f, 0.0f, 1.0f }; float intensidadbrillo = 40.0f;//0 - 128 gl.glMaterialfv(GL.GL_FRONT, GL.GL_AMBIENT, sombra); //color a la sombra gl.glMaterialfv(GL.GL_FRONT, GL.GL_DIFFUSE, luz); //color a la luz gl.glMaterialfv(GL.GL_FRONT, GL.GL_SPECULAR, reflejo); //color del reflejo gl.glMaterialf(GL.GL_FRONT, GL.GL_SHININESS, intensidadbrillo); //intensidad del reflejo gl.glMaterialfv(GL.GL_FRONT, GL.GL_EMISSION, brillo); //color de luz emitida GLUTShapes obj = new GLUTShapes(gl); gl.glScalef(2.0f, 0.0f, 0.0f); obj.glutSolidCube(1.0); }