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

Aktuelle Zeit: Fr Jul 18, 2025 16:46

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



Ein neues Thema erstellen Auf das Thema antworten  [ 15 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Kugeln performant nutzen
BeitragVerfasst: Fr Mai 26, 2006 18:17 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Hi, hier im Forum habe ich einen code gefunden, der mit Hilfe von Position, radius und
anzahl der seitenflächen eine Kugel annähert und zeichnet, jedoch wird diese berechnung
bei jedem Zeichnen durchgeführt. Ich habe versucht das ganze irgendwie in ein array
zu speichern und dann zu zeichnen, das hat aber nicht so wirklich funktioniert.

ich denke kugeln werden schon viele leute benötigt haben, also hoffe ich mal auf umsetzungsvorschläge


danke schonmal ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mai 26, 2006 19:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Eine Lösung wäre eine Displayliste

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 27, 2006 00:20 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2068
Programmiersprache: C++
Für das Array: glInterleavedArrays und glDrawArrays
Du erstellst dein Array im entsprechenden Format, ein Beispiel mit GL_V3F:
Code:
  1. type
  2.   tV3F = Record
  3.     x, y, z: Single;
  4.   end;
  5.  
  6. var
  7.   myArray: Array of tV3F;


ein einfaches Quadrat:
Code:
  1. glBegin(GL_QUADS);
  2.   glVertex3f(-1,-1,0);
  3.   glVertex3f( 1,-1,0);
  4.   glVertex3f( 1, 1,0);
  5.   glVertex3f(-1, 1,0);
  6. glEnd();


wird dann zu:
Code:
  1. SetLength(myArray, 4);
  2. myArray[0].x := -1;
  3. myArray[0].y := -1;
  4. myArray[0].z :=  0;
  5. myArray[1].x :=  1;
  6. myArray[1].y := -1;
  7. myArray[1].z :=  0;
  8. myArray[2].x :=  1;
  9. myArray[2].y :=  1;
  10. myArray[2].z :=  0;
  11. myArray[3].x := -1;
  12. myArray[3].y :=  1;
  13. myArray[3].z :=  0;


und wird dann so gezeichnet:
Code:
  1. glInterleavedArrays(GL_V3F, Sizeof(TV3F), @myArray[0]);
  2. glDrawArrays(glQuads, 0, 4);


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 27, 2006 09:17 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
ach opengl hat da schon ein befehl für ^^
aber texturen sind da ja auch noch drin, wie gestaltet es sich damit ?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 27, 2006 10:38 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jul 16, 2003 15:20
Beiträge: 198
Solange du die Textur nicht wechselst kannst dus trotzdem in einer Displayliste machen (ganz normal gltexcoord2f usw.)
bei glInterleavedArray musst du dann eben nicht GL_V3F nehmen sondern ein Format wp die Texturkoordinaten mit drin sind.

_________________
Bevor du definierst, was etwas ist, versichere dich seiner Existenz.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 27, 2006 10:45 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
schnall ich net so wirklich, gibts net irgendwo ein sample ^^

der code den ich gefunden hab ist hier:
Code:
  1.  
  2. procedure DrawSphere(CX, CY, CZ, Radius: TGLFloat; N: Integer);
  3. var
  4.   i, j: Integer;
  5.   theta1, theta2, theta3,
  6.   X, Y, Z,
  7.   px, py, pz: TGLFloat;
  8. begin
  9.   if Radius < 0 then
  10.     Radius := - Radius;
  11.   if n < 0 then
  12.     n := - n;
  13.   if (n < 4) or (Radius <= 0) then
  14.   begin
  15.     glBegin(GL_POINTS);
  16.       glVertex3f(CX, CY, CZ);
  17.     glEnd;
  18.     exit;
  19.   end;
  20.   for j := 0 to n div 2 -1 do
  21.   begin
  22.     theta1 := J * 2 * PI / N - PI / 2;
  23.     theta2 := (J+1)*2*PI/n - PI/2;
  24.     glBegin(GL_TRIANGLE_STRIP);
  25.       for i := 0 to n do
  26.       begin
  27.         theta3 := i*2*PI/N;
  28.         x := cos(theta2) * cos(theta3);
  29.         y := sin(theta2);
  30.         z := cos(theta2) * sin(theta3);
  31.         px := CX + Radius*x;
  32.         py := CY + Radius*y;
  33.         pz := CZ + Radius*z;
  34.         glNormal3f(X,Y,Z);
  35.         glTexCoord2f(1-I/n, 2*(J+1)/n);
  36.         glVertex3f(px,py,pz);
  37.         X := cos(theta1) * cos(theta3);
  38.         Y := sin(theta1);
  39.         Z := cos(theta1) * sin(theta3);
  40.         px := CX + Radius*X;
  41.         py := CY + Radius*Y;
  42.         pz := CZ + Radius*Z;
  43.         glNormal3f(X,Y,Z);
  44.         glTexCoord2f(1-i/n, 2*j/n);
  45.         glVertex3f(px,py,pz);
  46.       end;
  47.     glEnd;
  48.   end;
  49. end;
  50.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 27, 2006 13:48 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 19, 2003 10:44
Beiträge: 991
Wohnort: Karlsfeld (nahe München)
Lese dir bitte mal folgenden Wiki Artikel durch:
Displayliste

Schau ob du es hinbekommst , und falls nicht sag uns was besser erklaert werden muesste. :wink:

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 27, 2006 14:03 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
das hab ich auch schon durchgelesen, aber ich habe keine ahnung wie ich damit arbeite, besondern explizit in diesem beispiel nicht


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 27, 2006 14:26 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
http://wiki.delphigl.com/index.php/Tutorial_lektion5#F.C3.BCr_das_Protokoll

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 27, 2006 14:28 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
danke ;) momentan läufts noch recht schnell mit 16 seitenflächen, aber wenn ich mal was mit vielen bällen machen will, ist das sicherlich sinnvoll ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 27, 2006 14:33 
Offline
Fels i.d. Brandung
Benutzeravatar

