//создание в памяти прямоугольника с заданными координатами public static void Rectangle(string name, double[] point1, double[] point2, double[] point3, double[] point4, List <double[]> tVertex = null, Texture texture = null) { List <Object3D> objects = new List <Object3D>(); List <int> objectsId = new List <int>(); List <Texture> textures = new List <Texture>(); List <int[]> tPoly = new List <int[]>(); if (texture != null) { textures.Add(texture); } if (tVertex == null) { tVertex = new List <double[]>(0); } else { tPoly = new List <int[]> { new int[] { 0, 1, 3 }, new int[] { 1, 2, 3 } }; } Object3D obj = new Object3D(name, new List <double[]> { point1, point2, point3, point4 }, new List <int[]> { new int[] { 0, 1, 3 }, new int[] { 1, 2, 3 } }, new List <int>(), tVertex, tPoly, 0, new double[] { 1.0, 1.0, 1.0 }); objects.Add(obj); objectsId.Add(Scene.CreateObj(objects[0], textures)); Scene.objectsInfo.Add(new FileWithObjects(objects, objectsId, textures)); }
///создание объекта в памяти на основании считанных данных из файла public static int CreateObj(Object3D objects, List <Texture> textures) { //отбираем полигоны, у которых одинаковые субматериалы //если нет субматериалов, записываем все точки List <int> subMaterials = new List <int>(); List <int>[] polyList = new List <int>[] { new List <int>() }; int i = 0; if (textures[objects.Material].MaterialClass != "Standard") { var temp = objects.SubMaterial.Distinct(); foreach (int sub in temp) { subMaterials.Add(sub); } polyList = new List <int> [subMaterials.Count]; for (i = 0; i < polyList.Length; i++) { polyList[i] = new List <int>(); } for (i = 0; i < objects.Poly.Count; i++) { for (int j = 0; j < subMaterials.Count; j++) { if (subMaterials[j] == objects.SubMaterial[i]) { polyList[j].Add(i); } } } } else { polyList = new List <int>[] { new List <int>() }; for (i = 0; i < objects.Poly.Count; i++) { polyList[0].Add(i); } } ////////////////////////////////////////////////////////////////////////////////////// int nom_l = Gl.glGenLists(1); // получаем ID для создаваемого дисплейного списка Gl.glNewList(nom_l, Gl.GL_COMPILE); // генерируем новый дисплейный список Gl.glPushMatrix(); Gl.glEnable(Gl.GL_NORMALIZE); Gl.glBegin(Gl.GL_TRIANGLES); i = 0; do { if (textures[objects.Material].MaterialClass != "Standard") { Gl.glColor4f(textures[objects.Material].SubMaterial[subMaterials[i]].MaterialDiffuse[0], textures[objects.Material].SubMaterial[subMaterials[i]].MaterialDiffuse[1], textures[objects.Material].SubMaterial[subMaterials[i]].MaterialDiffuse[2], 1 - textures[objects.Material].SubMaterial[subMaterials[i]].MaterialTransparency); Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, textures[objects.Material].SubMaterial[subMaterials[i]].MaterialDiffuse); Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_DIFFUSE, ArrayMultiply(textures[objects.Material].SubMaterial[subMaterials[i]].MaterialDiffuse, 0.2f)); Gl.glLightfv(Gl.GL_LIGHT2, Gl.GL_DIFFUSE, ArrayMultiply(textures[objects.Material].SubMaterial[subMaterials[i]].MaterialDiffuse, 0.2f)); Gl.glLightfv(Gl.GL_LIGHT3, Gl.GL_DIFFUSE, ArrayMultiply(textures[objects.Material].SubMaterial[subMaterials[i]].MaterialDiffuse, 0.2f)); Gl.glBindTexture(Gl.GL_TEXTURE_2D, textures[objects.Material].SubMaterial[subMaterials[i]].TextureId); } else { Gl.glColor4f(textures[objects.Material].MaterialDiffuse[0], textures[objects.Material].MaterialDiffuse[1], textures[objects.Material].MaterialDiffuse[2], 1 - textures[objects.Material].MaterialTransparency); Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, textures[objects.Material].MaterialDiffuse); Gl.glLightfv(Gl.GL_LIGHT1, Gl.GL_DIFFUSE, ArrayMultiply(textures[objects.Material].MaterialDiffuse, 0.2f)); Gl.glLightfv(Gl.GL_LIGHT2, Gl.GL_DIFFUSE, ArrayMultiply(textures[objects.Material].MaterialDiffuse, 0.2f)); Gl.glLightfv(Gl.GL_LIGHT3, Gl.GL_DIFFUSE, ArrayMultiply(textures[objects.Material].MaterialDiffuse, 0.2f)); Gl.glBindTexture(Gl.GL_TEXTURE_2D, textures[objects.Material].TextureId); } for (int j = 0; j < polyList[i].Count; j++) { double x1, y1, z1, x2, y2, z2, x3, y3, z3; double n1, n2, n3; double tx1, ty1, tx2, ty2, tx3, ty3; //добавляем в переменные для удобства записи/чтения x1 = objects.Vertex[objects.Poly[polyList[i][j]][0]][0]; y1 = objects.Vertex[objects.Poly[polyList[i][j]][0]][1]; z1 = objects.Vertex[objects.Poly[polyList[i][j]][0]][2]; x2 = objects.Vertex[objects.Poly[polyList[i][j]][1]][0]; y2 = objects.Vertex[objects.Poly[polyList[i][j]][1]][1]; z2 = objects.Vertex[objects.Poly[polyList[i][j]][1]][2]; x3 = objects.Vertex[objects.Poly[polyList[i][j]][2]][0]; y3 = objects.Vertex[objects.Poly[polyList[i][j]][2]][1]; z3 = objects.Vertex[objects.Poly[polyList[i][j]][2]][2]; // рассчитываем нормаль n1 = (y2 - y1) * (z3 - z1) - (y3 - y1) * (z2 - z1); n2 = (z2 - z1) * (x3 - x1) - (z3 - z1) * (x2 - x1); n3 = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1); Gl.glNormal3d(n1, n2, n3); // устанавливаем нормаль if (objects.TPoly.Count > 0) { tx1 = objects.TVertex[objects.TPoly[polyList[i][j]][0]][0]; ty1 = objects.TVertex[objects.TPoly[polyList[i][j]][0]][1]; tx2 = objects.TVertex[objects.TPoly[polyList[i][j]][1]][0]; ty2 = objects.TVertex[objects.TPoly[polyList[i][j]][1]][1]; tx3 = objects.TVertex[objects.TPoly[polyList[i][j]][2]][0]; ty3 = objects.TVertex[objects.TPoly[polyList[i][j]][2]][1]; Gl.glTexCoord2d(tx1, ty1); Gl.glVertex3d(x1, y1, z1); Gl.glTexCoord2d(tx2, ty2); Gl.glVertex3d(x2, y2, z2); Gl.glTexCoord2d(tx3, ty3); Gl.glVertex3d(x3, y3, z3); } else { Gl.glVertex3d(x1, y1, z1); Gl.glVertex3d(x2, y2, z2); Gl.glVertex3d(x3, y3, z3); } } i++; } while (i < subMaterials.Count); Gl.glEnd(); // завершаем отрисовку Gl.glDisable(Gl.GL_NORMALIZE); Gl.glPopMatrix(); Gl.glEndList(); // завершаем дисплейный список return(nom_l); }