Winkel zwischen 2 Vektoren/Fisheye

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

StepTiger

Betreff: Winkel zwischen 2 Vektoren/Fisheye

BeitragSa, Jun 09, 2007 22:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey ho!

Ich arbeite gerade mal wieder an der nunmehr verbesserten Variante meines Raytracers.

Nun habe ich 2 Probleme:
Um ein ordentliches Shading hinzubekommen, müsste ich eine Möglichkeit finden, den Winkel zwischen 2 Vektoren mit selben Ausgangspunkt herauszufinden.
Irgendwie finde ich keine Lösung =(
Ich danke vielmals für jegliche Hilfe.

2tes Problem:
Mein Raytracer hat diesen lustigen Fisheye Effekt. Es sieht also alles verdammt rund aus. Hier mal ein Screenshot von Wireframe und gerendertem Bild.
Schatten habe ich momentan kurz rausgemacht, da er a) noch Probleme bei Backfaces hat und b) wesentlich mehr Zeit in Anspruch nimmt.

Wireframe:
http://www.blitzprog.de/hp/ste...ndered.PNG

Rendered:
http://www.blitzprog.de/hp/ste...ndered.PNG

Wie ihr sehen könnt, liegen die Vertices zwar sehr mit denen aus den Wireframe überein, jedoch ist dazwischen so eine komische "Biegung". Wie kann man das verhindern?

Dennoch ist mein Raytracer derzeit verdammt:
LANGSAM... was kann man da sinnvolles tun, um so ein langes Berechnen zu verhindern?
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.
 

Dreamora

BeitragSa, Jun 09, 2007 22:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Länge(A*B) = Länge(A)*Länge(B)*cos(Zwischenwinkel)

wobei * das Skalarprodukt ist.

Damit solltest du in der Lage sein den Winkel herauszufinden Smile
Ihr findet die aktuellen Projekte unter Gayasoft und könnt mich unter @gayasoft auf Twitter erreichen.

StepTiger

BeitragSa, Mai 03, 2008 15:52
Antworten mit Zitat
Benutzer-Profile anzeigen
So, also wieder mal von vorn angefangen mit dem Raytracer ^^

Hatte den Code damals so versaut, dass man darin einfach nicht mehr programmieren konnte.

Jetzt hab ich also mal wieder alles ein bisschen schöner zusammengeschrieben. Immerhin berechnet er jetzt Farben auch richtig und man kann jedem vertex eine Farbe zuweisen.

Jetzt hab ich aber immer noch diesen dämlichen Fisheye-Effekt.

Kann sich jeder herunterladen:
HIER

Screenshots gibt's hier:
user posted image
user posted image


Also ihr seht's ja schon.
Im Wireframe wird noch alles richtig angezeigt, aber beim rendern verzerrt er zu den Rändern hin das Bild.


Danke für jede Hilfe Smile
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSa, Mai 03, 2008 22:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Dieser Effekt ist durchaus richtig. Man kann es auch bei Weitwinkelobjektiven schon sehr stark erkennen. Bei Teleobjektiven ist der Effekt zwar auch dabei, aber kaum sichtbar. Bei dir ist allerdings der Effekt nur in der horizontalen komplett, aber in der vertikalen garnicht vorhanden. Das macht die Sache dann doch sehr unrealistisch.

Willst du trotz Realismus diesen Effekt weg haben, so müssen die Strahlen je nach Bildschirmposition mit unterschiedlicher ''Geschwindigkeit'' ausgesendet werden. Also so, wie es DX und OpenGL auch machen. Die Eckpunkte müssen also um den Bogenmaß -Unterschied schneller fliegen, bzw. die Entfernung muss eben anders umgerechnet werden.

Realistisch ist, wenn sich die Lichtstrahlen Kugelförmig ausbreiten. Nach deinen Wünschen wäre es aber in einer ''Platte'', die nach vorne schießt.

Kannst leider nicht anders beschreiben. Habe allerdings bei meinem Raycaster es auch hin bekommen, weil andere danach lechzten.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Noobody

BeitragSa, Mai 03, 2008 23:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Bei meinem Raycaster hatte ich dasselbe Problem - die Sache ist eben die, dass Strahlen von der Bildschirmmitte zu einem flachen Objekt vor der Kamera weniger lang haben als ein Strahl, der am Rand des Sichtfelds ausgesendet wird.
Den Fisheye - Effekt kannst du beheben, indem du DistanzZuObjekt * Cos( Winkel ) rechnest, wobei Winkel die Differenz zwischen dem Aussendewinkel des aktuellen Strahls und dem Winkel des Strahls in der Bildschirmmitte beschreibt und DistanzZuObjekt eben die Distanz zwischen der Kamera und dem Objekt beschreibt (welche du ja mit LinePick herausgefunden hast, ich weiss nicht genau, wie ein RayTracer in BB implementiert wird).
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

