Kugel: Unterschied zwischen den Versionen
Aus DGL Wiki
(Eine erste Variante) |
Flash (Diskussion | Beiträge) K |
||
| Zeile 1: | Zeile 1: | ||
| − | Port von [http://astronomy.swin.edu.au/~pbourke/opengl/sphere/] | + | ==Variante 1== |
| + | Der nachfolgende Code ist ein Port von [http://astronomy.swin.edu.au/~pbourke/opengl/sphere/ http://astronomy.swin.edu.au/~pbourke/opengl/sphere/]. | ||
| + | |||
| + | Neben den Vertexpositionen werden die Normalen und Texturkoordinaten berechnet. | ||
<pascal>procedure CreateSphere(c: TVector3f; r: Single; n: Integer); | <pascal>procedure CreateSphere(c: TVector3f; r: Single; n: Integer); | ||
| Zeile 55: | Zeile 58: | ||
end; | end; | ||
end;</pascal> | end;</pascal> | ||
| + | |||
| + | |||
| + | [[Kategorie:Technik_oder_Algorithmus]] [[Kategorie:Anleitung]] | ||
Version vom 18. Februar 2006, 18:46 Uhr
Variante 1
Der nachfolgende Code ist ein Port von http://astronomy.swin.edu.au/~pbourke/opengl/sphere/.
Neben den Vertexpositionen werden die Normalen und Texturkoordinaten berechnet.
procedure CreateSphere(c: TVector3f; r: Single; n: Integer);
const
TWOPI = PI*2;
PID2 = PI/2;
var
i,j: Integer;
theta1,theta2,theta3: Single;
e,p:TVector3f;
begin
if (r < 0) then r := -r;
if (n < 0) then n := -n;
if (n < 4) or (r <= 0) then
begin
glBegin(GL_POINTS);
glVertex3f(c[0],c[1],c[2]);
glEnd;
exit;
end;
for j:=0 to n div 2 do
begin
theta1 := j * TWOPI / n - PID2;
theta2 := (j + 1) * TWOPI / n - PID2;
glBegin(GL_QUAD_STRIP);
for i:=0 to n do
begin
theta3 := i * TWOPI / n;
e[0] := cos(theta2) * cos(theta3);
e[1] := sin(theta2);
e[2] := cos(theta2) * sin(theta3);
p[0] := c[0] + r * e[0];
p[1] := c[1] + r * e[1];
p[2] := c[2] + r * e[2];
glNormal3f(e[0],e[1],e[2]);
glTexCoord2f(i/n,2*(j+1)/n);
glVertex3f(p[0],p[1],p[2]);
e[0] := cos(theta1) * cos(theta3);
e[1] := sin(theta1);
e[2] := cos(theta1) * sin(theta3);
p[0] := c[0] + r * e[0];
p[1] := c[1] + r * e[1];
p[2] := c[2] + r * e[2];
glNormal3f(e[0],e[1],e[2]);
glTexCoord2f(i/n,2*j/n);
glVertex3f(p[0],p[1],p[2]);
end;
glEnd;
end;
end;