PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 3D Editor


Einfachkrank
2002-10-21, 20:22:04
Hi,

ich versuche mir gerade einen ziemlich primitiven 3D Editor zu programmieren, aber es hängt an ein ein paar kleinen Windows und OpenGL Kenntnissen. Bis jetzt habe ich mir ein Fenster erstellt dass auch schon einzelne Knöpfe hat(die auch funktionieren), und ich habe einen Viewport in dem Fenster gesetzt, der aber, wenn ich ihn initialisiere, sich nicht an die gegebenen Koordinaten hält, sondern über das ganze Fenster ausbreitet? ???
Jetzt würde ich gerne noch so eine Leiste(Toolbar) einfügen und diese mit Menüpunkten belegen. ???
Und wie kann ich mehrere Fenster in denen man Blick auf das Objekt hat erstellen. Muss ich den einen Viewport immer wieder versetzen oder kann ich mehrere setzen? ???

Wenn jemand zu den drei Probs vielleicht ne gute Lösung oder auch nen Tutorial hat, wäre ich ihm sehr verbunden :D

MFG Einfachkrank

Einfachkrank
2002-10-23, 15:41:46
Hat keiner nen Plan von so was ???

Xmas
2002-10-23, 16:01:01
Zu den mehreren Ansichten: Du kannst entweder mehrere OpenGL RenderContexts anlegen (recht langsam, möglicherweise auf einigen Karten/Treibern nicht möglich -> Software-Rendering, Texturen/DisplayLists kann man AFAIK nicht sharen) oder aber einen großen RC nehmen und jeweils mit glViewport den Viewport verschieben. Den Rand kannst du dann selber malen. Beim initialisieren belegt der Viewport übrigens immer das ganze Fenster.

Und wie man ne Toolbar einfügt... kommt drauf an welches Compilerpaket du verwendest. Man kann zwar auch alle Controls von Hand zu Fuß mit der WinAPI generieren, aber das ist mühsam.

Einfachkrank
2002-10-23, 18:54:07
Hi,

du meintest, dass der Viewport am Anfang immer das ganze Fenster einnimmt? Muss ich dann quasi den Viewport 2x setzen oder wie schraube ich ihn wieder auf meine Wunschgröße zurück?

MFG Einfachkrank

Xmas
2002-10-23, 21:18:44
Wann genau rufst du glViewport auf?

Einfachkrank
2002-10-24, 13:26:12
Hi,

also zum testen hab ich ein kleine Funktion geschrieben, die ausgeführt wird nach dem man einen Knopf drückt ->void InitGL(void)
{
hdc = GetDC(hwnd);
SetupPixelFormat(hdc);

hrc = wglCreateContext(hdc);
wglMakeCurrent(hdc, hrc);

glViewport(110, 50, 640, 480);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluPerspective(54.0f,(GLfloat)SCREEN_WIDTH/(GLfloat)SCREEN_HEIGHT,0.0f,1000.0f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
} // InitGL

MFG Einfachkrank

zeckensack
2002-10-24, 14:08:03
Wenn man einen Knopf drückt???
Dazu fällt mir jetzt nichts ein :stareup:

Aber mal ein paar Sachen hierzu:
glViewport(110, 50, 640, 480);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

gluPerspective(54.0f,(GLfloat)SCREEN_WIDTH/(GLfloat)SCREEN_HEIGHT,0.0f,1000.0f);
1.1)Der Viewport sollte idR schon von der aktuellen Fenstergröße abhängig sein. Kriegt man unter Windows mit GetClientRect. Hardcoded ist eigentlich fast immer falsch, es sei denn der Benutzer kann die Fenstergröße nicht ändern - dann solltest du dir aber genau überlegen ob das wirklich eine sinnvolle Einschränkung ist.

1.2)Wenn das den Viewport für ein 640x480er Fenster einstellen soll, dann ist's schonmal falsch. Die Koordinaten zählen ab Ursprung der 'Client area', nicht in absoluten Bildschirmkoordinaten. Für ein Fenster mit einer Client area von 640x480 Pixeln wäre daherglViewport(0,0,640,480);richtig :)
Bei variabler Größe ... siehe oben.

2.1)Die Berechnung der 'aspect ratio' ist IMO falsch, bzw funzt nur dann richtig, wenn der aktuelle Viewport das gleiche Seitenverhältnis hat wie die physikalische Fensterfläche.
ARscreen ist eine Konstante die vom Monitor abhängt (könnte ja auch 16:9 sein, oder 5:4 bei vielen TFTs!).
ARres ergibt sich auf der Desktopauflösung (es gibt reichlich Leute die auf einem 4:3 CRT 1280x1024 fahren ...)
ARpixel ist nun das Seitenverhältnis eines Pixels. Das ergibt sich aus ARscreen/ARres. Ergibt dies 1.0, dann sind die Pixel quadratisch, dies sollte eine saubere App jedoch trotzdem ausrechnen!
ARviewport schließlich zählt das Seitenverhältnis des gesetzten Viewports in Pixeln. Bei 640x480 ist das 1,333... (4:3 halt).
-> Nachdem wir das alles ausgerechnet haben, ergibt sich die an gluPerspective zu übergebende aspect ratio als ARviewport*ARpixel.

