Опубликован: 13.07.2010 | Доступ: свободный | Студентов: 889 / 20 | Оценка: 4.40 / 4.20 | Длительность: 77:34:00
Самостоятельная работа 10:

Введение в DirectX

Задание положения треугольника в мировых координатах

Теперь модифицируем наше приложение и нарисуем непреобразованный треугольник. Вначале нужно изменить данные нашего треугольника, чтобы использовать один из типов непреобразованных вершинных форматов. Для этого вновь зададим местоположение и цвет вершин, а также новое свойство вершинного формата. Внесите соответствующие изменения в функцию OnPaint() как показано ниже

protected override void OnPaint(PaintEventArgs e)
        {
            // Очистить цветом клиентскую область формы
            device.Clear(ClearFlags.Target,
                System.Drawing.Color.CornflowerBlue,
                1.0F, 0);
    
            /*
            // Содать массив структур преобразованных координат
            CustomVertex.TransformedColored[] verts = new
                CustomVertex.TransformedColored[3];
    
            // Задать параметры треугольника
            verts[0].SetPosition(new Vector4(this.ClientSize.Width / 2.0F,
                50.0F, 0.5F, 1.0F));
            verts[0].Color = System.Drawing.Color.Aqua.ToArgb();
            verts[1].SetPosition(new Vector4(this.ClientSize.Width - 
                this.ClientSize.Width / 5.0F,
                this.ClientSize.Height - this.ClientSize.Height / 5.0F,
                0.5F, 1.0F));
            verts[1].Color = System.Drawing.Color.Black.ToArgb();
            verts[2].SetPosition(new Vector4(this.ClientSize.Width / 5.0F,
                this.ClientSize.Height - this.ClientSize.Height / 5.0F,
                0.5F, 1.0F));
            verts[2].Color = System.Drawing.Color.Purple.ToArgb();
    
            // Сформировать сцену
            device.BeginScene();
            device.VertexFormat = CustomVertex.TransformedColored.Format;
            device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, verts);
            device.EndScene();
            */
    
            // Содать массив структур непреобразованных координат
            CustomVertex.PositionColored[] verts = new
                CustomVertex.PositionColored[3];
    
            // Задать параметры треугольника
            verts[0].SetPosition(new Vector3(0.0F, 1.0F, 1.0F));
            verts[0].Color = System.Drawing.Color.Aqua.ToArgb();
            verts[1].SetPosition(new Vector3(-1.0F, -1.0F, 1.0F));
            verts[1].Color = System.Drawing.Color.Black.ToArgb();
            verts[2].SetPosition(new Vector3(1.0F, -1.0F, 1.0F));
            verts[2].Color = System.Drawing.Color.Purple.ToArgb();
    
            // Сформировать сцену
            device.BeginScene();
            device.VertexFormat = CustomVertex.PositionColored.Format;
            device.DrawUserPrimitives(PrimitiveType.TriangleList, 1, verts);
            device.EndScene();
    
            // Перерисовать
            device.Present();
    
            // Принудительно перерисовать
            this.Invalidate();
    
            // Вызвать обработчики, подписавшиеся на событие Paint
            // base.OnPaint(e);
        }
Листинг 10.8. Переход на непреобразованный вершинный формат

Мы сменили тип массива структур для хранения цвета и координат вершин треугольника на внешние (мировые) координаты. Поскольку вершины не являются преобразованными, мы используем структуру Microsoft.DirectX. Vector3 вместо Microsoft.DirectX. Vector4. Элементы Microsoft.DirectX. Vector3 структурируют видеокарту непосредственно в координатах мирового пространства X, Y, Z. Присваивая при формировании сцены свойству device. VertexFormat значение CustomVertex. PositionColored.Format, мы информируем непрограммируемый конвейер о том, что вершины отображаемого объекта заданы в мировых координатах.

Теперь если запустить приложение, то треугольник отображаться не будет. Проблема в том, располагая объект в мировом пространстве, мы не дали Direct3D никакой информации о том, как он должен этот объект отображать. Нужно добавить в сцену камеру, которая может определять и рассматривать наш объект. В преобразованных координатах камера была не нужна, потому, что привязка к экранным координатам однозначно определяла положение объекта.

Камера управляется с помощью двух различных линейных преобразований. Каждое преобразование определяется матрицей размером 4x4, которую можно переслать в Direct3D. Преобразование проекции используется для определения того, как сцена должна проецироваться на экран. Один из самых простых способов создания матрицы проекции состоит в использовании функции Microsoft.DirectX.Matrix. PerspectiveFovLH() структуры Matrix, которая создает матрицу проекции левой системы координат (для правой системы координат служит метод Microsoft.DirectX.Matrix.PerspectiveFovRH). Левая система координат моделирует угол зрения пользователя, когда он смотрит на экран монитора.


Создание перспективы

Приложения Direct3D используют левую ситему координат естественным образом. Для смены системы координат нужны дополнительные действия.

Функция PerspectiveFovLH() имеет следующий синтаксис

public static Microsoft.DirectX.Matrix.PerspectiveFovLH(
  System.Single fieldOfViewY, // Угол зрения камеры
  System.Single aspectRatio,  // Форматное соотношение сторон
  System.Single znearPlane,   // Ближний план (по Z-координате)
  System.Single zfarPlane)    // Дальний план (по Z-координате)
Листинг 10.9. Функция PerspectiveFovLH()

Преобразование проекции служит для описания сцены, представленной в виде усеченной пирамиды, секущие плоскости которой определяют перспективу.


Заметим, что у структуры System. Single в языке C# имеется псевдоним - ключевое слово float. Два параметра функции преобразования перспективы определяют ближнюю и дальнюю плоскости усеченной пирамиды. Параметр поля зрения определяется углом при вершине пирамиды. Форматное соотношение сторон любого из сечений пирамиды аналогично форматам телевидения, например, широкоформатное телевидение имеет соотношение 1.85. Можно понимать это соотношение как отношение ширины изображения к высоте. Direct3D прорисовывает только те объекты, которые в мировых координатах попадают внутрь усеченной пирамиды.