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

1

15.04.2008, 18:10

Normalenvektor, sehe ich das richtig?

Ich ärgere mich schon seit Tagen mit dem Thema des Normalenvektors herum, und langsam weiß ich echt nicht mehr weiter! Ich demonstriere euch mal ein Bild, das zeigen soll, was ich mir im moment unter einem Normalenvektor vorstelle (Den Normalenvektor den ich benötige um licht ins dunkel zu bringen^^):


(Link)


a, b und c sind die Eckpunkte des Dreiecks, die haben natürlich einen Vector3, aso x,y und z jeweils! d, e und f sind die mittelpunkte der strecken. e ist also beispielsweise der mittelwert aus AB. und n, bzw dort wo sich die drei grünen linien kreuzen ist der Normalenvektor! habe ich das soweit richtig verstanden?

BlackSnake

Community-Fossil

Beiträge: 1 549

Beruf: Student

  • Private Nachricht senden

2

15.04.2008, 18:35

wenn du einen surfacevektor haben möchtest, ist das soweit richtig. du kannst aber auch den vektor an alle drei eckpunkte knallen. kommt bei der lichtberechnung auf das selbe hinaus, aber es ist einfacher den zu ermitteln, anstatt das ding in der mitte.

um die vektoren an den eckpunkten zu bekommen, musste einfach folgendes machen:

C-/C++-Quelltext

1
2
3
vec3 faceA = a - b;
vec3 faceB = c - b;
vec3 normal = normalize(cross(faceA, faceB));

den bekommenden vektor setze einfach auf jeden eckpunkt. jetzt haste nen surfacevektor. ;)

3

15.04.2008, 18:45

C-/C++-Quelltext

1
2
3
vec3 faceA = a - b;
vec3 faceB = c - b;
vec3 normal = normalize(cross(faceA, faceB)); 


Das ist alles? Mehr muss ich nicht berechnen? Lol, und damit ärgere ich mich tage lang herum? Ich versteh die Welt nicht mehr xD

Aber ich habe irgent wie das gefühl das es im Praktischen gleich nicht funktionieren wird^^, am besten du blibst noch nen Weilchen online xD

4

15.04.2008, 18:55

Ok da habe ich gleich ne frage! In dem Beispiel-Code, "a" ist jetzt wie in der zeichnug der Eckpunkt oder? Und der besteht ja aus drei Werten, bzw einem Vector3, richtig?

5

15.04.2008, 19:09

Och man, beim ersten blick auf den Code dachte ich jetzt hab ichs, aber nein, ich habs nicht! Da kommt jetzt noch so viel auf mich zu.

Ich liste mal die probleme auf:

1: Aus drei Eckpunkten bildet sich ein dreieck. Das ordnen nimmt mir das zeichnen ab. Aber wie mache ich nun, das er den Normalenvektor nur an den drei eckpunkten des dreiecks setzt, und nicht an drei Eckpunkten die in einer Rheie liegen.


2: die Funktion normalize und cross werden bei mir nicht gehfunden, was muss ich denn includen?

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

6

15.04.2008, 19:22

Ein gut gemeinter Rat: Schau dir mal ernsthaft lineare Algebra an. Ein Normalvektor wird NIEMALS einem Punkt im Raum zugeordnet. Er gibt lediglich eine Richtung an. Damit befinden sich alle Normalvektoren auf der Einheitskugel (Normalize!). Der Normalvektor für ein Dreieck wird so berechnet, dass er in jene Richtung zeigt, welche normal, sprich senkrecht, zur Ebene des Dreiecks steht.

normalize und cross sind keine Standardfunktionen. Die TriBase hat aber eben diese Funktionen implementiert, heißen aber anders. tbVector3Cross und tbVector3Normalize glaub ich. Normalize normalisiert einen Vektor --> Einheitkugel und Cross berechnet das Kreuzprodukt. Falls dir das alles nichts sagt, google sofort nach passenden Tutorials. Es gibt sie wie Sand am Meer.
Wenn du das nicht schaffst, wirst du in der Spieleprogrammierung wahrlich nicht weit kommen.

Bitte fass meinen Post nicht als Beleidigung, sondern als gut gemeinten Rat auf.
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

7

15.04.2008, 19:28

