Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 16:42

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Sa Sep 23, 2006 22:43 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
Tja was soll ich viel sagen. Meine Funktion soll eine Kugel im Grunde in Quads rendern. Nun stelle man sich vor, jedes dieser Quads sei durch seine Diagonalen noch einmal getrennt. Der entstehende Punkt ist die Spitze der Pyramide. Ich erstellte also statt mit 4 Vertices ein Quad (, das dann in einem Quadstrip gezeichnet wird) mit 5 Vertices 4 Triangles (, die in einem TriangleFan gezeichnet werden).

Soweit zur Theorie.

nun die Umsetzung:

Code:
  1. function PointToPointMiddle(P1, P2: TVector3f): TVector3f;
  2. var Vektor: TVector3f;
  3. begin
  4.   Vektor[0]:=(P1[0]+P2[0])/2;
  5.   Vektor[1]:=(P1[1]+P2[1])/2;
  6.   Vektor[2]:=(P1[2]+P2[2])/2;
  7.  
  8.   Result:=Vektor;
  9. end;


Code:
  1. function CreateSpherePyramide(StartVector: TVector3f; Radius, PyramidenHoehe: Single; Division: Integer):TFigur;
  2. const
  3.   TWOPI = PI*2;
  4.   PID2 = PI/2;
  5. var
  6.   i,j,AnzahlElemente: Integer;
  7.   theta1,theta2,theta3: Single;
  8.   ZwischenVector,NeuerVector:Array [0..4] of TVector3f;
  9.   Figur:TFigur;
  10. begin
  11.   if (Radius < 0)   then Radius   := -Radius;
  12.   if (Division < 0) then Division := -Division;
  13.   if (Division < 4) or (Radius <= 0) then
  14.   begin
  15.     SetLength(Figur,1);
  16.     SetLength(Figur[0].Punkte,1);
  17.     Figur[0].Punkte[0][0] := StartVector[0];
  18.     Figur[0].Punkte[0][1] := StartVector[1];
  19.     Figur[0].Punkte[0][2] := StartVector[2];
  20.  
  21.     Result:=Figur;
  22.     Finalize(Figur);
  23.     exit;
  24.   end;
  25.  
  26.   for j:=0 to Division div 2 do
  27.   begin
  28.     SetLength(Figur, Length(Figur)+2);
  29.     theta1 := j       * TWOPI / Division - PID2;
  30.     theta2 := (j + 1) * TWOPI / Division - PID2;
  31.  
  32.     i:=0;
  33.     for i:=0 to Division div 2 do
  34.     begin
  35.       theta3 := i * TWOPI / Division;
  36.  
  37.       ZwischenVector[1][0] := cos(theta2) * cos(theta3);
  38.       ZwischenVector[1][1] := sin(theta2);
  39.       ZwischenVector[1][2] := cos(theta2) * sin(theta3);
  40.       NeuerVector   [1][0] := StartVector[0] + Radius * ZwischenVector[1][0];
  41.       NeuerVector   [1][1] := StartVector[1] + Radius * ZwischenVector[1][1];
  42.       NeuerVector   [1][2] := StartVector[2] + Radius * ZwischenVector[1][2];
  43.  
  44.       ZwischenVector[2][0] := cos(theta1) * cos(theta3);
  45.       ZwischenVector[2][1] := sin(theta1);
  46.       ZwischenVector[2][2] := cos(theta1) * sin(theta3);
  47.       NeuerVector   [2][0] := StartVector[0] + Radius * ZwischenVector[2][0];
  48.       NeuerVector   [2][1] := StartVector[1] + Radius * ZwischenVector[2][1];
  49.       NeuerVector   [2][2] := StartVector[2] + Radius * ZwischenVector[2][2];
  50.  
  51.       theta3 := (i+1) * TWOPI / Division;
  52.  
  53.       ZwischenVector[3][0] := cos(theta1) * cos(theta3);
  54.       ZwischenVector[3][1] := sin(theta1);
  55.       ZwischenVector[3][2] := cos(theta1) * sin(theta3);
  56.       NeuerVector   [3][0] := StartVector[0] + Radius * ZwischenVector[3][0];
  57.       NeuerVector   [3][1] := StartVector[1] + Radius * ZwischenVector[3][1];
  58.       NeuerVector   [3][2] := StartVector[2] + Radius * ZwischenVector[3][2];
  59.  
  60.       ZwischenVector[4][0] := cos(theta2) * cos(theta3);
  61.       ZwischenVector[4][1] := sin(theta2);
  62.       ZwischenVector[4][2] := cos(theta2) * sin(theta3);
  63.       NeuerVector   [4][0] := StartVector[0] + Radius * ZwischenVector[4][0];
  64.       NeuerVector   [4][1] := StartVector[1] + Radius * ZwischenVector[4][1];
  65.       NeuerVector   [4][2] := StartVector[2] + Radius * ZwischenVector[4][2];
  66.  
  67.  
  68.       NeuerVector   [0]    := PointToPointMiddle(NeuerVector[1], NeuerVector[3]);
  69.  
  70.       with Figur[j] do
  71.       begin
  72.         AnzahlElemente := Length(Punkte);
  73.         SetLength(Punkte, AnzahlElemente+6);
  74.         SetLength(Normalen, AnzahlElemente+6);
  75.         SetLength(Textur, AnzahlElemente+6);
  76.  
  77.         /// 1
  78.  
  79.         Punkte[AnzahlElemente][0]:=NeuerVector[0][0];
  80.         Punkte[AnzahlElemente][1]:=NeuerVector[0][1];
  81.         Punkte[AnzahlElemente][2]:=NeuerVector[0][2];
  82.  
  83.         Normalen[AnzahlElemente][0]:=ZwischenVector[0][0];
  84.         Normalen[AnzahlElemente][1]:=ZwischenVector[0][1];
  85.         Normalen[AnzahlElemente][2]:=ZwischenVector[0][2];
  86.  
  87.         Textur[AnzahlElemente][0]:=i/Division;
  88.         Textur[AnzahlElemente][1]:=2*(j+1)/Division;
  89.  
  90.         /// 2
  91.  
  92.         Punkte[AnzahlElemente+1][0]:=NeuerVector[1][0];
  93.         Punkte[AnzahlElemente+1][1]:=NeuerVector[1][1];
  94.         Punkte[AnzahlElemente+1][2]:=NeuerVector[1][2];
  95.  
  96.         Normalen[AnzahlElemente+1][0]:=ZwischenVector[1][0];
  97.         Normalen[AnzahlElemente+1][1]:=ZwischenVector[1][1];
  98.         Normalen[AnzahlElemente+1][2]:=ZwischenVector[1][2];
  99.  
  100.         Textur[AnzahlElemente+1][0]:=i/Division;
  101.         Textur[AnzahlElemente+1][1]:=2*(j+1)/Division;
  102.  
  103.         /// 3
  104.  
  105.         Punkte[AnzahlElemente+2][0]:=NeuerVector[2][0];
  106.         Punkte[AnzahlElemente+2][1]:=NeuerVector[2][1];
  107.         Punkte[AnzahlElemente+2][2]:=NeuerVector[2][2];
  108.  
  109.         Normalen[AnzahlElemente+2][0]:=ZwischenVector[2][0];
  110.         Normalen[AnzahlElemente+2][1]:=ZwischenVector[2][1];
  111.         Normalen[AnzahlElemente+2][2]:=ZwischenVector[2][2];
  112.  
  113.         Textur[AnzahlElemente+2][0]:=i/Division;
  114.         Textur[AnzahlElemente+2][1]:=2*(j+1)/Division;
  115.  
  116.         /// 4
  117.  
  118.         Punkte[AnzahlElemente+3][0]:=NeuerVector[3][0];
  119.         Punkte[AnzahlElemente+3][1]:=NeuerVector[3][1];
  120.         Punkte[AnzahlElemente+3][2]:=NeuerVector[3][2];
  121.  
  122.         Normalen[AnzahlElemente+3][0]:=ZwischenVector[3][0];
  123.         Normalen[AnzahlElemente+3][1]:=ZwischenVector[3][1];
  124.         Normalen[AnzahlElemente+3][2]:=ZwischenVector[3][2];
  125.  
  126.         Textur[AnzahlElemente+3][0]:=i/Division;
  127.         Textur[AnzahlElemente+3][1]:=2*(j+1)/Division;
  128.  
  129.         /// 5
  130.  
  131.         Punkte[AnzahlElemente+4][0]:=NeuerVector[4][0];
  132.         Punkte[AnzahlElemente+4][1]:=NeuerVector[4][1];
  133.         Punkte[AnzahlElemente+4][2]:=NeuerVector[4][2];
  134.  
  135.         Normalen[AnzahlElemente+4][0]:=ZwischenVector[4][0];
  136.         Normalen[AnzahlElemente+4][1]:=ZwischenVector[4][1];
  137.         Normalen[AnzahlElemente+4][2]:=ZwischenVector[4][2];
  138.  
  139.         Textur[AnzahlElemente+4][0]:=i/Division;
  140.         Textur[AnzahlElemente+4][1]:=2*(j+1)/Division;
  141.       end;
  142.     end;
  143.   end;
  144.   Result:=Figur;
  145.   Finalize(Figur);
  146. end;


