| |
|
|
Sven Bader | Aus einem dieser uralten Beispiele von opengl.org habe ich etwas nach Profan übersetzt und ihm zusätzlich noch Texturkoordinaten verpasst - da gäbe es bei so einem komplexen Objekt sicher mehrere Ansätze.
Herunterladen
Im Gegensatz zu den internen OpenGL Objekten, sollte der Torus in jedem Fall vorher mir StartList/Endlist gespeichert und mit DrawList abgerufen werden.
Ähnlich wie bei der Kugel (Sphere) lassen sich die Segmente in zwei Dimensionen wählen, zusätzlich kann der Innen- und Außenradius angegeben werden.
Zum besseren Verständnis, eine korrekte Textur muss in etwa so aufgebaut sein
Hier nur die Funktion selbst:
Proc Torus
Parameters majorRadius!, minorRadius!, numMajor%, numMinor%
Declare majorStep!, minorStep!
Declare a0!,a1!,x0!,y0!,x1!,y1!,b!,c!,r!,z!,loop2&
majorStep! = 2.0*Pi() / numMajor%
minorStep! = 2.0*Pi() / numMinor%
WhileLoop 0, numMajor% - 1
a0! = &loop * majorStep!
a1! = a0! + majorStep!
x0! = cos(a0!)
y0! = sin(a0!)
x1! = cos(a1!)
y1! = sin(a1!)
loop2& = &loop
oGL("glBegin", ~GL_TRIANGLE_STRIP)
WhileLoop 0, numMinor%
b! = &loop * minorStep!
c! = cos(b!)
r! = minorRadius! * c! + majorRadius!
z! = minorRadius! * sin(b!)
oGL("glNormal3f", x0!*c!, y0!*c!, z!/minorRadius!)
oGL("glTexCoord2f", loop2& / numMajor%, &loop / numMinor%)
oGL("glVertex3f", x0!*r!, y0!*r!, z!)
oGL("glNormal3f", x1!*c!, y1!*c!, z!/minorRadius!)
oGL("glTexCoord2f", (loop2& + 1) / numMajor%, &loop / numMinor%)
oGL("glVertex3f", x1!*r!, y1!*r!, z!)
EndWhile
oGL("glEnd")
EndWhile
Endproc
|
|
|
| |
|
|