Подготовка сцены
<Предыдущая
часть> <Следующая
часть>
Итак, вы создали самые необходимые объекты для 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 объектов, инициализации сцены, и
определения геометрии для сцены, вы можете начать рендеринг сцены. Об этом и
пойдет речь дальше.
<Вверх>
Posted: 23.01.2k1
Autor: Antiloop
<anti_loop@mail.ru>
|
 |
 |
|