Vielleicht kann man da was kürzen, aber erst musses funken, dann gehts ans Feintuning. Aber @ mom funkt es noch nicht. Erstellen soll die Prozedur am ende folgendes:
Ein zweidimensionales Array.
Erste Dimension: repräsentiert eine Kugelschicht.
Zweite Dimension: repäsentiert die Elemente der Kugelschicht. Diese Elemente sind immer in 5er Blöcken eingereiht.

Das 1. Element der Blöcke ist die Spitze der Pyramide, dann gegen den Uhrzeigersinn (zumindest von der draufsicht her) die umliegenden 4 Eckpunkte.

Tja nur leider funkt das so ziemlich gar nicht ^^ die Kugelform ist erkennbar, ein paar spitzen auch, aber mehr nicht. Viele Linien verlaufen im 0Punkt,...

Vielleicht findet ihr den Fehler... ich bin betriebsblind

Danke schonma


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 25, 2006 21:22 
Offline
DGL Member

Registriert: So Aug 20, 2006 23:19
Beiträge: 564
No idea?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 25, 2006 21:38 
Offline
DGL Member

Registriert: Sa Okt 22, 2005 20:24
Beiträge: 291
Wohnort: Frauenfeld/CH
hmm ich würd solches zeug halt eher mit 3ds max machen und dann importieren, geht definitv leichter ;)

aber ne idee hab ich nicht sry...

_________________
bester uo-shard: www.uosigena.de


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 25, 2006 22:22 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Erinnert mich an so ein Blender Tutorial ( http://blender.org/cms/Advanced_Tools.418.0.html )

MfG
Flo

_________________
Danke an alle, die mir (und anderen) geholfen haben.
So weit... ...so gut


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 4 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]