Laden...

Fläche senkrecht zur Kamera ausrichten.

Erstellt von tripplec vor 11 Jahren Letzter Beitrag vor 11 Jahren 2.568 Views
T
tripplec Themenstarter:in
7 Beiträge seit 2012
vor 11 Jahren
Fläche senkrecht zur Kamera ausrichten.

Hallo,
Ich bin in meinem Mathe Unterricht nie so weit vorgestoßen.
Daher ist meine Frage wie ich eine Fläche (Quadrat) so ausrichte, dass sie mit der vollen Fläche zur Kamera zeigt.
gegeben ist der Position der Kamera, die Look-at-Position, die Seitenlänge der Fläche. Die Position der Fläche sei am Koordinaten-Ursprung.

so weit ich das bisher verstanden habe, ist der Vektor der Kamera gleichzeitig auch der Normalvektor der Fläche.
Im Prinzip bräuchte ich wohl 'nur' die Umkehrfunktion von 'Normalize' 😉.

Ich hoffe mein Problem genau genug beschrieben zu haben.

5.657 Beiträge seit 2006
vor 11 Jahren

Im Prinzip bräuchte ich wohl 'nur' die Umkehrfunktion von 'Normalize'

Was genau meinst du damit? Was soll denn diese Umkehrfunktion machen, außer dem Vektor eine beliebige andere Länge zu geben? Was du brauchst, ist eine Plane-Klasse mit einem Konstruktor, der als Parameter die Flächennormale und einen Punkt auf der Fläche erwartet.

Die Flächennormale ist die umgekehrte (!) Blickrichtung der Kamera, den Punkt auf der Fläche kannst du dir ausrechnen, wenn du weißt, wie weit die Fläche von der Kamera entfernt sein soll.

Christian

Weeks of programming can save you hours of planning

T
tripplec Themenstarter:in
7 Beiträge seit 2012
vor 11 Jahren

Ja, so war es gemeint.
Ich bin wie gesagt, nicht so mit der Vektoren & Matrizen-Rechnung vertraut.

Wie sähe denn so eine Plane-Klasse aus, das ist ja eigentlich das Problem.

Edit: Die Entfernung ist in soweit bekannt, weil die Fläche am Koordinatenursprung sein soll.

5.657 Beiträge seit 2006
vor 11 Jahren

Hi tripplec,

wenn du mit Vektor-Rechnung nicht vertraut bist, dann wäre es jetzt ein guter Zeitpunkt, sich damit auseinanderzusetzen. Für die Plane-Klasse kannst du dir u.a. mal diese Implementierung anschauen. Aber je nachdem, welches Framework du verwendest, wird sicherlich so eine Klasse schon vorhanden sein.

Christian

Weeks of programming can save you hours of planning

T
tripplec Themenstarter:in
7 Beiträge seit 2012
vor 11 Jahren

Jo, damit auseinandersetzen ...
Das sachste so in dein jugendlichen Leichtsinn 😉

Du hast mir aber sehr gut geholfen mit dem Link.
Meistens finde ich ja auch was ich suche.
Diesmal habe ich wohl die falschen Suchbegriffe benutzt.

Danke nochmals.

ach so: ich probiere gerade mit xna ein wenig herum.

5.657 Beiträge seit 2006
vor 11 Jahren

Das hat nichts mit Leichtsinn zu tun, eher damit, sich das Leben leichter zu machen 😃
XNA hat übrigens eine eigene Plane-Klasse, aber ich glaube da fehlt der Konstruktor, den du benötigst. Wenn du dir allerdings anschaust, wie die Ebenen-Parameter in der Beispiel-Implementierung berechnet werden, kannst du es auch mit der XNA-Klasse lösen.
Christian

Weeks of programming can save you hours of planning

T
tripplec Themenstarter:in
7 Beiträge seit 2012
vor 11 Jahren

So, natürlich hat mich der Link dann doch nicht weitergebracht.
Ich glaube ich bin dann doch etwas überfordert.
Wenn mir jemand die Lösung zeigt ist das Verstehen meist kein Problem mehr.

Allerdings habe ich die optimale Funktion gefunden.
Da ich meine Objekte im 3d-Raum sowieso schon über Translationfunktion positioniert habe, ist der Unterschied zur CreateBillboard-Funktion kaum ein unterschied.

effect.World = Matrix.CreateBillboard(new Vector3(S.XPos, S.YPos, S.ZPos), camPos, Vector3.Up, null);

Das was die Graphik-Karten Heutzutage schaffen ist ja wohl schon ein absoluter Wahnsinn.
Meine Grafikkarte ist auch nicht mehr die jüngste: NVidia 9800 GTX.
Ich habe das auch noch nicht auf die Spitze getrieben, aber 12000 kleine Objekte finde ich schon ganz schön viel - ruckelfrei.
Und das klappt sogar, wenn ich statt der 2d-Objekte Kugeln mit 128 Verticen nehme.

M
29 Beiträge seit 2011
vor 11 Jahren

Es gibt keine Lösung ohne Grundlagenwissen in Matritzen/Vektoren.

Vor allem hast du zu wenige Angaben für eine wirkliche Lösung gemacht - insbesondere was die Ausrichtung betrifft.

Wie soll das am Ende aussehen? Soll die Fläche wirklich im Raum stehen? Das heißt - soll man auf die Fläche zugehen können und sie wird größer?

Wenn nicht, wenn die Fläche z.B. wie bei nem Flugsimulator das Cockpit sein soll, dann kannst du die World,View und Proj. Matrix auf die Identitätsmatrix setzen und zeichnest quasi direkt im Bildschirmraum.

Soll die Fläche sich drehen lassen, oder soll sie immer gleich ausgerichtet sein (ich rede von der Drehachse durch die Kamera!)?
Ich habe für eine Visualisierung des Sternenhimmels mal Sterne zeichnen müssen. Das habe ich so gelöst, dass jeder Stern ein Vertex war. Den habe ich der Grafikkarte übergeben und den Rest mit Shadern gelöst. Dort habe ich um jeden Punkt mittels GeometryShader ein Quadrat erzeugt.

Oder willst du dass die Fläche parallel zum Aufvektor der Kamera ausgerichtet ist, das heißt lediglich in einer Achse zur Kamera schaut?
Dann ist es sehr einfach. Das Kreuzprodukt zweier Vektoren liefert dir die Senkrechte darauf. Du hast den Aufvektor und den Vektor zur Kamera. bildest darauf das Kreuzprodukt. Mittelpunkt der Fläche + Aufvektor und Mittelpunkt der Fläche + oben berechneter Vektor ergeben dann die Ebene, die 4 Punkte kannst du dann einfach bestimmen.

Soll die Fläche auf 2 Drehachsen zur Kamera ausgerichtet sein gehst du so vor (x=Kreuzprodukt):

  1. Vektor zur Kamera x beliebiger Vektor (nicht der selbe oder vielfaches wie Vektor zur Kamera)
  2. Vektor zur Kamera x Vektor aus 1.

Vektor aus 1. und 2. ergeben dann 2 Vektoren in der Ebene. Dummerweise hast du damit keine Orientierung um die Normale der Fläche.