/// <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(); // Применить изменения направления для рассчета освещения }
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); // вершины и треугольники. } }
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); }
//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); }
/// <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(); // Применить изменения направления для рассчета освещения }
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); }
} // Сохранить соответствующую матрицу вида /// <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(); // Применить изменения направления для рассчета освещения }
/// <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(); // Применить изменения направления для рассчета освещения }