Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Kugel aus Zylinderschichten konstruieren [OpenGL] (https://www.delphipraxis.net/18055-kugel-aus-zylinderschichten-konstruieren-%5Bopengl%5D.html)

Robertlu 13. Mär 2004 15:13


Kugel aus Zylinderschichten konstruieren [OpenGL]
 
Guten Tag

ich hab mal wieder ne Frage:
und zwar will ich eine Kugel mit OpenGL erzeugen. dazu habe ich mir einen Zylinder mit 2 variablen Radien für oben und untenm programmiert und das in 'ne while-Schleife gepackt, um daraus 'ne Kugel zu bauen. das Problem ist allerdings, das ich nicht weiß, wie ich die radien und die Dicke der Schichten konfigurieren muss, damit daraus'ne Kugel wird.

Gruß Rob

mandumoal 13. Mär 2004 16:16

Re: Kugel aus Zylinderschichten konstruieren [OpenGL]
 
Hallo!

Erstmal, machst du das mit 'reinem' OpenGl oder mit irgendeiner Komponente?

Die Dicke der Schichten musst du selber entscheiden bzw von der Größe abhängig machen, da sie ja nur die Unterteilungen beeinflussen, sprich wie rund deine Kugel dann aussieht.

Wenn ich dich richtig verstanden habe dann möchtest du die Entfernung der (am Beispiel Erde) Breitenkreise von der Gerade durch die Pole wissen, oder?
Wenn das so ist und du die 'Unterteilungsdicke weißt', dann kannst du das mit relativ simpler Trigonometrie ausrechnen. ( 90° Winkel ist immer einer da, eine Gerade ist die Höhe über Mittelpunkt und eine der Radius, die Dritte dann der Radius deines Zylinders)
Ich hoffe, dass ich keinen allzugroßen Quatsch geschrieben habe.

mfg mandumoal

dizzy 13. Mär 2004 16:23

Re: Kugel aus Zylinderschichten konstruieren [OpenGL]
 
Das ergibt dann eine Kugel mit einem Poly-Muster wie die Längen-Breiten-Gerade der Erde. Es ist IMHO schöner eine Kugel aus regelmäßigen Dreiecken zu bauen. Dazu gibt es bestimmt auch irgendwo eine Formel oder einen Algo... :gruebel:

Mr_T 14. Mär 2004 16:41

Re: Kugel aus Zylinderschichten konstruieren [OpenGL]
 
Also wie man es mit unterschiedlich dicken Zylindern macht kann ich dir leider auch nicht sagen ... :-(
Ich persönlich verwende für Kugel immer eine kleine Prozedur, welche ich mal im Delphigl-Forum entdeckt habe:


Delphi-Quellcode:
procedure DrawSphere(CX, CY, CZ, Radius : GLFloat; N : Integer);
var
i,j                          : Integer;
theta1,theta2,theta3 : GLFloat;
X, Y, Z, px, py, pz   : GLFloat;
begin
if Radius < 0 then
Radius :=-Radius;
if n < 0 then
n := -n;
if (n < 4) or (Radius <= 0) then
begin
glBegin(GL_POINTS);
  glVertex3f(CX, CY, CZ);
glEnd;
exit;
end;
for j := 0 to n div 2 -1 do
begin
theta1 := J*2*PI/N - PI/2;
theta2 := (J+1)*2*PI/n - PI/2;
glBegin(GL_TRIANGLE_STRIP);
for i := 0 to n do
  begin
  theta3 := i*2*PI/N;
  x := cos(theta2) * cos(theta3);
  y := sin(theta2);
  z := cos(theta2) * sin(theta3);
  px := CX + Radius*x;
  py := CY + Radius*y;
  pz := CZ + Radius*z;
  glNormal3f(X,Y,Z);
  glTexCoord2f(1-I/n, 2*(J+1)/n);
  glVertex3f(px,py,pz);
  X := cos(theta1) * cos(theta3);
  Y := sin(theta1);
  Z := cos(theta1) * sin(theta3);
  px := CX + Radius*X;
  py := CY + Radius*Y;
  pz := CZ + Radius*Z;
  glNormal3f(X,Y,Z);
  glTexCoord2f(1-i/n, 2*j/n);
  glVertex3f(px,py,pz);
  end;
glEnd;
end;

end;
cx, cy und cz sind dabei der Mittelpunkt, der Radius sollte klar sein und "n" gibt an, wie genau das Gebilde einer Kugel angenähert wird (je größer "n", umso besser sieht die Kugel aus, aber umso rechenaufwendiger wird das ganze auch).

Hoffe das hilft dir weiter :hi:

Seniman 14. Mär 2004 19:43

Re: Kugel aus Zylinderschichten konstruieren [OpenGL]
 
Hallo,

wenn du eine Kugel aus mehreren Zylindern zusammensetzten willst:
Ich würde ersteinmal empfehlen eine gerade Anzahl von Zylindern zu nehmen. In der Mitte haben die dann die Dicke, wie die Kugel den Durchmesser hat.
Stell dir nun die Kugel so gedreht vor, dass die Kegel jeweils senkrecht stehen, dass also die Berührflächen der Einzelnen Zylinder Parallel zu einer Tischfläche vor dir wären.
Geh davon aus, dass der Mittelpunkt der Kugel im Koordinatenursprung liegt (0,0,0).
Betrachte nun irgendeinen Punkt, auf der Kugel, sagen wir (x,y,z), dann gilt x^2+y^2+z^2=r^2, wobei r der Radius der Kugel ist. Das folgt aus dem Satz von Pythagoras.
Die Radien der einzelnen Zylinder kannst du nun so ausrechnen: setzte z=0 und y auf den gewünschten Wert. Dann setz das in die Gleichung oben ein, dann erhältst du x und das ist gleichzeitig der Radius des Zylinders an der Stelle.

Grüße
Seniman


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:37 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz