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

Aktuelle Zeit: Fr Mai 24, 2024 00:21

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



Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Eine Kammera Klasse...
BeitragVerfasst: Do Apr 28, 2011 14:20 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
was sollte sie können und wozu ist sie gut?

während ich auf eine lösung des restless problems warte möchte ich meine Kammere Klasse entwickeln die ich ja auch mal benötige um mich gut im raum unzusehen, jetzt frag ich mich aber was diese können sollte und warum ich umbedingt eine brauche, ich kann die kammerposition ja auch in nem record speichern und das geht auch.

also irgendwie steh ich sozusagen gerade zwischen den punkten, brauch ich und brauch ich nicht, vieleicht kann ja einer von euch mir paar sachen sagen wozu eine kammera klasse wirklich gut ist.

lg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eine Kammera Klasse...
BeitragVerfasst: Do Apr 28, 2011 15:05 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
Guck mal hier : http://www.delphigl.com/forum/viewtopic.php?f=13&t=9811

Nach meiner Meinung kommst Du um eine Berechnung der Matrizen von OGL nicht herum. Es ist einfacher im Code.

Gruß Jens


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eine Kammera Klasse...
BeitragVerfasst: Do Apr 28, 2011 15:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
ich kann die kammerposition ja auch in nem record speichern und das geht auch.

Möchtest du objektorientiert oder imperativ programmieren? Das sind einfach zwei verschiedene Konzepte. Die meisten neueren Programmierssprachen sind heute objektorientiert (z.B. Delphi, C++, Java, PHP, Python, Perl ...)

Die Grundidee bei der Objektorientierung laut Wikipedia:
Zitat:
Die Grundidee dabei ist, Daten und Funktionen, die auf diese Daten angewandt werden können, möglichst eng in einem sogenannten Objekt zusammenzufassen und nach außen hin zu kapseln, so dass Methoden fremder Objekte diese Daten nicht versehentlich manipulieren können.

Diese Datenkapselung macht die Programme besser lesbar/wartbar. Die Schnittstelle nach außen wird möglichst klein gehalten, andere Programmteile können die Daten nur über die Schnittstelle verändert werden. Die Schnittstelle ist quasi eine Brücke die sicherstellt dass der Objektzustand immer valide ist.

Des weiteren gibt es bei Objekten/Klassen die Möglichkeit der Vererbung. Angenommen du möchtest verschiedene Kameratypen (etwa Ego-Shooter und Third-Person) könntest du eine Basisklasse "BaseCamera" schreiben die die Gemeinsamkeiten enthält. Gemeinsamkeiten wären etwa das extrahieren der 6 Frustum-Ebenen aus der Kamera-Matrix. Davon würdest du dann die Klassen "EgoCamera" und "ThirdPersonCamera" ableiten, wo dann die Unterschiede implementiert werden.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eine Kammera Klasse...
BeitragVerfasst: Fr Apr 29, 2011 09:26 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
also allein das argument der objektorientiertheit find ich bisschen schwach, aber unterdessen hab ich mir überlegt das ich eventuell noch paar sachen brächte wie an ein objekt binden oder freigenen, mehrere kammeras und all so zeug,
whabt ihr selbe kammera klassen? was können die so?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eine Kammera Klasse...
BeitragVerfasst: Fr Apr 29, 2011 09:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
whabt ihr selbe kammera klassen? was können die so?

  • Kamera Frustum (= 6 Ebenen) berechnen, Sichtbarkeitstest für eine BoundingBox durchführen. Eine andere Klasse nutzt diese Funktion um eine Liste der sichtbaren Objekte in der Szene zu generieren.
  • set()-Methode setzt die Modelview und Projektions Matrix für OpenGL
  • clear()-Methode ruft glClear auf. In einer Unterklasse wird das dann überschrieben um z.B. einen Hintergrund (z.B. Skybox) zu zeichnen.
  • update()-Methode kümmert sich um die Auswertung der Mausbewegung, Tastendrücke usw. (Info wird von einer anderen Klasse zur Verfügung gestellt). Die Kamerabewegung passiert aber hier. Wird natürlich in der Unterklasse überschrieben.
  • in meiner Anwendung kann es mehrere Ansichten gleichzeitig geben. Es gibt daher eine Funktion um Kameras mit einander zu synchronisieren
  • Unterklassen für verschiedene Kameratypen: Ego-Kamera, Trackball-Kamera, Aerial-Kamera (wie Google Maps), Selection-Kamera. Letztere wird beim Color-Picking benutzt, sie berechnet aus einer anderen Kamera und der Cursor-Position eine spezielle Kameramatrix so das nur ein kleiner Bereich von wenigen Pixeln gerendert werden muss.

