Esempio n. 1
0
        /// <summary>
        /// Расчитать матрицу позиционирования камеры
        /// </summary>
        /// <param name="dev">Объект трехмерной отрисовки</param>
        public void Setup(Visualization vis)
        {
            Mouse.Update();                                                             // Обновить состояние мыши
            if (Mouse.Buttons.Left)                                                     // если нажата кнопка мыши
            {
                Position -= Mouse.Coords;                                               // получить изменения координат (в обратном направлении)
            }
            else
            {
                Position.Z -= Mouse.Coords.Z;                                           // иначе учитывать только поворот колеса мыши
            }
            Matrix v = vis.dev.Transform.View =                                         // расчитать и отправить на отрисовку матрицу позиционирования камеры
                                                Matrix.RotationY(Position.X)            // поворот вокруг вертикальной оси
                                                * Matrix.RotationX(Position.Y)          // наклон
                                                * Matrix.Translation(0, 0, Position.Z); // перемещение всей сцены перед камерой

            Matrix ld = Matrix.Zero;                                                    // Матрица строка - вектор направления источника света

            ld.M13 = 1.0f;                                                              // Вектор направлен вдоль Oz
            ld.M12 = -0.4f;                                                             // Слегка наклонен вниз (чтобы низ моделей был немного темнее их верха).

            v.Invert();                                                                 // Матрица вида должна быть инвертирована чтобы не расчитывать освещение в противоположном направлении

            ld = Matrix.Multiply(ld, v);                                                // Здать вектор направления источника света вдоль направлении камеры
            vis.dev.Lights[0].Direction = new Vector3(ld.M11, ld.M12, ld.M13);          // Передать вектор направления нулевому источнику света
            vis.dev.Lights[0].Update();                                                 // Применить изменения направления для рассчета освещения
        }
Esempio n. 2
0
 public void Draw(Visualization vis)
 {
     vis.dev.Transform.World = Position;
     for (int i = 0; i < em.Length; i++)
     {
         vis.dev.Material = em[i].Material3D;                                    // материал,
         vis.dev.SetTexture(0, tex[i]);
         m.DrawSubset(i);                                                        // вершины и треугольники.
     }
 }
Esempio n. 3
0
 public void Draw(Visualization vis)
 {
     vis.dev.Transform.World = Position;
     for (int i = 0; i < em.Length; i++)
     {
         vis.dev.Material = em[i].Material3D;                                    // материал,
         vis.dev.SetTexture(0, tex[i]);
         m.DrawSubset(i);                                                        // вершины и треугольники.
     }
 }
Esempio n. 4
0
        Texture[] tex; // текстуры

        #endregion Fields

        #region Constructors

        /// <summary>
        /// Создание полигональной модели из файла.
        /// </summary>
        /// <param name="vis">Объект трехмерной визуализации</param>
        /// <param name="filename">Имя файла модели (*.х)</param>
        public VObj(Visualization vis, string filename)
        {
            m = Mesh.FromFile(filename, MeshFlags.Managed, vis.dev, out em);            // Загрузить файл полигональной модели вместе со всеми материалами.

            tex = new Texture[em.Length];                                               // Создать массив текстур для каждого материала.

            for (int i = 0; i < tex.Length; i++)                                        // Каждую текстуру
                if (em[i].TextureFilename != null)                                      // для которой задано имя файла
                    tex[i] = TextureLoader.FromFile(vis.dev, em[i].TextureFilename);    // загрузить.
            // Добавить визуальную модель в отрисовку.
            vis.VisualObjects.Add(this);
        }