Ist ein Haufen Arbyte, aber es stellt sicher daß das Programm mit allen denkbaren Kombinationen Monitor/Destopauflösung/Viewportgröße sauber klarkommt. Bei Fullscreenanwendungen entfällt das meiste davon, da reicht's dann wenn man das Seitenverhältnis des Monitors kennt (4:3? 5:4? 16:9?). Wenn du aber eine gefensterte App hast, dann ist die oben geschilderte Vorgehensweise unbedingt zu empfehlen :)

Dann sollte man sich selbstredend darum kümmern, niemals eine Division durch null auszuführen. Also statt
float aspect=x/y;
lieber sowas nehmen
float aspect;
if (y!=0.0f) aspect=x/y;
else aspect=x;

Und schließlich und endlich, wenn du glBitmap und/oder glDrawPixels und/oder 'dicke' Linien und Punkte zeichnest, dann schau dir mal Punkt zehn hiervon an:
http://www.opengl.org/developers/code/features/KilgardTechniques/oglpitfall/oglpitfall.html

Einfachkrank
2002-10-24, 15:41:53
Die blöde Idee mit dem Knopf drücken kommt daher, dass ich noch am üben mit Windows Programmierung bin, das wird sich sofort ändern so bald alles funktioniert :D
Ja, das mit den Maßen ist auch blöder Zufall, weil ich am Schluss einfach wild durcheinander gebrachte Koordinaten eingab, auch zu Testzwecken. Aber das Seitenverhältnis ist schon mal falsch, da muss ich zustimmen, ich werds gleich mal probieren :eyes:

Danke Einfachkrank :D

Einfachkrank
2002-10-25, 19:05:48
Hi,

also ich habe jetzt die Seitenverhältnisse und die Viewport Koordinaten mal korrigiert, aber es bleibt immer noch maximiert :(. Ich hab jetzt erst was von nem glScissor() Befehl(oder so) was gehört, mit dem man nur einen Bildauschnitt rendern kann ??? Weiß da jemand genaueres?

MFG Einfachkrank

MeLLe
2002-10-25, 19:13:18
Hmm Scissoring ist imho gut auf http://nehe.gamedev.net beschrieben. Zumindest fand ich das sehr einfach und vor allem verständlich erklärt. Ob das allerdings die beste Lösung für Dein "multi-View"-Problem ist, wage ich mal zu bezweifeln.

zeckensack
2002-10-25, 19:17:43
glScissor(x,y,width,height);
glEnable(GL_SCISSOR_TEST);

In der Spec steht was davon, daß sich die Koordinaten auf das 'gl window' beziehen, was eigentlich ungleich Viewport ist. Könnte ein Formulierungsfehler sein. Mußt du mal ausprobieren.

PS: Und wieder beachten, daß unter OGL alle Koordinaten von unten links anfangen.

Einfachkrank
2002-11-01, 10:13:56
Hi,

@all
habt ihr schon mal nen Editor in OGL mit drei Fenstern programmiert? Bei mir klappt das nie :(
Kann mir vielleicht mal jemand ein bisschen Quellcode posten? :eyes:

MFG Einfachkrank

MeLLe
2002-11-01, 12:44:51
Was genau willst Du denn editieren mit dem Editor?
3D-Modelle? Oder Textverarbeitung in 3D? Das wäre schon wichtig zu wissen ;)

Einfachkrank
2002-11-01, 16:20:50
Was genau willst Du denn editieren mit dem Editor?
3D-Modelle? Oder Textverarbeitung in 3D? Das wäre schon wichtig zu wissen ;)
Sorry, also ich dachte da an primitive 3D Modelle und Objekte, die ich dann in einem eigenen Format speichern will. Mein Problem ist hauptsächlich, drei Fenster mit unterschiedlicher Kameraperspektive, wie man es aus herkömmlichen Editoren kennt(z.B. Milkshape).

zeckensack
2002-11-01, 17:00:31
Das größte Problem bei solchen Sachen ist, daß SwapBuffers immer das komplette Fenster umklappt. Es ist also fast unmöglich*, bei double buffering nur einen Teil des Fensters zu verändern.

Man sollte also immer alle Viewports neu zeichnen, auch wenn nur einer verändert wurde.

Folgendermaßen zB

glViewPort(x,y,w,h); //komplettes Fenster
glDisable(GL_SCISSOR_TEST);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

glEnable(GL_SCISSOR_TEST);

//viewport eins
glViewPort(x1,y1,w1,h1);
glScissor(x1,y1,w1,h1);