StepTiger

BeitragSo, Mai 04, 2008 0:05
Antworten mit Zitat
Benutzer-Profile anzeigen
najo, LinePick war's jetzt nicht ^^

Der Raytracer basiert wirklich komplett auf reiner Mathematik.

In x und z habe ich ja schon Cos(pitch) mit eingebaut, aber bei y geht das ja nicht so einfach, das ist ja das Problem ^^

Also müsste ich sozusagen den Cosinus des selben Winkels mit einbauen, ich probier's einfach mal.

Danke soweit schonmal.

Wer sehen möchte, wie das Ding arbeitet, am besten einfach mal herunterladen.
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

Noobody

BeitragSo, Mai 04, 2008 1:03
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe einfach in der Zeile 130 folgendes verändert:
Code: [AUSKLAPPEN]
 ty#=Sin(pit#)*cam\dist#*Cos(yaw#)


Als Folge kein Fischaugen - Effekt mehr Razz
Jedoch stimmen die Masse nicht mehr mit dem vorherigen Dreieck überein - das konnte ich dann leider nicht beheben.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

StepTiger

BeitragSo, Mai 04, 2008 1:36
Antworten mit Zitat
Benutzer-Profile anzeigen
hab ich mittlerweile gemacht ^^
hatte die selbe idee wie du, und die maße stimmen jetzt ^^

danke =)

*edit*

*muahahaha*

Das sieht jetzt so geil aus, dass ich sogar glaube, dass das mein erster Projekteintrag wird, aber ich lass mir noch Zeit denke mal ^^

Wer jetzt ein neues Bild sehen will:
Unrendered
Rendered

Das ist jetzt nur ein Versuch mit einem Plane gewesen, aber das ist ja erstmal egal ^^

Also es funktioniert auch bei Würfeln, soweit hab ich das schon getestet.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Mai 04, 2008 11:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Wobei ich es immer schade finde, wenn Leute einen Raytracer so ''kastrieren'' nur damit die Kanten ''gerade'' angezeigt werden, obwohl es unrealistisch ist. Man könnte u.a. versuchen den Kamerawinkel etwas zu verkleinern (Teleobjektiv) um den Effekt etwas schwächer ausfallen zu lassen. Es blebt letztendlich doch wieder Geschmackssache.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Noobody

BeitragSo, Mai 04, 2008 14:42
Antworten mit Zitat
Benutzer-Profile anzeigen
Also meiner Meinung nach ist der Fischaugeneffekt sehr störend, jedoch ist es nur logisch, dass er in solchen Anwendungen auftritt.

Schaut die Kamera senkrecht auf eine Wand in angemessener Entfernung, und man sendet Strahlen durch jeden Pixel der Projektionsfläche, so haben die Strahlen am Rand der Fläche länger zur Wand als die in der Mitte der Fläche (das Bild verdeutlicht dies).

user posted image

Wie auf der Zeichnung unschwer zu erkennen ist, sind die Strahlen von der Kamera K durch die Projektionsfläche P unterschiedlich lang.
Darum erscheint auf StepTigers Bild die Wand in der Mitte höher, da der Strahl zur Wand in der Mitte des Bildschirms (S1) kürzer ist als ein Strahl am Rand (S2).

In der Realität haben wir denselben Effekt mit den Lichtstrahlen, die in unser Auge fallen - nur ist der Bildschirm im Gegensatz zum Auge eine platte Fläche, wodurch ein Fischaugeneffekt auf dem Computerbildschirm unnatürlich und störend wirkt und deshalb entfernt werden muss.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Mai 04, 2008 19:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Noobody hat Folgendes geschrieben:
...entfernt werden muss.


Ich weiß wie so ein Effekt zu stande kommt. Denoch ist es unrealistisch es zu begradigen. Jeder der behauptet es sein nicht so, müsste jedes geschossene Foto als fehlerhaft beurteilen. Aber wie gesagt, es bleibt Geschmackssache. Allerdings ist die Netzhaut - wie von dir schon erwähnt - nun auch nicht platt, sondern eben eine ''Hohlkugel''. Denoch wird dieser Effekt auch mit dem Auge so wahrgenommen. Man muß sich eben nur richtig hinstellen, um es auch als solches zu erkennen, da sonst auch das Gehirn viel gegensteuert und ausgleicht.

Handelt es sich um ein Renderer, so würde ich zumindest dem User entscheiden lassen, wie er es haben möchte. Am besten noch mit einer Skala von 0 bis 1 (0 = keine Korrektur, 1 = volle Korrektur). Denn, warum sollte man eines der Stärken eines Raytracers (realistische Bilder) durch eine Kastrierung verschlechtern, nur weil ein paar Leute kein Gefühl für Realismus haben? Man könnte also ganz einfach die Ausgleichssteuerung durch den erwähnten Multiplikator laufen lassen, und alle sind glücklich. Very Happy