Zitat:
also allein das argument der objektorientiertheit find ich bisschen schwach

Wird wahrscheinlich daran, dass du das objektorientierte Konzept noch nicht verstanden hast. Hat bei mir damals auch was länger gedauert ;) Insbesondere die Nutzung von Vererbung und Polymorphie vereinfacht vieles! Du kannst einfach alle Objekte gleich behandeln ohne überall riesige Fallunterscheidungen zu haben. Auto-Vergleiche sind ja immer gut:
Du kannst ein Auto fahren in dem du einfach die Methode auto.fahren() aufrufst. Dabei ist es egal ob es sich bei "auto" um einen Ferrari oder einen Fiat Punto handelt. Ohne die Polymorphie bräuchtest du quasi für jedes Auto einen eigenen Führerschein.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eine Kammera Klasse...
BeitragVerfasst: Fr Apr 29, 2011 10:20 
Offline
DGL Member
Benutzeravatar

Registriert: Di Dez 03, 2002 22:12
Beiträge: 2105
Wohnort: Vancouver, Canada
Programmiersprache: C++, Python
Dropye hat geschrieben:
whabt ihr selbe kammera klassen? was können die so?


Im prinzip kann meine Camera klasse nur "sehr wenig", allerdings liegt das am gesamt aufbau..

Sie hat nur ein paar sehr wichtige funktionen, zum einen "render()" bzw "renderRegion(...)" sind die funktionen die ich aufrufe um eben die Scene aus sicht dieser Kamera zu rendern.

"addPostRenderEffect()" und co sind für PostRender Effekte wie glow etc zuständig - das ganze gibt es sowohl als "Global Effect" als auch als "Camera Effect".. also ich kann einen Effekt einer speziellen Kamera zuweisen oder eben allen immer.

Dann noch ein paar funktionen á la getModelviewMatrix(), getProjectionMatrix(), getResolution() etc.

getRay() liefert mir an screenPosition X/Y einen Ray den ich für Raytracing etc nutzen kann.


Die bewegung der Kamera läuft bei mir über Transform-Nodes. Die Kamera stammt vom Typ CIObject ab (wie z.B. auch CIPolyObject, CINurbsObject etc). Jedes CIObject kann eine Transform Node haben welche die Transformationen übernimmt.

Daher habe ich nur meine eine CICamera und zusätzlich dazu dann CIEulerTransform (Steuerung via Translation, Rotation und Scaling), CIQuaternionTransform (Steuerung via Quaternion), CIPathTransform (Bewegung an einem Pfad entlang), CIMoveableTransform (Bewegung wie im Egoshooter inkl. collision detection), CIMayaTransform (Steuerung wie in Maya), CICarTransform (Steuerung für Autos) und noch einige andere..

Das ganze kommt bei mir daher das ich beruflich viel mit Maya und 3D Programmen zu tun habe und mich daher am aufbau eher an diesen orientiert habe als an einer Game Engine. Mag zwar teilweise etwas merkwürdig sein, macht aber alles viel sinn in dem moment wo man nicht nur rein spiele damit programmieren möchte oder mehr als OpenGL unterstützen will. (Ich kann z.B. jederzeit in meiner Engine einen knopf drücken und in dem moment wird das aktuelle frame mit einem Raytrace-Renderer in HighQuality gerendert).

Das Transform Konzept hat auch den riesen vorteil das wenn ich eine neue bewegungsart einbauen möchte dies nicht für jede Objektart (Camera, Mesh etc) machen muß, sondern lediglich eine Transform erstelle und diese dann den Objekten zuweise.

