DirectX & Visual Basic

Учебник DirectX Graphics: часть 3

<<Предыдущая часть

Использование матриц

В этой части показано, как использовать матрицы, чтобы вращать треугольник в трёхмерном пространстве.

Для создания программы в этой части Вам необходима программа, созданная Вами в предыдущей части, так как в тексте приводятся только изменения, которые необходимо сделать в её коде, а кода, общего у обоих программ здесь нет.

Первым делом изменим тип 3d вершин. Для этого заменим объявления типа CUSTOMVERTEX и константы D3DFVF_CUSTOMVERTEX, описывающей этот тип, следующими:

Private Type CUSTOMVERTEX
    x As Single         'x
    y As Single         'y
    z As Single         'z
    color As Long       'цвет вершины
End Type

Const D3DFVF_CUSTOMVERTEX = (D3DFVF_XYZ Or D3DFVF_DIFFUSE)

Добавим также объявление константы g_pi (нам будет нужно значение числа Пи):

Const g_pi = 3.1415

В конец функции InitD3d, перед строкой InitVB=True вставим следующий код:

'выключаем culling
g_D3DDevice.SetRenderState D3DRS_CULLMODE, D3DCULL_NONE
'выключаем освещение
g_D3DDevice.SetRenderState D3DRS_LIGHTING, 0

Culling - это способ увеличения скорости рендеринга, при котором прорисовывается только передняя сторона примитивов. Какая у примитива сторона передняя, а какая задняя определяется по порядку следования вершин. По-умолчанию передней считается сторона, вершины которой расположены по часовой стрелке. Чтобы видеть обе стороны треугольника при его вращении, отключаем culling. Трёхмерное освещение мы пока тоже отключаем.

Заменим в функции InitVB код, который задаёт координаты и цвет 3d вершин, следующим:

With Vertices(0): .x = -1: .y = -1: .z = 0: .color = &HFFFF0000: End With
With Vertices(1): .x = 1: .y = -1: .z = 0:  .color = &HFF00FF00: End With
With Vertices(2): .x = 0: .y = 1: .z = 0:  .color = &HFF00FFFF: End With

Как видите, теперь используются не экранные координаты, а координаты виртуального трёхмерного мира, размер же треугольника на экране определяется с использованием матрицы проекции.

Добавим функцию vec3, создающую трёхмерный вектор, которая будет нужна впоследствии:

Function vec3(x As Single, y As Single, z As Single) As D3DVECTOR
    vec3.x = x
    vec3.y = y
    vec3.z = z
End Function

Создадим процедуру SetupMatrices, вращающую треугольник:

Public Sub SetupMatrices()
Dim matWorld As D3DMATRIX 'матрица Мира
D3DXMatrixRotationY matWorld, Timer * 4
g_D3DDevice.SetTransform D3DTS_WORLD, matWorld

Dim matView As D3DMATRIX 'матрица Обзора
D3DXMatrixLookAtLH matView, vec3(0, 3, -5), _
                            vec3(0, 0, 0), _
                            vec3(0, 1, 0)
                             
g_D3DDevice.SetTransform D3DTS_VIEW, matView

Dim matProj As D3DMATRIX 'матрица Проэкции
D3DXMatrixPerspectiveFovLH matProj, g_pi / 4, 1, 1, 1000
g_D3DDevice.SetTransform D3DTS_PROJECTION, matProj

End Sub

Для вращения треугольника мы используем матрицу Мира. Процедура D3DXMatrixRotationY вращает матрицу, указанную первым параметром, вокруг оси OY на угол в радианах, указанный во втором параметре. Затем мы применяем это вращение ко всем объектам сцены с помощью метода SetTransform. Первый параметр этого метода - тип трансформации, а второй - матрица, использующаяся для выполнения трансформации.

Используя матрицу Обзора, мы настраиваем "камеру", через которую мы смотрим на трёхмерный мир. Процедура D3DXMatrixLookAtLH устанавливает позицию и поворот этой "камеры". Первый её параметр - возвращаемая матрица, второй и третий параметры устанавливают соответственно точку, в которой находится "камера" и точку, на которую направлена эта "камера", четвёртый параметр - вектор, устанавливающий направление "верха". С помощью полученной матрицы Обзора производим соответствующую трансформацию методом SetTransform.

Для настройки того, как трёхмерные объекты проецируются на двухмерную плоскость, мы используем матрицу Проекции. Процедура D3DXMatrixPerspectiveFovLH настраивает эту матрицу. Первый её параметр - возвращаемая матрица; второй параметр - поле обзора, определяющее, как с увеличением расстояния до них объекты становятся меньше, типичное поле обзора - 1/4 pi, т. е. 45°; третий параметр - aspect ratio, определяющий отношение ширины к высоте; четвёртый и пятый параметры устанавливают ближнюю и дальнюю границы клиппинга, суть которого в том, что происходит рендеринг только тех объектов, которые расположены между этими границами, остальные же объекты не рендерятся.

Теперь не забудьте вставить команду вызова процедуры SetupMatrices в процедуру Render сразу после строки g_D3DDevice.BeginScene, иначе треугольник вращаться не будет. Всё готово!

Теперь вы можете запускать программу на выполнение, и если всё правильно, то Вы увидите вращающийся разноцветный треугольник.

Вы можете скачать архив RAR с готовым проектом (3 Кб).

В следующей части мы будем создавать и использовать источники света.

Следующая часть>>

Hosted by uCoz