Nachtrag: Oft wird dieser Effekt so vergräult, weil:

1. Sonstige computergenerierte Bilder (DX, OpenGL) aus Gewohnheit eben schon Falsch sind. ''Man kennt es nicht anders''.

2. Oft der Fehler gemacht wird, ein risiges Objekt in den Bildschirm pressen zu wollen. Damit es dann geht, wird eine minimale Distanz eingehalten statt den Einfangwinkel der Kamera zu justieren. Jede TV-Aufnahme hat eben kein +/- 45° (90°) Einfangwinkel, sondern eher +/- 10° wenn überhaupt.

Noch ein Nachtrag: Mit der korregierten Fassung kann man unmöglich ein Weitwinkelobjektiv von >180° Einfangwinkel erstellen. Schon viel früher fangen dann ganz andere Probleme auf.

Wie dem auch sei, ich würde eine individuelle Einstellskalla sehr begrüßen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Noobody

BeitragSo, Mai 04, 2008 20:06
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich sehe, da gehen unsere Meinungen stark auseinander Wink

Aber wenn ich selbst in Programmen wie Blender keine Option sehe, um die 'Kastration' auszuschalten, würde ich es ehrlich gesagt genauso tun.
Auch bist du die erste Person die ich kenne, die sich den Fischaugeneffekt herbeiwünscht - ein Bild wirkt nicht realistischer, wenn es durch den Fischaugeneffekt verzogen wird.
Für uns DX und OpenGL 'verzogene' Menschen wirkt es einfach seltsam, wenn eine vorher ebene Wand nach dem Rendern aussieht wie ein Fischglas.
Ein in real geschossenes Foto mit Weitwinkelobjektiv sieht für mich auch nicht echter aus als ein 'gewöhnliches' Foto.

Aber ich schätze, das ist Ansichtssache - hier hast du wenigstens noch die Möglichkeit, den Entwickler nach deinen Wünschen zu beeinflussen.
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun

StepTiger

BeitragSo, Mai 04, 2008 21:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hectic, du betrachtest das ganze leider etwas falsch.

Du sagst, dass dieser Fisheye-Effekt ja gewünscht ist. Um ein Bild aber so zu sehen, wir wir es in Realität sehen, muss es eben unverfälscht, also perfekt gerade sein, ohne diesen Fisheye-Effekt.

Schließlich tritt er beim Betrachten des Monitors auf, sonst würde unser Gehirn nämlich denken, wir würden eine halbe Ellipse statt eines Rechteckes sehen.

Ich will das Bild ja so anzeigen, dass es wie die Realität ist. Ich will es nicht so darstellen, wie unser Auge es wahrnimmt.
Noch gestern standen wir am Abgrund, doch heute sind wir schon einen Schritt weiter.
Computer:
AMD Sempron 3000+; ATI Radeon 9800 Pro; 512 MB DDR RAM 400Mhz; Asus E7N8X-E Deluxe; Samsung 200GB HD 5.4ns acces t
Gewinner: BP Code Compo #2
Π=3.141592653589793238...<--- und das aus dem kopf Laughing
Seit der Earthlings-Diskussion überzeugter Fleisch(fr)esser.

hectic

Sieger des IS Talentwettbewerb 2006

BeitragSo, Mai 04, 2008 23:01
Antworten mit Zitat
Benutzer-Profile anzeigen
Nunja, ich rede auch nicht davon, dass jeder Würfel wie ein Pfirsich aussehen soll, sondern eben nur ein kleiner Effekt zu erkennen ist. Eben so, wie man es von Fotos und Fernsehen her kennt. Man soll also nicht versuchen 90° Einfangwinkel in das Bildergebniss zu pressen, sondern eben ~ 20°. Aber wie gesagt, ich würde so eine Einstellung begrüssen, wärend andere es erst nie benutzen würden. Man könnte z.B. durch so eine Einstellung auch schöne gerenderte Panoramabilder erstellen, was sonst nicht möglich ist. Man könnte damit dann auch Spherical-Reflection -Bilder für weitere Programmierung erstellen, oder eben auch Skysphere -Bilder. Und nur weil irgendein Renderer es nicht kann, heisst es doch noch lange nicht, dass es das nonplusultra ist. Es schadet also niemanden, die Korrekturformel durch ein einfachen Multiplikator laufen zu lassen. Der Berechnungsmehraufwand ist nur minimal. Leider ist aber dein Fisheyeeffect bereits im Bild schon fehlerhaft, da nur in der Vertikalen verzogen wird. Es also richtig zu machen, würde doch ein Mehraufwand bedeuten.

Es sind also nur Ratschläge, die meines erachtens für ein richtigen Renderer notwendig sind. Von den ganzen physikalischen Möglichkeiten (Berechnung von Raumkrümungen etc...) mal ganz abgesehen.
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group