Aber, eine kleine wichtige sache die beim Kamera-Klassen-design bedacht werden sollte - falls du sowas mal vorhast - sind Stereoskopische Kameras. Das ist in meinem Falls so gelöst das die CIStereoCamera intern 2 CICamera Objekte hat welche via EyeDistance, EyeConvergence etc steuerbar sind. In der render() funktion wird einfach die render-funktion der beiden kameras nacheinander aufgerufen und in einen Framebuffer gerendert, welcher dannach via PostEffekt composed wird.

Alle funktionen wie getModelviewMatrix() der StereoCamera liefern dann immer den wert der aktuell rendernden Kamera zurück.

Aya~


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eine Kammera Klasse...
BeitragVerfasst: Fr Apr 29, 2011 12:53 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
also erstmal entschuldigung wür die massiven vertipper in meinem letzten beitrag das sieht nicht gut aus^^

aber eure kammera klassen scheinen ja ne menge zu können, naja dann weiß ich ja was ich mach wärend ich versuche die objekte zum laufen zu bekommen,

danke euch für eure anregungen
lg


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eine Kammera Klasse...
BeitragVerfasst: Fr Apr 29, 2011 13:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich habe anders als Coolcat und Aya meine Kameraklasse mehr als Transformation gebaut und weniger als Renderer.
Code:
  1. TGLCamera = class (TObject)
  2.   public
  3.     constructor Create;
  4.     destructor Destroy; override;
  5.   private
  6.     FModelViewInvalidated: Boolean;
  7.     FProjectionInvalidated: Boolean;
  8.     FViewport: TGLViewport;
  9.     FOnMoved: TNotifyEvent;
  10.   protected
  11.     FModelView: TMatrix4f;
  12.     FProjection: TMatrix4f;
  13.   protected
  14.     procedure DeinvalidateModelView;
  15.     procedure DeinvalidateProjection;
  16.     procedure DoMoved;
  17.     procedure InvalidateModelView;
  18.     procedure InvalidateProjection;
  19.     procedure RecalculateModelView; virtual; abstract;
  20.     procedure RecalculateProjection; virtual; abstract;
  21.     procedure ViewportChanged(Sender: TObject); virtual;
  22.   public
  23.     function GetOneMatrix: TMatrix4f;
  24.     procedure Load;
  25.     procedure LoadAsOne;
  26.     procedure Mult;
  27.     procedure MultAsOne;
  28.     procedure Update(const TimeInterval: Double); virtual;
  29.     procedure Validate;
  30.   public
  31.     property OnMoved: TNotifyEvent read FOnMoved write FOnMoved;
  32.     property Viewport: TGLViewport read FViewport;
  33.   end;

So sieht meine Basisklasse aus (das sagt vielleicht etwas mehr, als ich beschreiben könnte)
Davon leite ich eine Perspektivische Kamera ab, die entsprechend die berechnung der Projektionsmatrix anpasst. Verschiebungen werden in der ModelView Matrix untergebracht. Die Update-Methode wird in noch einer Ableitung benutzt, wo ich sanfte Kamerabewegungen mit Beschleunigung/Dämpfung eingebaut habe, die dann in der Update-Methode angewandt wird.
Das Rendern geschieht nicht in der Kamera, die wird nur nach ihren Matrizen gefragt.

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Eine Kammera Klasse...
BeitragVerfasst: Fr Apr 29, 2011 15:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Das Rendern geschieht nicht in der Kamera, die wird nur nach ihren Matrizen gefragt.

Bei mir ist das eigentlich auch so. Man kann aber eben prüfen ob eine gegebene BoundingBox aus Sicht der Kamera sichtbar ist. Die Kamera weiß damit aber nichts von der Szene und kann sie auch nicht rendern.

Hier mal meine Klassenhierarchie:
  • Frustum
    • Camera (abstrake Klasse)
      • WidgetCamera (abstrake Klasse, Kameras mit User-Input von einem QGLWidget)
        • EgoCamera
        • TrackballCamera
        • AerialCamera
      • SelectionCamera

_________________
Yeah! :mrgreen:


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 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.009s | 16 Queries | GZIP : On ]