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

Тор

Тор (бублик, если по-простому) представляет собой поверхность четвертого порядка. Параметрические уравнения тора есть в учебниках, приведенная ниже функция построения тора использует именно их. Нормали построены к касательным плоскостям. Код функции (для наглядности не оптимизирован):

; #########################################################################
Torus PROC ListNumber:DWORD,Radius:DWORD,MaxParts:DWORD,MinParts:DWORD,Color:DWORD
LOCAL MaxStep:DWORD,MinStep:DWORD
LOCAL i:DWORD,j:DWORD
LOCAL c0:DWORD,r:DWORD,z:DWORD,b:DWORD
LOCAL a0:DWORD,a1:DWORD,x0:DWORD,x1:DWORD,y0:DWORD,y1:DWORD
LOCAL fi:DWORD,fj:DWORD,tx0:DWORD,tx1:DWORD,ty:DWORD
LOCAL tempX0:DWORD,tempY0:DWORD,tempX1:DWORD,tempY1:DWORD,tempZ:DWORD,
tempX0c:DWORD,tempY0c:DWORD,tempX1c:DWORD,tempY1c:DWORD,zc:DWORD



invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE


fldpi
fmul[dva]
fidiv[MaxParts]
fst[MaxStep]

fldpi
fmul[dva]
fidiv[MinParts]
fst[MinStep]

mov i,0
newcicle:

fild[i]
fstp[fi]

fld[MaxStep]
fmul[fi]
fst[a0]
fadd[MaxStep]
fst[a1]

fld[a0]
fcos
fst[x0]

finit

fld[a0]
fsin
fst[y0]

fld[a1]
fcos
fst[x1]

fld[a1]
fsin
fst[y1]

invoke glEnable,GL_NORMALIZE
invoke glBegin,GL_TRIANGLE_STRIP
mov j,0

@@:

fild[j]
fstp[fj]

fld[MinStep]
fmul[fj]
fst[b]

fcos
fst[c0]

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

finit

fld[b]

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

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

fld[y0]
fmul[r]
fst[tempY0]

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

fld[y1]
fmul[r]
fst[tempY1]

finit
fld[x0]
fmul[c0]
fst[tempX0c]

fld[y0]
fmul[c0]
fst[tempY0c]

finit
fld[x1]
fmul[c0]
fst[tempX1c]

fld[y1]
fmul[c0]
fst[tempY1c]

invoke glNormal3f,DWORD PTR tempX0c,DWORD PTR tempY0c,DWORD PTR zc
invoke glVertex3f,DWORD PTR tempX0,DWORD PTR tempY0,DWORD PTR z

invoke glNormal3f,DWORD PTR tempX1c,DWORD PTR tempY1c,DWORD PTR zc
invoke glVertex3f,DWORD PTR tempX1,DWORD PTR tempY1,DWORD PTR z

inc j
mov ecx,MinParts
cmp ecx,j

jge @B
inc i
mov ecx,MaxParts
cmp ecx,i
jge newcicle

invoke glEnd
invoke glEndList
invoke glDisable,GL_NORMALIZE
ret
Torus ENDP

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

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

Torus PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD

Константа dva пределена в примере как глобальная. Радиус тора задан в секции данных, первое число - внешний радиус, второе - радиус круглой части тора, радиус дырки - разность первого и второго числа:

TorusRadius dd 0.7,0.4

Чтобы получить проволочный тор, достаточно заменить в функции константу GL_TRIANGLE_STRIP на GL_LINE_STRIP.

Пример первый - сплошной тор:

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

Второй пример - проволочный тор:

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

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