MASM32 и OpenGL
Это не так сложно, как на самом деле

Сборка модели из 3d-примитивов

Используя сферу, диск, цилиндр, тор и параллелепипед можно собирать достаточно сложные 3d-объекты. В примере показана сборка снеговика. Для этого потребуются функции, создающие сферу, диск и цилиндр. Эти функции есть в предыдущих примерах. Дальше нужно создать детали снеговика функцией CreateObjects:

; #########################################################################
CreateObjects PROC ParentW:DWORD,ParentH:DWORD
invoke SolidSphere,1,ADDR white,ADDR SphereRadius1,24
invoke SolidSphere,2,ADDR white,ADDR SphereRadius2,24
invoke SolidSphere,3,ADDR white,ADDR SphereRadius3,24

invoke SolidDisk,4,ADDR blue,ADDR DiskRadius,24
invoke SolidCylinder,5,ADDR blue,ADDR CylinderRadius,24

invoke SolidCylinder,6,ADDR orange,ADDR CylinderRadius1,12
invoke SolidSphere,7,ADDR black,ADDR SphereRadius4,24
invoke SolidSphere,8,ADDR black,ADDR SphereRadius4,24

invoke glMatrixMode,GL_PROJECTION
ret
CreateObjects ENDP
; #########################################################################

Затем - вывести на экран в процедуре DrawScene :

; #########################################################################

DrawScene PROC
invoke CreateLight
invoke glClear,GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT


invoke glPushMatrix
invoke Rotate,1,ADDR CentrePosition,ADDR CentreSpeed,ADDR CentreAngles

invoke Rotate,2,ADDR SpherePosition2,ADDR RotSpeed,ADDR RotAngles

invoke Rotate,3,ADDR SpherePosition3,ADDR RotSpeed,ADDR RotAngles

invoke Rotate,4,ADDR DiskPosition,ADDR RotSpeed,ADDR RotAngles

invoke Rotate,5,ADDR CylinderPosition,ADDR RotSpeed,ADDR RotAngles

invoke Rotate,6,ADDR CylinderPosition1,ADDR RotSpeed,ADDR RotAngles

invoke Rotate,7,ADDR SpherePosition4,ADDR RotSpeed,ADDR RotAngles

invoke Rotate,8,ADDR SpherePosition5,ADDR RotSpeed,ADDR RotAngles

invoke glPopMatrix
invoke SwapBuffers,MainHDC
ret

DrawScene ENDP
; #########################################################################

Позиции объектов определяются в секции данных:

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

CentrePosition dd 0.0,0.0,-5.0
CentreAngles dd 0.0,0.0,0.0
CentreSpeed dd -0.5,0.0,0.0


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
SpherePosition1 dd 1.0,1.0,0.0
SphereRadius1 dq 0.6


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
SpherePosition2 dd 0.0,0.7,0.0;
SphereRadius2 dq 0.4


;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
SpherePosition3 dd 0.0,0.5,0.0
SphereRadius3 dq 0.3

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
SpherePosition4 dd -0.2,0.05,0.0,0.0
SphereRadius4 dq 0.04
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
SpherePosition5 dd 0.4,-0.0,0.0,0.0
SphereRadius5 dq 0.04
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
CylinderPosition dd 0.0,0.0,0.0,0.0,1.0,0.0,0.0
CylinderRadius dq 0.25,0.15,0.4

CylinderPosition1 dd 0.0,-0.2,-0.15,90.0
CylinderRadius1 dq 0.08,0.0,0.6

DiskPosition dd 0.0,0.2,0.0,-90.0,1.0,0.0,0.0
DiskRadius dq 0.2,0.5

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

В приведенном варианте процедуры DrawScene каждый последующий объект позиционируется относительно предыдущего. Позиция задает не только координаты каждой детали, но и начальную ориентацию детали относительно осей координат - четвертый элемент массива - это угол поворота, пятый, шестой и седьмой элементы показывают, вокруг каких осей производится поворот (1 - есть поворот, 0 - нет). Установка деталей в необходимое положение происходит в функции Rotate:

; #########################################################################
Rotate PROC ListNumber:DWORD,ZYXPosition:DWORD,ZYXRotations:DWORD,ZYXAngles:DWORD

mov eax,ZYXPosition
invoke glTranslatef,[eax],[eax+4],[eax+8]

mov eax,ZYXPosition

invoke glRotatef,[eax+12],[eax+16],[eax+20],[eax+24]
mov eax,ZYXAngles
mov ebx,ZYXRotations
fld DWORD PTR [eax]
fadd DWORD PTR [ebx]
fstp DWORD PTR [eax]
invoke glRotatef,[eax],dFloat1,dFloat1,dFloat1

invoke glCallList,ListNumber

ret
Rotate ENDP

; ########################################################################

После сборки снеговик ведет себя как единый объект - при вращении не разваливается. Результат работы программы:

Скачать исходники и ехе-файл.

©   Короленко М.В., 2011       
Перепечатка материалов возможна только после согласования с автором при условии обязательной ссылки на сайт