Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

idontknow

unregistriert

1

11.09.2010, 18:23

Raytracer - Plane!

Moin!

Ich schreibe gerade an einem einfachen Raytracer der ne sehr primitive Scene in ne Datei packt.

Das ganze läuft folgendermaßen ab:

Meine Kamera ist der Mittelpunkt von Höhe/Breite der Auflößung und befindet sich "hinter" dem Bildschirm. Demnach wird durch jeden Bildschirm Pixel ein Strahl geschickt und auf Kollision überprüft.

Bei ner primitiven Kugel bzw mehreren schaut das so aus:

(Link)


(Link)


Nicht sonderlich toll aber tuts erstmal :). Jetzt woltle ich ne Plane hinzufügen. In meinem Raytracer erbt jedes Object von der abstrakten Klasse SceneObject und muss eine Methode intersectRay implementieren. Wenn ein Strahl mit mehreren Objekten kollidieren sollte wird der Pixel vom anhand des Objektes mit der kürzesten Entfernung berechnet (soviel zur Mechanik).

Wie man sehen kann funktioniert das bei den Kugeln bereits. Bei der Plane aber nicht......

Folgende Struktur beschreibt meine Plane:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
struct Plane : public SceneObject
{
    D3DXVECTOR3 n;
    D3DXVECTOR3 p;

    float intersectRay(const Ray &ray) 
    {
        float t = std::numeric_limits<float>::infinity();
        // ax + by +cz + d = 0

        n = normalize(n);
        D3DXVECTOR3 rd = normalize(ray.d);
        
        float d = dot(rd, n);

        if(abs(d) > 0.0001f)
        {
            return dot(p - ray.o, n) / d;
        }
        
        return t;
    }

    Plane(D3DXVECTOR3 normal, D3DXVECTOR3 point)
        :    n(normal),
            p(point)
    {
    }

};


Den Algorithmus habe ich hier entnommen: http://en.wikipedia.org/wiki/Line-plane_intersection

(Link)


Mit folgenden Parametern erstelle ich meine Plane:

C-/C++-Quelltext

1
(new Plane(normalize(D3DXVECTOR3(0, 0, -1)), D3DXVECTOR3(0, 0, 0)))


Erster ist der Normalenvektor und letzterer der Punkt der auf der Plane liegt.
Das Resultat schaut folgendermaßen aus:


(Link)


Wie man sich denken kann ist das nicht das was ich erwartet habe. Eigendlich sollte meine Plane eine paralelle rote Eben zum Bildschirm sein, kurz: der gesamte Screen sollte rot sein....

Ich hab aber leider wenig Erfahrung mit Planes und bin jetzt doch etwas überfordert...

mfg

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

2

11.09.2010, 18:32

Deine verlinkten Bilder können nicht angezeigt werden...

3

11.09.2010, 18:37

Bei mir zeigt es sie an, BurningWave

BurningWave

Alter Hase

Beiträge: 1 106

Wohnort: Filderstadt/Konstanz

Beruf: Student

  • Private Nachricht senden

4

11.09.2010, 18:38

?? Liegt das am IE? Bei mir kommen nur rote Kreuze.

5

11.09.2010, 18:38

liegt am browser... u.a. bei chrome gehts... bei ie nicht (bei mir)...

idontknow

unregistriert

6

11.09.2010, 18:40

Die Bilder sind grundsätzlich eher optional..

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

11.09.2010, 18:55

Wie sieht denn der Test aus? Was für Eingabewerte hast du?
@D13_Dreinig

idontknow

unregistriert

8

11.09.2010, 19:03

Wie sieht denn der Test aus? Was für Eingabewerte hast du?


C-/C++-Quelltext

1
2
N(0, 0, -1)
P(0, 0, 0)


oder was meinst du?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

12.09.2010, 01:52

oder was meinst du?


Ich mein den Quellcode wo du den Test machst, also der Code wo gerendert wird.
@D13_Dreinig

idontknow

unregistriert

10

12.09.2010, 16:06

dot hast gelößt :)
trotzdem danke!

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »idontknow« (12.09.2010, 16:39)


Werbeanzeige