//Perspektivprojektion setzen
<...>
//viewport eins zeichnen
<...>

//viewport zwo
glViewPort(x2,y2,w2,h2);
glScissor(x2,y2,w2,h2);

//Perspektivprojektion setzen
<...>
//viewport zwei zeichnen
<...>

//usw usf
<...>



SwapBuffers(...);

*mögliche Hilfsmittel sind KTX_buffer_region und die neuere Variante ARB_buffer_region, aber es geht auch ohne. Diese Extensions sind zudem nur auf den wenigsten Rechnern verfügbar, und lohnen sich IMO erst bei totaler Geometrielimitierung (so ein paar Mio Dreiecke pro Viewport)

Einfachkrank
2003-03-13, 15:44:41
Hi,

ich hab mal den alten Thread rausgekramt... :)

Das mit GL_SCISSOR_TEST hab ich, nach dem Codebeispiel probiert, aber es funktioniert immer noch net und jetzt ist mir noch ne andere Idee dazu gekommen:
Ist es schwer, mehrere kleine Childfenster zu erzeugen, in denen zwei oder drei verschiedene Viewports erstellen(also in jedem einen)?

Dazu nebenbei: Ich suche en gutes Buch über Windows Sockets, fürs Netzwerk(kann auch en Tut sein) und ein kleines Taschenbuch für "allegemeine Windows Programmierung" - (son Buch, das zeigt, wie man leicht Datei Atribute ändert, Verzeichnisse anlegt + festlegen kann, Dateien löscht, wie man Dateien suchen kann etc. )

Für alle Tips bin ich dankbar :)

MFG Einfachkrank

Einfachkrank
2003-03-15, 18:12:44
Originally posted by Einfachkrank
Hi,

ich hab mal den alten Thread rausgekramt... :)

Das mit GL_SCISSOR_TEST hab ich, nach dem Codebeispiel probiert, aber es funktioniert immer noch net und jetzt ist mir noch ne andere Idee dazu gekommen:
Ist es schwer, mehrere kleine Childfenster zu erzeugen, in denen zwei oder drei verschiedene Viewports erstellen(also in jedem einen)?

Dazu nebenbei: Ich suche en gutes Buch über Windows Sockets, fürs Netzwerk(kann auch en Tut sein) und ein kleines Taschenbuch für "allegemeine Windows Programmierung" - (son Buch, das zeigt, wie man leicht Datei Atribute ändert, Verzeichnisse anlegt + festlegen kann, Dateien löscht, wie man Dateien suchen kann etc. )

Für alle Tips bin ich dankbar :)

MFG Einfachkrank
Hat denn niemand ne Idee?

Demirug
2003-03-15, 18:34:51
Einfachkrank, ein kleines Taschenbuch zur Windowsprogrammierung wirst du nicht finden dafür hat die API einfach zu viele Funktionen.

Zu Windowssocket habe ich auch mal ein gutes Buch gesucht aber leider keines gefunden. Ich habe mir dann das ganze mit der Dokumentation aus dem msdn erarbeitet.

Einfachkrank
2003-03-19, 21:00:59
Gut, aber hat wegen der Fenster niemand ne Idee? :)

stabilo_boss13
2003-03-19, 21:36:15
Also wenn du so was machen willst wie das hier:
http://www.blender3d.org/About/
Der funktionert mit OpenGL und ist Open Source:
http://www.blender3d.org/Download/?sub=Source

Hier ein paar Links zur Api- und Socket-Programmierung
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vbcn7/html/vaconusingdoloop.asp
http://www.htl-tex.ac.at/ftp003/scriptum/kap12/k12_1.htm
http://www.rz.e-technik.fh-kiel.de/~felten/cnet2/winsock.html
http://www.rz.e-technik.fh-kiel.de/~felten/cnet2/socket.html
http://cplus.kompf.de/artikel/httpget.html
http://www.robsite.de/daten/tutorials/sockdoc.pdf
http://www.amazon.de/exec/obidos/ASIN/0201633728/qid%3D/302-1299742-2167203

Hier noch einige zur OpenGL-Programmierung:
http://wwwicg.informatik.uni-rostock.de/Lehre/CG1/OpenGL/WinNT/Visual/visual6_win.html
http://www.3dsource.de/faq/mslinks.htm
http://www.gametutorials.com/Tutorials/OpenGL/OpenGL_Pg1.htm
http://wwwiti.cs.uni-magdeburg.de/iti_ti/gdifi/opengl.pdf
http://www.uni-muenster.de/ZIV/inforum/1997-3/a12.html
http://wwwipr.ira.uka.de/~megi/SEMINAR/SS_01/OpenGL.pdf
http://www.fh-augsburg.de/rz/skripten/openglku.htm
http://www.gup.uni-linz.ac.at/cg/oglIntro1.pdf

Vielleicht ist ja was hilfreiches dabei.