Nene, ist schon richtig was du sagst! Habe mitlerweile auch nen paar Sachen selber heraus gefunden, habe aus begeisterung und frust wohl zu schnell Fragen gestellt ohne vorher drüber nach zu denken!

8

15.04.2008, 19:39

Zitat

Damit befinden sich alle Normalvektoren auf der Einheitskugel

That's strange! Ich kann mir zwar vorstellen, welches Bild du im Kopf hast, aber es ist schlichtweg falsch. Desweiteren moechte ich auf den Unterschied zwischen Normalisieren und Normalenvektor hinweisen. Normalenvektoren muessen nicht die Laenge Eins ( 1 ) haben. Auch koennen sie ueberall im Raum sein. Verschiebt man sie, so bleiben sie dennoch gleich, obwohl sie anderswo im Raum sind.

rklaffehn

Treue Seele

Beiträge: 267

Wohnort: Braunschweig

  • Private Nachricht senden

9

16.04.2008, 07:12

Ich möchte hier auch noch ein paar Punkte in die Runde werfen:

1) viele Leute haben Schwierigkeiten mit Vektoren, weil sie die entweder als Punkt oder als Richtung interpretieren. Vektoren sind aber beides. Normalenvektoren fallen in die Kategorie Richtung, genau wie die Seiten deines Dreieck.

2) Eigentlich müssten Normalenvektoren "Orthogonalenvektoren" heißen, da sie prinzipiell jede Länge haben können. Wenn man sie auch noch normalisiert, wären es "Orthonormalenvektoren." Macht aber leider keiner, und so kommt es da gerne zu Verwirrungen. Für die meisten Fälle braucht man sie aber ohnehin normalisiert, so dass man das meist auch im Namen nicht mehr explizit erwähnt.

3) Orthogonal bedeutet einfach, dass die Richtung senkrecht zu einer anderen Richtung ist. Mathematisch geschrieben bedeutet das: A othogonal zu B <==> A * B = 0. (alles Vektoren; damit ist der Nullvektor automatisch orthogonal zu allen anderen Vektoren!)

4) Für den 3D Fall mit einem Dreieck spricht man vom Normalenvektor, wenn dieser senkrecht zu allen drei Seiten ist. (wenn es kein entartetes Dreieck ist, reichen eigentlich schon zwei Seiten) Damit ist er automatisch senkrecht zu allen Richtungen, die zwischen beliebigen Punkten innerhalb des Dreiecks auftreten können.

5) Zum Zeichnen braucht man Orte. wenn man also den Orthogonalenvektor eines Dreiecks zeichnen will, lässt man ihn üblicherweise in der Mitte des betrachteten Dreiecks starten und zeichnet bis zu einem zweiten Punkt der in Richtung des Orthogonalenvektors erreicht wird. Man kann aber genausogut in jeden Eckpunkt so einen Vektor ankleben.
God is real... unless declared integer.
http://www.boincstats.com/signature/user_967277_banner.gif

Black-Panther

Alter Hase

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

10

16.04.2008, 11:48

Zitat von »"knivil"«

Zitat

Damit befinden sich alle Normalvektoren auf der Einheitskugel

That's strange! Ich kann mir zwar vorstellen, welches Bild du im Kopf hast, aber es ist schlichtweg falsch. Desweiteren moechte ich auf den Unterschied zwischen Normalisieren und Normalenvektor hinweisen. Normalenvektoren muessen nicht die Laenge Eins ( 1 ) haben. Auch koennen sie ueberall im Raum sein. Verschiebt man sie, so bleiben sie dennoch gleich, obwohl sie anderswo im Raum sind.


Du hast mich falsch verstanden. WORAUF man sie bezieht ist schlichtweg egal, doch was ich meinte ist, dass sie egal, ob man sie auf Punkt A oder B bezieht, immer gleich ausschauen und als RICHTUNG zu intepretieren sind. Was die Länge der Normalvektoren betrifft, so meinte ich eigentlich den Bereich der Spieleprogrammierung, wo sie die Länge eins haben müssen. In anderen Bereichen weiß ich ehrlich gesagt nicht ob nicht normalisierte Vektoren, überhaupt NORMALvektoren genannt werden dürfen!?
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Werbeanzeige