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

Тор из четырехугольников

Функция, строящая квадратический (хоботический?) тор:

; #########################################################################
Torus PROC ListNumber:DWORD,Radius:DWORD,XYParts:DWORD,ZParts:DWORD,FillType:DWORD

LOCAL XYStep:DWORD,ZStep:DWORD
LOCAL i:DWORD,j:DWORD,fi:DWORD,fj:DWORD
LOCAL c0:DWORD,c1:DWORD,r:DWORD,r1:DWORD,z:DWORD,z1:DWORD,b:DWORD,b1:DWORD
LOCAL a0:DWORD,a1:DWORD,tmpx0:DWORD,tmpx1:DWORD,tmpy0:DWORD,tmpy1:DWORD
LOCAL x0:DWORD,y0:DWORD,x1:DWORD,y1:DWORD
LOCAL x2:DWORD,y2:DWORD,x3:DWORD,y3:DWORD
LOCAL x0n:DWORD,y0n:DWORD,x1n:DWORD,y1n:DWORD,zn:DWORD,z1n:DWORD
LOCAL x2n:DWORD,y2n:DWORD,x3n:DWORD,y3n:DWORD,z2n:DWORD,z3n:DWORD

invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE

fldpi
fmul[dva]
fidiv[XYParts]
fst[XYStep]
mov eax,XYParts
dec eax
mov fi,eax

fldpi
fmul[dva]
fidiv[ZParts]
fst[ZStep]

mov i,0
newcicle:

fld[XYStep]
fimul[i]
fst[a0]
fadd[XYStep]
fst[a1]

fld[a0]
fcos
fst[tmpx0]

finit

fld[a0]
fsin
fst[tmpy0]

fld[a1]
fcos
fst[tmpx1]

fld[a1]
fsin
fst[tmpy1]

mov j,0

newline:

fld[ZStep]
fimul[j]
fst[b]

fcos
fst[c0]

mov eax,Radius
fld DWORD PTR [eax+4]
fmul[c0]

fadd DWORD PTR [eax]
fst[r]

finit

fld[b]

fsin
fst[zn]
mov eax,Radius
fmul DWORD PTR [eax+4]
fst[z]

fld[b]
fadd[ZStep]
fst[b1]
fcos
fst[c1]

mov eax,Radius
fld DWORD PTR [eax+4]
fmul[c1]

fadd DWORD PTR [eax]
fst[r1]

finit

fld[b1]

fsin
fst[z1n]
mov eax,Radius
fmul DWORD PTR [eax+4]
fst[z1]

finit
fld[tmpx0]
fmul[r]
fst[x0]

fld[tmpy0]
fmul[r]
fst[y0]

finit
fld[tmpx1]
fmul[r]
fst[x1]

fld[tmpy1]
fmul[r]
fst[y1]

finit
fld[tmpx0]
fmul[r1]
fst[x2]

fld[tmpy0]
fmul[r1]
fst[y2]

finit
fld[tmpx1]
fmul[r1]
fst[x3]

fld[tmpy1]
fmul[r1]
fst[y3]

finit
fld[tmpx0]
fmul[c0]
fst[x0n]

fld[tmpy0]
fmul[c0]
fst[y0n]

finit
fld[tmpx1]
fmul[c0]
fst[x1n]

fld[tmpy1]
fmul[c0]
fst[y1n]

finit
fld[tmpx0]
fmul[c1]
fst[x2n]

fld[tmpy0]
fmul[c1]
fst[y2n]

finit
fld[tmpx1]
fmul[c1]
fst[x3n]

fld[tmpy1]
fmul[c1]
fst[y3n]

invoke glBegin,FillType

invoke glNormal3f,x0n,y0n,zn
invoke glVertex3f,x0,y0,z

invoke glNormal3f,x1n,y1n,zn
invoke glVertex3f,x1,y1,z

invoke glNormal3f,x3n,y3n,z1n
invoke glVertex3f,x3,y3,z1

invoke glNormal3f,x2n,y2n,z1n
invoke glVertex3f,x2,y2,z1

invoke glEnd
inc j
mov ecx,ZParts
cmp ecx,j

jge newline

inc i
mov ecx,fi
cmp ecx,i
jge newcicle

invoke glEndList

ret
Torus ENDP
; #########################################################################

Геометрия тора задается двухэлементным массивом, первый элемент внешний радиус, второй - разность внешнего радиуса и радиуса дырки:

ObjectRadius dd 0.7,0.2

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

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

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