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

Цилиндр

Код функции, строящей цилиндр, прототип функции такой же, как для сферы и эллипсоида:

; #########################################################################
Cone PROC ListNumber:DWORD,Radius:DWORD,XYparts:DWORD,Zparts:DWORD,FillType:DWORD
LOCAL phi:DWORD,i:DWORD,j:DWORD
LOCAL Rx:DWORD,Ry:DWORD,Rz:DWORD
LOCAL theta:DWORD,step:DWORD,R0:DWORD,R1:DWORD
LOCAL theta0:DWORD
LOCAL theta1: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
LOCAL tx0:DWORD,ty0:DWORD,tx1:DWORD,ty1:DWORD

finit

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

finit
mov eax,Radius
fld DWORD PTR [eax+8]

fidiv[Zparts]
fst[phi]

mov eax,Radius
fld DWORD PTR [eax+4]
fsub DWORD PTR [eax]
fidiv[Zparts]
fst[step]

fld DWORD PTR [eax]
fst[R0]

invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE

mov eax,0
mov i,eax

newcicle:
finit
fld[phi]
fimul[i]
fst[phi0]
fld[R0]
fadd[step]
fst[R1]

mov eax,0
mov j,eax

newline:
finit

fld[theta]
fimul[j]
fst[theta0]
fadd[theta]
fst[theta1]
fld[theta0]
fsin

fmul[R0]
fst[y0]

fld[theta0]
fcos
fmul[R0]
fst[x0]
fld[phi0]

fst[z0]

finit
fld[theta1]

fsin
fmul[R0]
fst[y1]

finit
fld[theta1]
fcos
fmul[R0]
fst[x1]

fld[phi0]

fst[z1]

finit
fld[theta1]
fsin
fmul[R1]
fst[y2]

finit
fld[theta1]
fcos
fmul[R1]
fst[x2]

fld[phi0]
fadd[phi]
fst[phi1]
fst[z2]

finit
fld[theta0]
fsin
fmul[R1]
fst[y3]

finit
fld[theta0]
fcos
fmul[R1]
fst[x3]

fld[phi1]

fst[z3]
finit
fild[j]

fidiv[XYparts]

fst[tx0]
fild[j]
fadd[dFloat1]
fidiv[XYparts]

fst[tx1]

finit
fild[i]
fidiv[Zparts]

fst[ty0]
fild[i]
fadd[dFloat1]

fidiv[Zparts]
fst[ty1]

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,Zparts
jle newline

push R1
pop R0

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

ret
Cone ENDP
; #########################################################################

Трехэлементный массив размера, первый и второй элементы - диаметры оснований, третий - высота:

ObjectRadius dd 0.5,0.5,0.8

Пример цилинра, построенного функцией:

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

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