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

Шар

Сфера строится послойно, основной цикл - по меридиану (ось Z), вложенный по широте (оси X-Y). Число разбиений по широте и меридиану задается отдельно. Параметр FillType определяет тип сферы, значение GL_LINE_LOOP позволяет создать проволочную серу, GL_QUADS - сплошную. Код функции:

; #########################################################################
Sphere PROC ListNumber:DWORD,szRadius:DWORD,XYparts:DWORD,Zparts:DWORD,FillType:DWORD

LOCAL phi:DWORD,i:DWORD,j:DWORD,fi:DWORD,polpi:DWORD
LOCAL theta:DWORD,theta0:DWORD,theta1:DWORD,Radius:DWORD
LOCAL phi0:DWORD,sphi0:DWORD,cphi0:DWORD
LOCAL phi1:DWORD,sphi1:DWORD,cphi1:DWORD
LOCAL x0:DWORD,y0:DWORD,z0:DWORD,x1:DWORD,y1:DWORD,z1:DWORD,x2:DWORD,y2:DWORD,z2:DWORD,x3:DWORD,y3:DWORD,z3:DWORD

mov eax,szRadius
mov eax,[eax]
mov Radius,eax
finit
fldpi

fidiv[Zparts]

fst[phi]

fldpi
fmul[dva]
fidiv[XYparts]
fst[theta]

fldpi
fdiv[dva]
fchs
fst[polpi]

invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
invoke glEnable,GL_NORMALIZE
mov eax,0
mov i,eax
mov eax,XYparts
mov fi,eax
dec fi

newcicle:
finit
fld[phi]
fimul[i]
fadd[polpi]
fst[phi0]
fcos
fst[cphi0]

finit
fld[phi0]
fsin
fst[sphi0]

mov eax,0
mov j,eax

newline:
finit

fld[theta]
fimul[j]
fst[theta0]

fsin
fmul[cphi0]
fmul[Radius]
fst[y0]

finit
fld[theta0]
fcos
fmul[cphi0]
fmul[Radius]
fst[x0]

finit
fld[phi0]
fsin
fmul[Radius]
fst[z0]

finit
fld[theta0]
fadd[theta]
fst[theta1]
fsin
fmul[cphi0]
fmul[Radius]
fst[y1]

finit
fld[theta1]
fcos
fmul[cphi0]
fmul[Radius]
fst[x1]

fld[phi0]
fsin
fmul[Radius]
fst[z1]

fld[phi0]
fadd[phi]
fst[phi1]
fsin
fst[sphi1]
finit
fld[phi1]
fcos
fst[cphi1]

fld[theta1]
fsin
fmul[cphi1]
fmul[Radius]
fst[y2]

finit
fld[theta1]
fcos
fmul[cphi1]
fmul[Radius]
fst[x2]

fld[phi1]
fsin
fmul[Radius]
fst[z2]

finit
fld[theta0]
fsin
fmul[cphi1]
fmul[Radius]
fst[y3]

finit
fld[theta0]
fcos
fmul[cphi1]
fmul[Radius]
fst[x3]

fld[phi1]
fsin
fmul[Radius]
fst[z3]

invoke glBegin,FillType
invoke glNormal3f,x0, y0, z0
invoke glVertex3f,x0,y0,z0


invoke glNormal3f,x1, y1, z1
invoke glVertex3f,x1,y1,z1


invoke glNormal3f,x2, y2, z2
invoke glVertex3f,x2,y2,z2


invoke glNormal3f,x3, y3, z3
invoke glVertex3f,x3,y3,z3

invoke glEnd

inc j
mov eax,j
cmp eax,fi
jle newline

inc i
mov eax,i
cmp eax,Zparts
jnz newcicle
invoke glEndList

ret
Sphere ENDP
; #########################################################################

Прототип функции:

Sphere PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD

В секции данных определяем позицию, радиус, направление и скорость поворота сферы (это для наглядности, поэтому и сама сфера проволочная), положение источника света:

Position1 dd 0.0,0.0,-5.0,2.0,0.0,0.0,0.0

dFloat0 dd 0.0
dFloat1 dd 1.0
dva dd 2.0

ObjectRadius dd 0.8
RotationAngles dd 1.0,0.5,0.8
RotationSpeed dd 1.0,0.5,0.8
LightPosition dd -1.0,1.0,2.0,1.0

Вызов функции:

invoke Sphere,1,ADDR ObjectRadius,24,24,GL_LINE_LOOP

Функция для поворота сферы:

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

mov eax,ZYXPosition
invoke glTranslatef,[eax],[eax+4],[eax+8]
mov eax,ZYXPosition
invoke glScalef,[eax+12],[eax+12],[eax+12]
mov eax,ZYXAngles
mov ebx,ZYXRotations
fld DWORD PTR [eax+8]
fadd DWORD PTR [ebx+8]
fstp DWORD PTR [eax+8]
invoke glRotatef,DWORD PTR [eax+8],dFloat0,dFloat0,dFloat1

mov eax,ZYXAngles
mov ebx,ZYXRotations
fld DWORD PTR [eax+4]
fadd DWORD PTR [ebx+4]
fstp DWORD PTR [eax+4]
invoke glRotatef,[eax+4], dFloat1,dFloat0,dFloat0

mov eax,ZYXAngles
mov ebx,ZYXRotations
fld DWORD PTR [eax]
fadd DWORD PTR [ebx]
fstp DWORD PTR [eax]
invoke glRotatef,[eax],dFloat0,dFloat1,dFloat0


invoke glCallList,ListNumber
ret

Rotate ENDP

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

помимо позиционирования позволяет изменять масштаб объекта, масштабный множитель - четвертый элемент массива позиции, в данном примере он одинаков для всех трех осей:

mov eax,ZYXPosition
invoke glScalef,[eax+12],[eax+12],[eax+12]

Пример работы программы:

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

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