Приготовление сцены

<Уголок DirectX> <Предыдущая часть> <Следующая часть>


Итак, вы создали самые необходимые объекты для 3D рендеринга (объект DirectDraw, устройство рендеринга и объект Viewport). Следующая вещь, которую надо будет сделать - установить начальное состояние освещения и создать и сконфигурировать материал. При необходимости, вы можете изменить эти установки позже.

Следующий код прилагает начальное состояние освещения к устройству рендеринга g_d3dDevice путем вызова метода Direct3DDevice7.SetRenderState

Sub InitScene()
g_d3dDevice.SetRenderState D3DRENDERSTATE_AMBIENT, g_dx.CreateColorRGBA (1#, 1#, 1#, 1#)

В своем первом параметре, SetRenderState передает флаг D3DRENDERSTATE_AMBIENT, ассоциируя вызов с вещественным освещением. Второй аргумент использует метод DirectX7.CreateColorRGBA для установки красного, зеленого и синего значений цвета соответственно в 1.0, 1.0, 1.0 Результирующий свет получается белым. Цвет не использует альфа-компоненту, которая в этом случае также установлена в 1.0

Используйте тип D3DMATERIAL7 для установки свойств материала:

Dim mtrl As D3DMATERIAL7

mtrl.Ambient.r = 1#
mtrl.Ambient.g = 1#
mtrl.Ambient.b = 0#

' Передать материал устройству.
g_d3dDevice.SetMaterial mtrl

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

Теперь, когда материал и свет заданы, следующей ступенью будет задание матриц Мира, Обзора и Проекции. Ориентируясь в этих матрицах, система сможет правильно располагать геометрию объектов, камеру и ориентацию смотрящего.

Эти определения матриц поместите в раздел Declarations:

Dim matWorld As D3DMATRIX
Dim matView As D3DMATRIX
Dim matProj As D3DMATRIX

Чтобы создать матрицу Мира, объявите тип D3DMATRIX, matWorld и создайте идентификацию матрицы. Затем, используйте метод Direct3DDevice7.SetTransform с флагом D3DTRANSFORMSTATE_WORLD, чтобы определить матрицу мира.

' Матрица Мира контролирует позицию и ориентацию многоугольников
' в мировом пространстве. Мы будем использовать это позже, для
' того, чтобы вращать треугольник

g_dx.IdentityMatrix matWorld
g_d3dDevice.SetTransform D3DTRANSFORMSTATE_WORLD, matWorld

Чтобы создать матрицу обзора, объявите тип D3DMATRIX, matView и создайте идентификацию матрицы. Затем, передайте координаты камеры в метод DirectX7.ViewMatrix, чтобы создать матрицу обзора. Используйте метод SetTransform, чтобы определить матрицу обзора для устройства рендеринга.

' Матрица обзора определяет позицию и ориентацию камеры
' Здесь мы просто двигаем ее назад на 15 единиц вдоль оси Z

g_dx.IdentityMatrix matView
Call g_dx.ViewMatrix(matView, MakeVector(0, 0, -15), MakeVector(0, 0, 0), _
MakeVector(0, 1, 0), 0)
g_d3dDevice.SetTransform D3DTRANSFORMSTATE_VIEW, matView

Предыдущий код использует функцию MakeVector, чтобы перевести три точки в тип D3DVECTOR. Вот эта функция. Поместите ее код отдельно!

Private Function MakeVector(a As Double, b As Double, c As Double) As D3DVECTOR
Dim vecOut As D3DVECTOR
With vecOut
.x = a
.y = b
.z = c
End With
MakeVector = vecOut
End Function

Чтобы создать матрицу проекции, повторите пункит с созданием типа D3DMATRIX, затем передайте обрезаемые плоскости и поля угла зрения в метод DirectX7.ProjectionMatrix чтобы создать матрицу проекции. Используйте метод SetTransform, чтобы определить матрицу для устройства рендеринга.

' Матрица проекции определяет, как 3D сцена проецируется на
' 2D цель рендеринга (заднюю поверхность).

g_dx.IdentityMatrix matProj
Call g_dx.ProjectionMatrix(matProj, 1, 1000, pi / 2)
g_d3dDevice.SetTransform D3DTRANSFORMSTATE_PROJECTION, matProj
End Sub

В этом коде второй параметр передает в ProjectionMatrix пердставление расстояния до ближайшей обрезаемой плоскости в указаных приложением единицах, а третий параметр представляет расстояние до дальней обрезаемой плоскости. Четвертый параметр - это поле видимого угла зрения в радианах.

С матрицами покончено, переходим к приготовлению геометрии для нашей сцены. Приготовление геометрии заключается в определении четырех типоы D3DVECTOR. Тип вектора используется для каждой из трех точек, необходимых для задания треугольника и еще один тип нужен для задания нормали в трехмерном пространстве. Технически, вам не обязательно задавать геометрию на этом этапе, вы можете задать ее позже.

Dim p1 As D3DVECTOR, p2 As D3DVECTOR, p3 As D3DVECTOR, vNormal As D3DVECTOR
Dim g_TriangleVert(5) As D3DVERTEX

Private Sub InitGeometry()
' Установить геометрию для треугольника

' Установить значения для трех точек, чтобы получить треугольник
p1.x = 0#
p1.y = 5#
p1.z = 0#
p2.x = 5#
p2.y = -5#
p2.z = 0#
p3.x = -5#
p3.y = -5#
p3.z = 0#

' Создать вектор нормали, указывающий прмо на Viewport
' Мы обратили Z координату номали, что определило
' обратную сторону треугольника

vNormal.x = 0#
vNormal.y = 0#
vNormal.z = -1#

Метод DirectX7.CreateD3DVertex использует члены типа D3DVECTOR, чтобы заполнить тип D3DVERTEX, используя индивидуальные значения, которые представляют компоненты вершин. Заполните массив глобального типа D3DVERTEX, g_TriangleVert информацией о вершинах треугольника.

' Создать 3 вершины для передней части треугольника
g_dx.CreateD3DVertex p1.x, p1.y, p1.z, vNormal.x, vNormal.y, vNormal.z, 0, 0, _ g_TriangleVert(0)
g_dx.CreateD3DVertex p2.x, p2.y, p2.z, vNormal.x, vNormal.y, vNormal.z, 0, 0, _ g_TriangleVert(1)
g_dx.CreateD3DVertex p3.x, p3.y, p3.z, vNormal.x, vNormal.y, vNormal.z, 0, 0, _ g_TriangleVert(2)

' Теперь, то же самое для задней части треугольника
g_dx.CreateD3DVertex p3.x, p3.y, p3.z, vNormal.x, vNormal.y, -vNormal.z, 0, 0, _ g_TriangleVert(3)
g_dx.CreateD3DVertex p2.x, p2.y, p2.z, vNormal.x, vNormal.y, -vNormal.z, 0, 0, _ g_TriangleVert(4)
g_dx.CreateD3DVertex p1.x, p1.y, p1.z, vNormal.x, vNormal.y, -vNormal.z, 0, 0, _ g_TriangleVert(5)
End Sub

Этот фрагмент кода находит три точки в трехмерном пространстве, которые определяют треугольник, стоящий вертикально относительно плоскости Z=0.

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

<Вверх>