Esempio n. 5
0
        //Device d3d;
        //Mesh circuit;
        //ExtendedMaterial[] extshema;
        //Texture[] texshema;

        //Mesh objEDS;
        //ExtendedMaterial[] eds;
        //Texture[] texeds;

        //Mesh objIND;
        //ExtendedMaterial[] ind;
        //Texture[] texind;

        //Mesh objCOND;
        //ExtendedMaterial[] cond;
        //Texture[] texcond;

        //Mesh objRES;
        //ExtendedMaterial[] res;
        //Texture[] texres;

        //Matrix viewMatrix;
        //static float ex = 0.0f;
        //static float a = 0.0f;
        //static float Xobj = 0.0f;
        //static float Yobj = 0.0f;
        //static float Zobj = 0.0f;
        //static float EDSpoX = 0.0f;
        //private void Form1_Load(object sender, EventArgs e)
        //{

        //    PresentParameters pp = new PresentParameters();
        //    pp.AutoDepthStencilFormat = DepthFormat.D16;
        //    pp.EnableAutoDepthStencil = true;
        //    pp.SwapEffect = SwapEffect.Discard;
        //    pp.Windowed = true;
        //    d3d = new Device(0, DeviceType.Hardware, panel1, CreateFlags.HardwareVertexProcessing, pp);
        //    d3d.RenderState.Lighting = true;
        //    d3d.Lights[0].Enabled = true;
        //    d3d.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / -2.0f, (float)panel1.Width / panel1.Height, 0.1f, 100.0f);

        //    circuit = Mesh.FromFile("earth\\circuit.x", MeshFlags.Managed, d3d, out extshema);
        //    objEDS = Mesh.FromFile("earth\\circuit.x", MeshFlags.Managed, d3d, out eds);

        //    texeds = new Texture[eds.Length];
        //    texshema = new Texture[extshema.Length];

        //    for (int i = 0; i < eds.Length; i++)
        //    {
        //        if (eds[i].TextureFilename != null)
        //             texeds[i] = TextureLoader.FromFile(d3d, "earth\\earth.bmp");
        //    }

        //        for (int j = 0; j < extshema.Length; j++)
        //        {
        //            if (extshema[j].TextureFilename != null)
        //                texshema[j] = TextureLoader.FromFile(d3d, "earth\\earth.bmp");
        //        }
        //}

        public void Инициализация(object sender, EventArgs e)
        {
            Color c = Color.White;

            visCirc        = new Visualization(panel1, c);
            voCirc         = new VObj(visCirc, "earth\\Circuit.x");
            voEds          = new VObj(visCirc, "earth\\boxik.x");
            voEds.Position = Matrix.Translation(1000.0f, 1000.0f, 1000.0f);

            visCirc.Camera = new Camera(                                       // Задать камеру вида
                Matrix.RotationX(-0.7f) *                                      // Вокруг Ox наклонить на 0.7 радиан
                Matrix.Translation(0, 2.5f, 20.0f));                           // Перенести камеру на 20 единиц вдоль Oz.
            visCirc.Camera = new AroundView(3.0f);
        }
Esempio n. 6
0
        /// <summary>
        /// Установить камеру
        /// </summary>
        /// <param name="dev">Объект трехмерной отрисовки</param>
        public void Setup(Visualization vis)
        {
            vis.dev.Transform.View = View;                                      // Задать матрицу расположения камеры

            Matrix ld = Matrix.Zero;                                            // Матрица строка - вектор направления источника света
            ld.M13 = 1.0f;                                                      // Вектор направлен вдоль Oz
            ld.M12 = -0.4f;                                                     // Слегка наклонен вниз

            Matrix v = View;                                                    // Матрица для рассчета направления источника света
            v.Invert();                                                         // должна быть инвертирована чтобы светить в соответствующем направлении

            ld = Matrix.Multiply(ld, v);                                         // Здать вектор направления источника света в направлении камеры
            vis.dev.Lights[0].Direction = new Vector3(ld.M11, ld.M12, ld.M13);  // Передать вектор направления источнику света
            vis.dev.Lights[0].Update();                                         // Применить изменения направления для рассчета освещения
        }
Esempio n. 7
0
        public static Matrix pos    = Matrix.Identity;                     // и матрица расположения полигональной модели.
        #endregion

        /// <summary>
        /// Создание полигональной модели из файла.
        /// </summary>
        /// <param name="vis">Объект трехмерной визуализации</param>
        /// <param name="filename">Имя файла модели (*.х)</param>
        public VObj(Visualization vis, string filename)
        {
            m = Mesh.FromFile(filename, MeshFlags.Managed, vis.dev, out em);            // Загрузить файл полигональной модели вместе со всеми материалами.

            tex = new Texture[em.Length];                                               // Создать массив текстур для каждого материала.

            for (int i = 0; i < tex.Length; i++)                                        // Каждую текстуру
            {
                if (em[i].TextureFilename != null)                                      // для которой задано имя файла
                {
                    tex[i] = TextureLoader.FromFile(vis.dev, em[i].TextureFilename);    // загрузить.
                }
            }
            // Добавить визуальную модель в отрисовку.
            vis.VisualObjects.Add(this);
        }
Esempio n. 8
0
        }                                                                       // Сохранить соответствующую матрицу вида

        /// <summary>
        /// Установить камеру
        /// </summary>
        /// <param name="dev">Объект трехмерной отрисовки</param>
        public void Setup(Visualization vis)
        {
            vis.dev.Transform.View = View;                                      // Задать матрицу расположения камеры

            Matrix ld = Matrix.Zero;                                            // Матрица строка - вектор направления источника света

            ld.M13 = 1.0f;                                                      // Вектор направлен вдоль Oz
            ld.M12 = -0.4f;                                                     // Слегка наклонен вниз

            Matrix v = View;                                                    // Матрица для рассчета направления источника света

            v.Invert();                                                         // должна быть инвертирована чтобы светить в соответствующем направлении

            ld = Matrix.Multiply(ld, v);                                        // Здать вектор направления источника света в направлении камеры
            vis.dev.Lights[0].Direction = new Vector3(ld.M11, ld.M12, ld.M13);  // Передать вектор направления источнику света
            vis.dev.Lights[0].Update();                                         // Применить изменения направления для рассчета освещения
        }
