コード例 #1
0
        //создание в памяти прямоугольника с заданными координатами
        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));
        }
コード例 #2
0
        ///создание объекта в памяти на основании считанных данных из файла
        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);
        }