ich habe vor für meine Application (CAD Viewer) eine perspeektivische Darstellung zu implementieren.
Die Ortho Darstelllung funktioniert bisher Topp und ohne Probleme.
Randbedingungen im Viewer:
- kein Z-clipping (es sollen also nicht einfach Teile verschwinden), beim Zoom möchte ich als dem Teil immer näher kommen es soll aber trotzdem nicht geclippt werden. (also ins innere Schauen darf ich nicht)
- die Z Tiefe sollte optimal sein, aber es muß möglich sein diese anzupassen (ohne daß die ganze Ansicht verspringt), z.B. wenn neue Teile eingefügt oder Teile verschoben werden.
Ich habe dabe einiges mit glFrustum probiert und im Prinzip auch eine perspektivische Darstellung hinbekommen:
Darstellung ist ok, solage das Objekt an seiner Position bleibt (also Rotation und Zoom gehen).
Aber ich muß erlauben, daß einige Teile dieser Objektes verschoben werden können. Somit müßte ich das Z clipping anpassen, was in perspectivischer Darstellung immer unweigerlich zu einem springen der Ansicht führt (da ja gl_Xmax, gl_Xmax, -gl_Ymax, gl_Ymax bei Z near sind). Außerdem kann die Verschiebung soweit gehen, daß eine Anpassung garnicht mehr geht oder es zu starken Verzerrungen kommt, da das Objekt den EYE Coordinaten sehr nahe kommt oder sogar dahinter verschwindet.
In anderen ähnlichen Viewern, wie eDrawings oder auch 3D-PDF funktioniert es, wie man es sich wünscht, nur wüßte ich gerne, wie man das realisiert?
oblique projection can be accomplished multiplying the projection matrix, after calling glOrtho,with a shear matrix.
float shear_matrix = { 1, 0, -cot(theta), 0,
0, 1, -cot(phi), 0,
0, 0, 1, 0,
0, 0, 0, 0 };glMultMatrix (shear_matrix);
Where theta is the angle between the x plane and the z plane and phi is the angle between the y plane and the z plane.
Kann das funtionieren? Bei mir hats so noch nicht funtioniert. Diese Shear matrix verschiebt bei mir nur die Z Coordinaten, da fehlt doch noch der scale?
Von Vorteile wäre es natürlich: Ich könnte mein bisheriges glOrtho nutzen und einfach darüber die x und y Werte abhängig von z Scalieren lassen.
Man kann die Near plane definitiv nicht auch null setzten. Beim Zoomen muss man dagegen darauf zurückgreifen, das nur ein Bildausschnitt sicht bar ist. Mit einer echten kammera ist es ja auch so das man spätestens dann nicht mehr weiter zoomen kann wenn die linse das objekt berührt Im prinzip muss man nur die ersten 4 Werte von glFrustum mit einem zoomfaktor multipluzieren, die far und near plane können dagegen auf festen werten bleiben.
Geanau bei den Near und Far Werten liegt aber das Problem.
Diese MÜSSEN von mir verändert werden, da sich Teile bewegen können und ich nicht generell ein Riesenbreich für Near...Far einstellen will und kann (da sonst der Z Buffer nicht ausreicht). Ich weiß ja auch davor nicht, wie weit sich diese Teile bewegen sollen oder können (ist Benutztereingabe).
Möglich muß es laut z.b. 3D-PDF (ok, das nutzt DirectX) und anderen sein! Die haben sowas umgesetzt.
Ich stelle mir vor einach ein Ortho zu nutzen, dazu eine Shear (das geht mit der Gleichung oben), je nachdem von wo ich schaue und dann noch die Scalierung für die weiter weg =x/y Verkleinern (oder näher =x/y Vergrößern) liegenden Punkte. nur, wie mache ich diese Scalierung in opengl (sie ist ja abhängig von z)?
Also ein linearer Z-Buffer wäre ein Schritt. (ist ja auch bei Ortho so).
Viel wichtiger aber ist near und far zu ändern ohne, daß dabei die ganze Ansicht sprigt. (also bei konstanten left, right, top, bottom) ein neues near und far zu setzen, so daß die Ansicht dabei exakt gleich aussieht.
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.