Esempio n. 9
0
        /// <summary>
        /// Расчитать матрицу позиционирования камеры
        /// </summary>
        /// <param name="dev">Объект трехмерной отрисовки</param>
        public void Setup(Visualization vis)
        {
            Mouse.Update();                                                         // Обновить состояние мыши
                if (Mouse.Buttons.Left)                                                 // если нажата кнопка мыши
                    Position -= Mouse.Coords;                                           // получить изменения координат (в обратном направлении)
                else Position.Z -= Mouse.Coords.Z;                                      // иначе учитывать только поворот колеса мыши

                Matrix v = vis.dev.Transform.View =                                     // расчитать и отправить на отрисовку матрицу позиционирования камеры
                    Matrix.RotationY(Position.X)                                        // поворот вокруг вертикальной оси
                    * Matrix.RotationX(Position.Y)                                      // наклон
                    * Matrix.Translation(0, 0, Position.Z);                             // перемещение всей сцены перед камерой

                Matrix ld = Matrix.Zero;                                                // Матрица строка - вектор направления источника света
                ld.M13 = 1.0f;                                                          // Вектор направлен вдоль Oz
                ld.M12 = -0.4f;                                                         // Слегка наклонен вниз (чтобы низ моделей был немного темнее их верха).

                v.Invert();                                                             // Матрица вида должна быть инвертирована чтобы не расчитывать освещение в противоположном направлении

                ld = Matrix.Multiply(ld, v);                                            // Здать вектор направления источника света вдоль направлении камеры
                vis.dev.Lights[0].Direction = new Vector3(ld.M11, ld.M12, ld.M13);      // Передать вектор направления нулевому источнику света
                vis.dev.Lights[0].Update();                                             // Применить изменения направления для рассчета освещения
        }
Esempio n. 10
0
        //Device d3d;
        //Mesh circuit;
        //ExtendedMaterial[] extshema;
        //Texture[] texshema;
        //Mesh objEDS;
        //ExtendedMaterial[] eds;
        //Texture[] texeds;
        //Mesh objIND;
        //ExtendedMaterial[] ind;
        //Texture[] texind;
        //Mesh objCOND;
        //ExtendedMaterial[] cond;
        //Texture[] texcond;
        //Mesh objRES;
        //ExtendedMaterial[] res;
        //Texture[] texres;
        //Matrix viewMatrix;
        //static float ex = 0.0f;
        //static float a = 0.0f;
        //static float Xobj = 0.0f;
        //static float Yobj = 0.0f;
        //static float Zobj = 0.0f;
        //static float EDSpoX = 0.0f;
        //private void Form1_Load(object sender, EventArgs e)
        //{
        //    PresentParameters pp = new PresentParameters();
        //    pp.AutoDepthStencilFormat = DepthFormat.D16;
        //    pp.EnableAutoDepthStencil = true;
        //    pp.SwapEffect = SwapEffect.Discard;
        //    pp.Windowed = true;
        //    d3d = new Device(0, DeviceType.Hardware, panel1, CreateFlags.HardwareVertexProcessing, pp);
        //    d3d.RenderState.Lighting = true;
        //    d3d.Lights[0].Enabled = true;
        //    d3d.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / -2.0f, (float)panel1.Width / panel1.Height, 0.1f, 100.0f);
        //    circuit = Mesh.FromFile("earth\\circuit.x", MeshFlags.Managed, d3d, out extshema);
        //    objEDS = Mesh.FromFile("earth\\circuit.x", MeshFlags.Managed, d3d, out eds);
        //    texeds = new Texture[eds.Length];
        //    texshema = new Texture[extshema.Length];
        //    for (int i = 0; i < eds.Length; i++)
        //    {
        //        if (eds[i].TextureFilename != null)
        //             texeds[i] = TextureLoader.FromFile(d3d, "earth\\earth.bmp");
        //    }
        //        for (int j = 0; j < extshema.Length; j++)
        //        {
        //            if (extshema[j].TextureFilename != null)
        //                texshema[j] = TextureLoader.FromFile(d3d, "earth\\earth.bmp");
        //        }
        //}
        public void Инициализация(object sender, EventArgs e)
        {
            Color c = Color.White;
            visCirc = new Visualization(panel1, c);
            voCirc = new VObj(visCirc, "earth\\Circuit.x");
            voEds = new VObj(visCirc, "earth\\boxik.x");
            voEds.Position = Matrix.Translation(1000.0f, 1000.0f, 1000.0f);

            visCirc.Camera = new Camera(                                       // Задать камеру вида
                Matrix.RotationX(-0.7f) *                                       // Вокруг Ox наклонить на 0.7 радиан
                Matrix.Translation(0, 2.5f, 20.0f));                            // Перенести камеру на 20 единиц вдоль Oz.
            visCirc.Camera = new AroundView(3.0f);
        }