Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge

OpenGL-Programmierung

bitchen / 4 Antworten / Baumansicht Nickles

Hallo,
wie zum Geier programmiert man im Windows OpenGl eine Kugel?
Ich sitze jetzt schon stundenlang an der Kiste, und alles was ich bekomme ist ein verdammter Kreis, obwohl ich schon in der dritten Dimension arbeite. Ich hatte es mir so gedacht, dass ich einen Kreis mache, und den dann um die x-Achse rotieren lasse. Aber das will und will einfach nicht. Ich bin ratlos. Bitte helft mir

bei Antwort benachrichtigen
thomas woelfer bitchen „OpenGL-Programmierung“
Optionen

gluSphere() ist vermutlich die funktion die du suchst.

WM_HOPETHISHELPS
thomas woelfer

this posting contains no tpyos.
bei Antwort benachrichtigen
bitchen Nachtrag zu: „OpenGL-Programmierung“
Optionen

Hi,
danke für die Antwort, ich habs ausprobiert und es funktioniert. Ich dachte aber eigentlich an die manuelle Programmierung von so ner Kugel, so mit sinus und cosinus-Angaben, also direkt mit
Schleifen und glVertexen. Kannst mir da weiterhelfen?
Gruß
Peda

bei Antwort benachrichtigen
Dreamforger bitchen „Hi, danke für die Antwort, ich habs ausprobiert und es funktioniert. Ich dachte...“
Optionen

Interessante Aufgabe.
Ich entwickel hier mal ein bischen: Also ersta mal würde ich die Kugel waagrecht in Scheiben schneiden. Dadurch ergeben sich mal im allgemeinen Bänder und zwei Kappen. Ich arbeite mehr mit DX und da gibt es Rendermethoden mit denen man Streifen einfach zeichnen kann.
Basierend auf einem Konstrukteurs-CS (x,y in der Ebene, z ist Höhe)
solltest du die Scheiben ungleich dick manchen. Betrachtest du die Kugel in XZ so wird der rechte Rand von [ cos(a), sin(a), 0 ] Vektoren beschrieben mit a = -pi/2..+pi/2.
Unterteil jetzt gleichmäßig a in n Teile( je mehr desto Runder ). Diese Punkte auf den Winkeln a(i)= -pi/2 + pi/n*i liegen damit auf den Schnittlienien.
Diese Punkte rotierst du jetzt um Z im Winkel b = 0..2pi. b Unterteilst du in doppelt so viele Teile wie a, da b auch einen doppelt so großen Winkelbereich überstreicht. b(i) = pi/n*i
Zusätzlich wird von unten jeder Ring noch um pi/(2*n) weitergedreht, um die Ringe gegeneinander zu versetzen. Also der erste Ring um pi/(2*n) der nächste um 2*pi/(2*n) der dritte um 3*pi/(2*n)
Auf diesem Punktewust fängst du an deine Bänder zu stricken:
Ungerade Dreiecke werden von zwei Punkten des Unteren bandes und 1 Punkt des oberen Band definiert.
Wenn das untere Band A heist und das obere B so werden die Ungeraden dreicke definiert durch [A(i),B(i),A(i+1)]
Gerade Dreiecke werden von zwei Punkten des Oberen und einem des unteren Bandes definiert.
Wieder mit A und B wie gerade eben: [B(i), B(i+1), A(i+1)]
Diese Dreiecke haben auch schon den gleichen Drehsinn für Backface-culling. Wenn du nur die Innenseite deiner Kugel siehst, dreh die Drehmatrix für die Z-rotationen um. Natürlich machst du nur (2*n)-1 Dreieckspaare wegen den +1.

Die Normalen an jedem Punkt sind die Vektoren vom Mittelpunkt durch jeden Punkt für Phong und Gouraud shading. Für Flatshading solltest du die Linie vom Mittelpunkt durch die Mitte jedes Dreiecks wählen.

Frag ruhig weiter falls noch was klar ist ;-)
Ich hab zwar nur selten Zeit, dann aber meist lang

bei Antwort benachrichtigen
thomas woelfer bitchen „OpenGL-Programmierung“
Optionen

naja, du brauchst die passende formel zum berechnen von punkten auf der oberflaeche der kugel, die findet du in jedem mathebuch. damit legst du ein dreiecks oder ein vierecksgitter ueber diese oberflaeche. damit kannst du dann die in flaechen zerteilte kugel anhand der flaechen schonmal ausgeben. wenns danach 'flach' aussieht, dann liegt das meist daran, das die richtungsverktoren fuer die einzelnen flaechen in die falsche richtung zeigen, daher ist es empfehlenswert diese beim testen auf jeden fall mit auszugeben.

WM_HOPETHISHELPS
thomas woelfer

this posting contains no tpyos.
bei Antwort benachrichtigen