Registriert: Sa Mai 04, 2002 19:48
Beiträge: 3830
Wohnort: Tespe (nahe Hamburg)
Als ich anfing mit 3D habe ich kopfschüttelnd davor gestanden, dass bei Unreal eine Figur bis zu 500 Polygone haben sollte. Schiere Verschwendung. Als ich gerade eine GeForce 3 hatte, haben Lithander und ich bei einem Treffen ein statisches Objekt erzeugt, dass IMAO knapp 100.000 Polygone über den Jordan schoss. Von daher mache Dir nicht so viele Gedanken um Performance. Displayliste oder auch VBO können enorm helfen Dinge zu beschleunigen. Oftmals sind Sichtprüfungen (also nur das rendern, was wirklich sichtbar ist) weitaus effektiver um etwas zu beschleunigen.

_________________
"Light travels faster than sound. This is why some people appear bright, before you can hear them speak..."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Mai 27, 2006 16:11 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Obwohl man mittlerweile diese Prüfungen auch besser etwas großzügiger ausfallen lassen kann. 1000 Dreiecke mehr oder weniger machen kaum was aus. Im eigenen Programm selber die Kugeln zu zeichnen ist auch recht aufwändig. Dann lieber die Kugel in einem externen Programm modellieren und direkt in einem renderfertigen binärem Format abspeichern. Dann kann man die Daten gleich aus dem Stream in den VertexBuffer kopieren und mit einem Aufruf zeichnen. So hat man viel weniger Komplexität in seinem Programm und ist trotzdem flexibel.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 29, 2006 09:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Da gerade diese Prozedur für die Kugel angegeben wird:
Ich habe dazu auch noch eine kleine Frage.
Wie muss ich den Code ändern, damit ich nur die obere Halbkugel habe. Das brauche ich für meinen Skydome.
Momentan benutze ich noch eine Skysphere, aber den unteren Teil der Sphere ist halt nicht nötig.
Man spart ja wo man kann :wink:

_________________
http://texelviews.delphigl.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mai 29, 2006 19:05 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Hi,

MatReno hat geschrieben:
Da gerade diese Prozedur für die Kugel angegeben wird:
Ich habe dazu auch noch eine kleine Frage.
Wie muss ich den Code ändern, damit ich nur die obere Halbkugel habe. Das brauche ich für meinen Skydome.
Momentan benutze ich noch eine Skysphere, aber den unteren Teil der Sphere ist halt nicht nötig.
Man spart ja wo man kann :wink:


einfach eine der beiden for-schleifen nur bis zur hälfte laufen lassen :P

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Mai 31, 2006 07:12 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Jan 31, 2005 11:02
Beiträge: 432
Wohnort: Rheinlandpfalz
Danke.
Ich musste nur noch die Texturkoordinaten anpassen und es ging. :D

_________________
http://texelviews.delphigl.com


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 15 Queries | GZIP : On ]