Основы трехмерной графики в среде Blitz3D


Создание модели меча (45 мин)


Сначала полезно построить чертеж и найти координаты вершин.


Создаем заголовок:

GRAPHICS3D 640,480



cam = CREATECAMERA()

POSITIONENTITY cam, 0, 0, -30

l = CREATELIGHT()

ROTATEENTITY l, 0, 45, 45

Загрузим текстуры:

wood = LOADTEXTURE("c:\media\wood.jpg")

steel = LOADTEXTURE("c:\media\steel.jpg",1 + 8 + 64)

Дополнительный параметр во второй строке означает то, что текстура является сферической картой отражений. Это особый тип текстуры, который создает иллюзию зеркальности объекта. Создаем две пустые фигуры и накладываем на них текстуры steel (сталь) и wood (дерево):

m1 = CREATEMESH()

ENTITYTEXTURE m1, steel

m2 = CREATEMESH(m1)

ENTITYTEXTURE m2, wood

Так как порядок действий для оформления фигур один и тот же, а в программе необходимо создать две фигуры, то удобнее будет сделать это в цикле. Оператор IF-THEN задает первую фигуру для оформления в первом шаге цикла, а вторую – во втором.

FOR n=1 TO 2

 IF n = 1 THEN

  m = m1

 ELSE

  m = m2

 END IF

Создаем поверхность, привязанную к фигуре:

 s = CREATESURFACE(m)

Считываем количество вершин:

 READ vq

Цикл по всем вершинам:

 FOR nn = 1 TO vq

Считываем координаты вершины:

  READ x#, y#, z#

Добавляем вершину к поверхности (координаты текстуры возьмем случайные) и закрываем цикл:

  ADDVERTEX s, x#, y#, z#, RND(1), RND(1)

 NEXT

Считываем кол-во треугольников

 READ tq

Цикл по всем треугольникам:

 FOR nn = 1 TO tq

Считываем индексы вершин:

  READ v1, v2, v3

Добавляем треугольник, закрываем цикл:

  ADDTRIANGLE s, v1, v2, v3

 NEXT

Обеспечение корректного освещения:

 UPDATENORMALS m

NEXT

Теперь вернемся к основной программе. Создадим две фигуры с адресами m1 и m2 и текстурами steel и wood. Обратите внимание на то, что родительский объект фигуры m1 равен 0, то есть не существует.

m1 = READMESH(0, steel)

m2 = READMESH (m1, wood)

Создадим ручку меча – цилиндр:




cyl = CREATECYLINDER(20, 1, m1)

POSITIONENTITY cyl, 0, -3, 0

SCALEENTITY cyl, 1, 2, 1

ENTITYTEXTURE cyl, wood

Перекладина гарды меча:

cube = CREATECUBE(m1)

POSITIONENTITY cube, 0, -0.5, 0

SCALEENTITY cube, 3, 0.5, 1

ENTITYTEXTURE cube, wood

Далее идет цикл с командами управления вращением меча с клавиатуры:

REPEAT

 IF KEYDOWN(200) THEN xa = xa + 1

 IF KEYDOWN(208) THEN xa = xa - 1

 IF KEYDOWN(203) THEN ya = ya + 1

 IF KEYDOWN(205) THEN ya = ya - 1

 ROTATEENTITY m1, xa, ya, 0

 IF KEYDOWN(1) THEN EXIT

 RENDERWORLD

 FLIP

FOREVER

Данные рекомендуется найти по чертежу, привлекая к поиску учеников.

Данные (9 вершин лезвия):

DATA 9

DATA -2, 0, 0

DATA 0, 0, -0.5

DATA 2, 0, 0

DATA 0, 0, 0.5

DATA -2, 20, 0

DATA 0, 19, -0.5

DATA 2, 20, 0

DATA 0, 19, 0.5

DATA 0, 22, 0

12 треугольников лезвия:

DATA 12

DATA 0, 4, 1

DATA 4, 5, 1

DATA 4, 8, 5

DATA 8, 6, 5

DATA 5, 6, 2

DATA 5, 2, 1

DATA 0, 3, 4

DATA 3, 7, 4

DATA 3, 2, 7

DATA 2, 6, 7

DATA 7, 8, 4

DATA 7, 6, 8

10 вершин концов гарды:

DATA 10

DATA -5, -2, 0

DATA -3, 0, -1

DATA 3, 0, -1

DATA 5, -2, 0

DATA 3, -1, -1

DATA -3, -1, -1

DATA -3, 0, 1

DATA 3, 0, 1

DATA 3, -1, 1

DATA -3, -1, 1

8 треугольников концов гарды:

DATA 8

DATA 0, 1, 5

DATA 0, 9, 6

DATA 0, 6, 1

DATA 0, 5, 9

DATA 4, 3, 8

DATA 2, 3, 4

DATA 7, 3, 2

DATA 8, 3, 7


Содержание раздела