Тор
Тор (бублик, если по-простому) представляет собой поверхность четвертого порядка. Параметрические уравнения тора есть в учебниках, приведенная ниже функция построения тора использует именно их. Нормали построены к касательным плоскостям. Код функции (для наглядности не оптимизирован):
; #########################################################################
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.
Пример первый - сплошной тор:
Второй пример - проволочный тор: