PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Änfängerfrage zu 3D-Programmierung


Elemental
2009-12-11, 13:50:56
Hallo zusammen,
ich mache gerade meine ersten Schritte mit WPF3D.
Mein erstes Projekt ist ein einfacher 3dViewer für elektronische Bauteile, mit Zoom und Rotationsfunktion etc.
Da ich bisher fast keine Erfahrung in Sachen 3D Programmierung habe, hab ich ein paar grunsätzliche Fragen.

- Wie realisiert man z.B. die Zoom-Funktion? Ich könnte entweder die Kamera näher an das Objekt ranstellen oder alternativ den Öffnungswinkel der Kamera ändern. Wie macht man das normal?

- Die Rotationen könnte ich entweder überTransformationen machen oder Kameraposition und LookDirection ändern. Was ist hier der übliche Weg?

Help!

mfG
Elemental

Monger
2009-12-11, 14:14:10
- Wie realisiert man z.B. die Zoom-Funktion? Ich könnte entweder die Kamera näher an das Objekt ranstellen oder alternativ den Öffnungswinkel der Kamera ändern. Wie macht man das normal?

Das sind zwei verschiedene Effekte. Wenn du den Öffnungswinkel änderst, änderst du auch die gesamte Optik des Objektivs. Das gibt dann so einen Tunneleffekt... wenn du die Kamera einfach näher ranstellst, hast du dieses Problem natürlich nicht.



- Die Rotationen könnte ich entweder überTransformationen machen oder Kameraposition und LookDirection ändern. Was ist hier der übliche Weg?

Auch hier wieder: du brauchst beides. Stell dir einfach mal vor, du hast nicht ein Objekt, sondern zwei. Nur durch die Änderung deiner Kameraposition kannst du die beiden Körper logischerweise nicht beliebig rotieren. Du brauchst dann getrennte Transformationen für beide Objekte.
Auf der anderen Seite wäre es Overkill, alle Objekte in der Welt zu transformieren nur weil du deine Kamera mal kurz anders halten willst. ;) Das erinnert so ein bißchen an Futurama, wo der Antrieb des Raumschiffs eigentlich am Raumschiff gar nichts gemacht hat, sondern nur das Weltall außenrum bewegt hat...

Neomi
2009-12-11, 14:15:11
Ein Zoom funktioniert über die Kameraprojektion, also letztendlich den Field of View (nicht durch Blendenöffnung, sondern Brennweite und zusammenhängende Parameter). Dadurch wird nur der Bildausschnitt vergrößert, es findet keine Veränderung der Perspektive statt. Eine Bewegung der Kamera vor und zurück ist kein Zoom (eine reale Kamera bewegst du auch nicht mit den Zoomknöpfen) und beinhaltet eine Änderung der Perspektive. Üblich sind beide Varianten, je nachdem was man erreichen will.

Bei der Rotation sind auch beide Varianten üblich, je nachdem was für ein Effekt erzielt werden soll. Drehst du das Objekt um seine eigene Position, bleibt die Beleuchtung relativ zur Kamera. Drehst du die Kamera um das Objekt, kannst du Licht- und Schattenseite betrachten.

Zu beiden Fragen ist einfach keine eindeutige Antwort möglich, bloß das übliche "it depends...". Und bei beiden Dingen lassen sich die Möglichkeiten beliebig mischen. Daher solltest du einfach die Variante (oder Mischung) nutzen, die für deine Anforderungen am besten funktioniert. Es gibt nicht den einen richtigen Weg.

Elemental
2009-12-11, 17:12:16
...Daher solltest du einfach die Variante (oder Mischung) nutzen, die für deine Anforderungen am besten funktioniert. Es gibt nicht den einen richtigen Weg.

OK, danke für die Antworten. Dann probier ich einfach aus :)

Elemental
2009-12-30, 09:33:53
Hallo,
ich hab da noch eine Frage zum "Field of View":

Mein Programm startet mit einem Field of View von 45°. Eine Methode stellt die Kamera genau in der Entfernung auf, damit mein 3D Objekt den ganzen sichtbaren Bereich ausfüllt, also sowas wie eine "ZoomToFit"-Funktion.

Zum Zoomen kann man das Field of View zwischen 0° und 180° verstellen.

Meine eigentliche Frage lautet nun:
Spielt es irgendeine Rolle, mit welchem Field of View Wert man startet?
Wenn ich z.B. 90° als Anfangswert hätte und dann meine "ZoomToFit" aufrufe, sieht doch erstmal alles gleich aus. Einziger Unterschied ist doch dann, wie weit man raus- bzw. reinzoomen kann, oder?

mfG
Elemental

rotalever
2009-12-31, 00:13:50
Mein Programm startet mit einem Field of View von 45°. Eine Methode stellt die Kamera genau in der Entfernung auf, damit mein 3D Objekt den ganzen sichtbaren Bereich ausfüllt, also sowas wie eine "ZoomToFit"-Funktion.

[...]

Meine eigentliche Frage lautet nun:
Spielt es irgendeine Rolle, mit welchem Field of View Wert man startet?
Wenn ich z.B. 90° als Anfangswert hätte und dann meine "ZoomToFit" aufrufe, sieht doch erstmal alles gleich aus. Einziger Unterschied ist doch dann, wie weit man raus- bzw. reinzoomen kann, oder?
Ja, es spielt eine Rolle welchen Wert Du am Anfang nimmst. Deine Funktion sollte eigentlich auch nicht "ZoomToFit" heißen sonder irgendwie "MoveToFit", da Du ja das Objekt so von der Kamera wegbewegst, dass es gerade komplett sichtbar ist.
Wenn Du also jetzt das Ganze sowohl mit 45° als auch mit 90° Anfangsöffnung machsts, hat das Objekt eine unterschiedliche Distanz zu Deiner Kamera. Da Du im weiteren Verlauf, diese Distanz ja nicht änderst, wird man einen Unterschied sehen (irgendwie anders verzehrt).

Interessant wäre dann folgendes: Wenn Du die Zoomfunktion, also die Änderung des Winkels ausführst, könntest Du gleichzeitig immer die MoveToFit-Funktion ausführen. Das Objekt würde dann immer den Bildschirm ausfüllen, aber trotzdem unterschiedlich aussehen.

Elemental
2010-01-02, 10:45:10
Also verstehe ich dich richtig, dass durch Änderung des Winkels das Objekt irgendwann verzerrt wird? Dann wäre es ja doch besser, die Zoom-Funktion via Änderung der Abstand Kamera<->Objekt zu realisieren, anstatt den Winkel zu ändern. Richtig?

Welchen Kamerawinkel nimmt man denn normal so als Anfangswert, damit alles "richtig" aussieht? Ich hab bisher immer 45° grad genommen...

mfG
Elemental

darph
2010-01-02, 12:11:10
Es stellt sich die Frage, was genau du mit deinem Zoom erreichen willst.

Schau dir mal ein paar Filme (echte, meine ich, Kinofilme) an und achte mal ganz genau darauf, wie oft überhaupt gezoomt wird. Gezoomt (also eine Verlängerung der Brennweite und daraus resultierend eine Verkleinerung des FoV-Winkels) wird sehr, sehr, selten und eigentlich nur für einen einzigen Effekt, nämlich die Erzeugung von bedrohlicher Spannung verwendet. In aller Regel wird die Kamera auf einem Dolly bewegt.

Wenn du einen Ausschnitt aus deinem Objekt vergrößert darstellen willst ohne das relative Größenverhältnis von Vordergrund und Hintergrund (sprich: Die Perspektive) zu ändern, du also wirklich nur eine Ausschnittsvergrößerung machen willst, dann mußt du Kamera näher an das Objekt bewegen. Mit der Brennweite hat das eher weniger zu tun. Insofern: Richtig.

Monger
2010-01-02, 12:55:32
Welchen Kamerawinkel nimmt man denn normal so als Anfangswert, damit alles "richtig" aussieht? Ich hab bisher immer 45° grad genommen...

Da hilft nur experimentieren. Das Problem ist, dass auf dem Computer möglichst realistische Größenverhältnisse nicht unbedingt als realistisch wahrgenommen werden.

In vielen Spielen z.B. Quake 3 konnte man früher den Kamerawinkel selbst einstellen. Da kannst du mal ein bißchen rumprobieren.

Ich habe früher für UT mal ein Gebäude maßstabsgetreu im Editor nachgebaut. Ich habe mir den Originalgrundriss besorgt, habe dann im UnrealEditor das Verhältnis umgerechnet (wenn man die Spielfiguren als ca. 1,80 groß angenommen hat, kam man ziemlich genau auf 128 Pixel pro Meter), und das Gebäude damit gebaut.

Als ich dann aber probeweise mal im Level drin stand, wirkte irgendwie alles verkehrt. Selbst bei einer Deckenhöhe von3m hatte man das Gefühl, direkt darunter zu kleben.
Ich habe dann festgestellt, dass das ganz wesentlich von der Beleuchtung abhängt. Und damals in UT war man mit ambientem Licht noch nicht weit genug, um das darstellen zu können, also hatte man aufgrund der gleichmäßigen Ausleuchtung das Gefühl, wesentlich näher an der Wand/Decke zu sein als man tatsächlich war. Die Entwickler haben versucht, das unter anderem über den Kamerawinkel ein wenig auszugleichen. Realistisch war das bei weitem nicht, aber es sah gefühlt einfach besser aus.

Da auch bei Menschen der Betrachtungswinkel im Auge von Person zu Person variiert (Frauen haben im Schnitt ein deutlich breiteres Sichtfeld als Männer), lässt sich das objektiv sowieso kaum festlegen.

Elemental
2010-01-02, 17:13:30
Wieder was dazu gelernt. :)
Dank euch!

Xmas
2010-01-02, 18:41:31
Also verstehe ich dich richtig, dass durch Änderung des Winkels das Objekt irgendwann verzerrt wird? Dann wäre es ja doch besser, die Zoom-Funktion via Änderung der Abstand Kamera<->Objekt zu realisieren, anstatt den Winkel zu ändern. Richtig?
Das FOV zu verkleinern entspricht dem, ein Teil des Bildes aus der Bildmitte auszuschneiden und auf Vollbild zu skalieren (natürlich mit zusätzlichen Details). Bei einem solchen Zoom sind also grundsätzlich dieselben Oberflächen sichtbar, nur größer. Geht man mit der Kamera allerdings näher heran, so können andere Oberflächen sichtbar bzw. verdeckt werden.

rotalever
2010-01-02, 18:51:44
Das FOV zu verkleinern entspricht dem, ein Teil des Bildes aus der Bildmitte auszuschneiden und auf Vollbild zu skalieren (natürlich mit zusätzlichen Details).
Aber die Perspektive / Verzerrung ändert sich doch auch.

Xmas
2010-01-02, 19:14:50
Ja, aber eben genauso als ob du einen Bildausschnitt aus der Mitte vergrößern würdest.

rotalever
2010-01-02, 20:48:51
Ja, aber eben genauso als ob du einen Bildausschnitt aus der Mitte vergrößern würdest.
Ja stimmt, hatte mich vertan.

Gast
2010-01-06, 05:01:08
Schau dir mal ein paar Filme (echte, meine ich, Kinofilme) an und achte mal ganz genau darauf, wie oft überhaupt gezoomt wird. Gezoomt (also eine Verlängerung der Brennweite und daraus resultierend eine Verkleinerung des FoV-Winkels) wird sehr, sehr, selten und eigentlich nur für einen einzigen Effekt, nämlich die Erzeugung von bedrohlicher Spannung verwendet. äh... du meinst jetzt nicht den Vertigo-Effekt (http://de.wikipedia.org/wiki/Vertigo-Effekt), oder? Da wird nämlich nicht nur gezoomt, sondern beide Mechanismen kombiniert, d.h. zusätzlich die Entfernung der Kamera verändert. Derart, dass das fokussierte Objekt gleich groß bleibt, das Aussehen der übrigen Szene sich aber ändert.