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

d00m

Frischling

  • »d00m« ist der Autor dieses Themas

Beiträge: 17

Wohnort: Bautzen

  • Private Nachricht senden

1

17.08.2007, 08:02

Frage zum 2. Teil des 3D Kollisionstutorial

Woltle grad das tutorial machen zum thehama Strecke und Ebene und fand nun den Datentyp Plane da.
Aus was besteht der, bzw wie is er angelgt?
im forum hier fand ich die struktur
struct PLANE {
Vector v;
float d;
};
aber da begreife ich den zusammenhang nicht recht ;)
Vector v soll ja wohl die 3 eckpunkte der dreiecksebene ABC sein, oder?
also wäs Vector v[3]; oder?
und was hat das d da zu suchen?
vllt kann mir ja jemand "schnell" weiterhelfen, würd mich freuen!

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

2

17.08.2007, 08:50

Ich vermute mal stark, dass es sich bei dem Vektor v um den orthogonalen Vektor der Ebene handelt. Wenn du jetzt noch genauer nach der Hesseschen Normalform googlest sollte sich dir auch der Sinn von d erschließen ;)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

17.08.2007, 09:10

Der Vektor v ist der Normalenvektor der Ebene und d der Abstand zum Ursprung. Es gild (latex) \vec{x} \cdot \vec{v} = d. X ist ein beliebiger Punkt auf der Ebene.

Was der Vektor v aber nicht macht ist irgendwelche Eckpunkte repräsentieren! Eine Ebene hat nämlich nichtmal Ecken! :-P
@D13_Dreinig

d00m

Frischling

  • »d00m« ist der Autor dieses Themas

Beiträge: 17

Wohnort: Bautzen

  • Private Nachricht senden

4

17.08.2007, 09:14

also ist plane wirlich nur mit v und d definiert
v nun also das kreuzprodukt von (C-B x A-B) okay, soweit so gut, aber das mti dem d raffe ich irgendwie noch garnet
und irgendwie kann das doch och net alles in der struktur oder klasse sein.
im tutorial steht die zuweisung ja mit:

Quellcode

1
p.d = -(v1.x * p.a + v1.y * p.b + v1.z * p.c);

soweit klar, d ist n float wert, das is och noch okay.
v1 ist der ortsvektor von..einem der 3 Punkte die an plane übergeben werden. die ebene is aufs dreieck ABC begrenzt!?
also wären die parameter v1, v2, v3 für A, B und C
was mich zum leichten, anschaulicheren, umwandln der funktion bringt,

Quellcode

1
2
3
4
5
6
Plane::PlaneFromPoits(Vector& A, Vector& B, Vector& C)
{
     Plane temp;
     temp.vN.CrossProduct(C-B, A-B);
     temp.SetD(.......);
}

soweit so gut, aber für was steht, in der oberen rechnung, p.a, p.b und p.c
doch punkte? also die dreeckspunkte doch "rein" laden!?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

5

17.08.2007, 09:18

Schrieb ich doch bereits: d = \vec{v} \cdot \vec{x}. Also das Ergebnis des Skalarprodukts zwischen dem Normalenvektor und dem Ursprungsvektors der ein beliebiger Punkt auf der Ebene repräsentiert. Kurz der Abstand der Ebene vom Ursprung des Koordinatensystems.
@D13_Dreinig

d00m

Frischling

  • »d00m« ist der Autor dieses Themas

Beiträge: 17

Wohnort: Bautzen

  • Private Nachricht senden

6

17.08.2007, 09:36

naja, ich versuchs nach der gezeigten frmel zu machen, sonst peil ich nix.
aber kanns sein, seh ich grad, das d errechnet wird durch:

Quellcode

1
2
3
4
5
6
vN     <-- NormalisierterVector
Plane::PlaneFromPoints(Vector &v)
{
     Plane temp;
     temp.SetD(v.x*vN.x+v.y*vN.y+v.z*vN.z);
}

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

7

17.08.2007, 09:39

Wenn vN der normierte Normalenvektor der Ebene ist und v ein Ortsvektor eines Punktes der auf der Ebene liegt ist, dann ja.
@D13_Dreinig

d00m

Frischling

  • »d00m« ist der Autor dieses Themas

Beiträge: 17

Wohnort: Bautzen

  • Private Nachricht senden

8

17.08.2007, 10:30

