private void DibujarTronco() { if (texturaTronco == null) { texturaTronco = new Textura(@"../../Imagenes/Texturas/Arbol/tronco_1.bmp", false); } Gl.glEnable(Gl.GL_TEXTURE_2D); float[] colorBrown = new float[4] { 124.0f / 255.0f, 87.0f / 255.0f, 59.0f / 255.0f, .15f }; Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT_AND_DIFFUSE, colorBrown); Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, new float[] { 0f, 0f, 0f, 1.0f }); texturaTronco.Activate(); Glu.gluQuadricDrawStyle(quadraticCylinder, Glu.GLU_FILL); Glu.gluQuadricNormals(quadraticCylinder, Glu.GLU_SMOOTH); Glu.gluQuadricTexture(quadraticCylinder, Gl.GL_TRUE); Glu.gluCylinder(quadraticCylinder, this.radioBaseTronco, this.radioBaseTronco, this.longitudTronco, CANTIDAD_CARAS, 1); Gl.glDisable(Gl.GL_TEXTURE_2D); }
private void DibujarCopa() { Gl.glPushMatrix(); Gl.glRotated(90.0f, 1, 0, 0); if (texturaCopa == null) { texturaCopa = new Textura(@"../../Imagenes/Texturas/Arbol/copa.bmp", false); } Gl.glEnable(Gl.GL_TEXTURE_2D); texturaCopa.Activate(); float[] colorGray = new float[4] { .5f, .5f, .5f, .15f }; float[] colorNone = new float[4] { 0.0f, 0.0f, 0.0f, 0.0f }; Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_AMBIENT_AND_DIFFUSE, colorGray); Gl.glMaterialfv(Gl.GL_FRONT, Gl.GL_SPECULAR, new float[] { 0f, 0f, 0f, 1.0f }); Punto[] posicionesTextura = new Punto[] { new Punto(0, 0, 0), new Punto(1, 0, 0), new Punto(0, 1, 0), new Punto(1, 1, 0) }; for (int i = 0; i < matrizPuntosCopa.Length - 2; i++) // por columnas duplicadas { int cicloPosicionTextura = 0; Punto posicionTextura = null; Gl.glBegin(Gl.GL_TRIANGLE_STRIP); for (int j = 0; j < matrizPuntosCopa[i].Length; j++) { double ancho = (matrizPuntosCopa[i + 1][j] - matrizPuntosCopa[i][j]).Modulo(); double alto = 1.0f; if (j < matrizPuntosCopa[i].Length - 1) { alto = (matrizPuntosCopa[i][j + 1] - matrizPuntosCopa[i][j]).Modulo(); } double anchoSobreAlto = ancho / alto; posicionTextura = posicionesTextura[cicloPosicionTextura]; cicloPosicionTextura = (cicloPosicionTextura + 1) % posicionesTextura.Length; Gl.glNormal3d(matrizPuntosCopa[i][j].NormalX, matrizPuntosCopa[i][j].NormalY, matrizPuntosCopa[i][j].NormalZ); Gl.glVertex3d(matrizPuntosCopa[i][j].X, matrizPuntosCopa[i][j].Y, matrizPuntosCopa[i][j].Z); Gl.glTexCoord2d(posicionTextura.X, posicionTextura.Y); posicionTextura = posicionesTextura[cicloPosicionTextura]; cicloPosicionTextura = (cicloPosicionTextura + 1) % posicionesTextura.Length; Gl.glNormal3d(matrizPuntosCopa[i + 1][j].NormalX, matrizPuntosCopa[i + 1][j].NormalY, matrizPuntosCopa[i + 1][j].NormalZ); Gl.glVertex3d(matrizPuntosCopa[i + 1][j].X, matrizPuntosCopa[i + 1][j].Y, matrizPuntosCopa[i + 1][j].Z); Gl.glTexCoord2d(posicionTextura.X, posicionTextura.Y); } Gl.glEnd(); } Gl.glDisable(Gl.GL_TEXTURE_2D); if (DIBUJAR_NORMALES) { Gl.glDisable(Gl.GL_LIGHTING); for (int i = 0; i < matrizPuntosCopa.Length - 2; i++) // por columnas duplicadas { for (int j = 0; j < matrizPuntosCopa[i].Length; j++) { Gl.glBegin(Gl.GL_LINES); Gl.glColor3d(1, 0, 0); Gl.glVertex3d(matrizPuntosCopa[i][j].X, matrizPuntosCopa[i][j].Y, matrizPuntosCopa[i][j].Z); Gl.glColor3d(.2, 0, 0); Gl.glVertex3d(matrizPuntosCopa[i][j].NormalX, matrizPuntosCopa[i][j].NormalY, matrizPuntosCopa[i][j].NormalZ); Gl.glEnd(); } } Gl.glEnable(Gl.GL_LIGHTING); } Gl.glPopMatrix(); }