also ich komm da echt nciht dahinter.
ein Plane ist ne ebene, mit unbegrenzten maßen.
lediglich ne richtung hat sie ja, oder!?
also, z.b. v(0,1,0) müsste mir ne ebene geben, die geraden von unten nach oben geht!?

die funktion zum erstellen einer ebene ist ja:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Plane PlaneFromPoints(const Vector3D& v1, // Die drei Punkte
                      const Vector3D& v2,
                      const Vector3D& v3)
{
    Plane p;

    // Normalenvektor durch Kreuzprodukt berechnen und eintragen
    p.n = Vector3D_Cross(v3 - v2, v1 - v2);

    // Das fehlende d berechnen
    p.d = -(v1.x * p.a + v1.y * p.b + v1.z * p.c);

    return p;
}


dazu ist nun, denke ich:

Quellcode

1
2
3
4
5
struct Plane
{
    Vector3D n;
    float d;
};


die parameter, v1, v2 und v3 beziehe ich immernoch auf die 3 ecken des dreiecks!
wo kommt nun aber a, b und c her.

hat vllt jemadn n doc oder sowas, wo ich mich belesen kann.
peile das echt nich :-/
(wie man merkt ;) )[/code]

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

9

17.08.2007, 10:47

Eine Ebene hat eine Ausrichtung, genau. Die kannst du mit den Normalenvektor der Ebene beschreiben, der steht nämlich genau rechtwinklig (ortogonal) auf der Ebene. Die y-Achse des Koordinatensystems v(0,1,0) ist also der Normalenvektor der Ebene die von den Achsen x und z aufgespannt wird. In dem Fall ist die Ebene um 0 Einheiten vom Achsenursprung O(0,0,0) verschoben. Die Ebene kann aber natürlich auch von dort weggeschoben werden und das ist der skalare Wert den "d" repräsentiert.

Stells dir mal 2 Dimensional vor (is evtl leichter):

Du hast einen normierten Normalenvektor (n/|n|) einer Geraden (n) und einen Punkt auf dieser geraden (P). Der Punkt wird beschrieben durch den Ortsvektor p also P-O. Wenn du jetzt das Punktprodukt zwischen n und p errechnest bekommst du den Abstand der Gerade vom Koordinatenursprung aus. Also: p*n=d. (p und n sind Vektoren, d ein Skalar).

Im 3 Dimensionalen ist das genau das Gleiche, nur das du eben eine Ebene beschreibst und keine Gerade. Was haben wir also:

n: der normierte Normalenvektor der Ebene
p: Vektor zu irgendeinem Punkt auf der Ebene
d: Abstand der Ebene zum Koordinatenursprung (>= 0)

Zitat von »"d00m"«


die parameter, v1, v2 und v3 beziehe ich immernoch auf die 3 ecken des dreiecks!
wo kommt nun aber a, b und c her.


v1, v2 und v3 sind drei Punkte die auf der Ebene liegen. Einen davon, und es ist ganz egal welcher, kannst du zum errechnen der Distanz (d) verwenden.

Und hier noch ein Artikel bei Wiki: http://de.wikipedia.org/wiki/Hessesche_Normalform
@D13_Dreinig

d00m

Frischling

  • »d00m« ist der Autor dieses Themas

Beiträge: 17

Wohnort: Bautzen

  • Private Nachricht senden

10

17.08.2007, 11:17

Also doch so:

Quellcode

1
2
3
4
5
6
7
8
Plane PlaneFromPoints(Vector& v1, Vector& v2, Vector& v3)
        {
            Plane temp;
            temp.vN.CrossProduct(v3-v2, v1-v2);
            temp.vN.NormNormalize();
            temp.SetD(-(v1.GetX()*vN.GetX() + v1.GetY()*vN.GetY() + v1.GetZ()*vN.GetZ()));
            return temp;
        }


hier die zusätzlichen funktionen, damits keine missverständnisse gibt:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Vector vN;
float  fD;
void SetD(float v) { fD=v; }

        Vector CrossProduct(Vector &v1, Vector &v2)
        {
            Vector result;
            result.x=v1.y*v2.z-v1.z*v2.y; 
            result.y=v1.z*v2.x-v1.x*v2.z; 
            result.z=v1.x*v2.y-v1.y*v2.x; 
            return result; 
        }

                Vector NormNormalize()
        {
            Vector v(x,y,z);
            return v/v.VectorLength();
        }

Werbeanzeige