Kamera-Bewegung in Blickrichtung

Hallo
ich möchte in meinem Spiel(First Person Perspektive) die Kamera(also den Spieler) bewegen aber nicht entlang der Achsen sondern immer in Richtung des Blickes(Ergibt sich ja aus den Punkten Kameraposition und Kamerafokus), die sich auch verstellen lässt.Ich hatte schon einen Ansatz mit der Funktion, die berechnet wird aus den beiden schon genannten Punkten.Doch ließ sich die koordinate nicht richtig einsetzen, da ich bewegen wollte um 0.5 Längeneinheiten auf dem Graph(-> keine x- oder y-Angabe). Weiß jemand wie man so eine Bewegung berechnet ?

Ein bißchen wenig Infos. Üblicherweise ist sowas schon damit getan, eine Translation entlang einer bestimmten Achse (also in der Richtung, in der man “ursprünglich” guckt - bezogen auf das lokale Koordinatensystem des Spielers) von rechts an die Gesamt-Transformation dranmultipliziert…

In opengl ist es so, dass ich für die Kamera eine methode gluLookAt(Positionx, Positiony, Positionz, Fokusx, Fokusy, Fokusz, UpVektorx(irrelevant), UpVektory(irrelevant), UpVektorz(irrelevant)); Um sie zu bewegen brauche ich also diese beiden Ponkte: P1(Positionx, Poistiony, Positionz), P2(Fokusx, Fokusy, Focusz)
Aber wie berechne ich diese Punkte, die 0.5 Längeneinheiten von den ursprünglichen Punkten entfernt sein sollen ?

ich weiß nichts direkt zum Kamera-Thema, aber deine neue Frage und Skizze sieht ja nach grundlegender Mathematik aus,
da scheint sich reinzuquatschen zu lohnen

wenn ich es richtig erkenne hast du P1 und P2 bekannt, und suchst auf der Linie durch diese beiden Punkte neue Punkte?
bei der fehlenden Mathematik dazu sind die 3 Dimensionen zunächst noch etwas viel,
auf 2 gekürzt ist schon besser,

[noch leichter wird es mit nur einer Dimension:
P1 sei bei X=0, P2 bei X=100,
um 0.5 versetzt ist P1’ dann bei X=0.5, P2’ bei 100,5, nicht allzu schwer, aber lohnt sich immer etwas bewußt zu sein]

2D also, Vektorraum, Vektorrechnung,
an dieser Stelle hoffte ich eigentlich auf eine gute Übersicht im Netz zu verlinken,
aber gar nicht so viel allgemeines da, zumindest nicht sofort gefunden,

dann mal halber Mischmasch mit eigenen Gedanken, muss nicht die saubere Lehre sein:
Schritt 1:
http://www.virtual-maxim.de/abstand-berechnen-punkt-punkt/
Punkte haben Koordinaten, in 2D nur X und Y, zwischen zwei Punkten kann man die Differenz der Koordinaten berechnen,
nach Pythagoras bekommt man deren Abstand
(siehe Link, das muss bis zu diesem Zeitpunkt unbedingt verstanden sein)


Schritt 2:
wenn der Unterschied wie im Beispiel im Link (etwas unglücklich X und Y gleich) X-Differenz 3, Y-Different 3 mit Abstand ~4.24 ist,
dann kann man die Differenz als einen Vektor 3;3 mit Länge ~4.24 betrachten

für einen Vektor der Länge 0.5 nur dividieren, 3 / 4.24 /2 = ~0.35
würde man also von einen der beiden Punkte in X und Y-Richtung ~0.35 weitergehen hätte man einen Punkt auf der Linie zwischen den beiden Punkten, Abstand 0.5 entfernt

[teilt man den Vektor 3;3 genau durch seine Länge, kommt man die Länge 1, dann hat man ihn normalisiert,
ein ziemlich wichtiges Vektorkonzept, nebenbei angemerkt, schadet nicht zu wissen]


Schritt 3:
wenn das bisherige verdaut, verstanden, dann in 3D zu wechseln,
im Grunde alles dasselbe, für Längenberechung Pythagoras auf alle drei Koordinaten zu berechnen
http://www.ina-de-brabandt.de/vektoren/a/abstand-2p-in-r3.html

Noch was:
1.
Wenn die Steigung der Gerade anders ist, zum Beispiel negativ, dann verfälscht das doch das Ergebnis, oder ?
2.
Man kann außer nach vorne auch nach hinten, links und rechts steuern, das soll aber auch von der Blickrichtung abhängig sein, wie mach ich das ?

In beliebiger Dimensionalität funktioniert das so, ohne dass dabei Richtung oder sonst irgendetwas berücksichtigt werden muss (solange die Punkte [tex]P_1[/tex] und [tex]P_2[/tex] verschieden sind):
[ul][li]du erzeugst einen Vektor [tex]\vec a[/tex] von Punkt [tex]P_1[/tex] mit dem Ortsvektor [tex]\vec{p_1} = \begin{pmatrix}P_{11}\ P_{12}\ P_{13}\end{pmatrix}[/tex] nach [tex]P_2[/tex] mit dem Ortsvektor [tex]\vec{p_2} = \begin{pmatrix}P_{21}\ P_{22}\ P_{23}\end{pmatrix}[/tex]: [tex]\vec a = \begin{pmatrix}a_1\ a_2\ a_3\end{pmatrix} = \begin{pmatrix}P_{21}-P_{11}\ P_{22}-P_{12}\ P_{23}-P_{13}\end{pmatrix}[/tex][/li][li]du normierst den Vektor, indem du ihn mit dem Inversen seiner Länge multiplizierst: [tex]\vec{e_a} = \frac{1}{|\vec a|}\cdot\vec a = \frac{1}{\sqrt{a_1^2+a_2^2+a_3^2}}\cdot \vec a[/tex][/li][li]du errechnest die neuen Ortsvektoren, indem du ein vielfaches des normierten Vektors zu den alten Ortsvektoren hinzufügst: [tex]\vec{p_1’} = 0.5 \cdot \vec{e_a} + \vec{p_1}[/tex] und [tex]\vec{p_2’} = 0.5 \cdot \vec{e_a} + \vec{p_2}[/tex][/li][/ul]

Das ist eigentlich das, was @SlaterB in Worten geschrieben hat, noch einmal allgemein (zumindest, wenn man die komponentenweise Schreibweise weglässt) mathematisch aufgeschrieben.

Pythagoras ist vorzeichenunempfindlich,
in diesen Beispiel hat man im Gegensatz zu anderen (‘Steigung einer Geraden’ an sich z.B.) auch kein Problem mit direkt senkrechten/ waagerechten Linien in 2D, in 3D entsprechend

grundsätzlich also Entwarnung, konkrete (negative) Beispiele kannst du ja als guten Test selbst durchrechnen, bei Problemen genauer beschreiben

du musst natürlich etwas Orientierung haben, Abstand von Punkt A zu B bestimmen oder andersrum ist eine Entscheidung, dann das 0.5 fache draufaddieren oder abziehen,
Rechenweg so legen dass es so wie benötigt passt, einfach ein paar Beispiele durchrechnen,

edit: wenn du die Punkte in keiner besonderen Ordnung hast und Vorgabe ‘neuer Punkt dazwischen’, dann wäre darauf zu schauen ob z.B. Abstand positiv oder negativ ausgerechnet und je danach zu entscheiden

Bei cmrudolph beim Punkt 3, wie krieg ich da die Koordinaten aus dem Ortsvektor wieder raus, also die Koordinate an sich ?

wie ich schrieb: den Vektor zwischen den Punkten auf die Länge von z.B. 0.5 bringen, indem entsprechend verkürzt oder verlängert, im Beispiel ist ein 3;3-Vektor 4.24 lang, also durch 4.24 und durch 2, das ist mit jeder Koordinate einzeln zu machen,
diese Koordinatendifferenz dann zu einem Punkt dazuzählen, jeweils X und Y

Als Pseudocode:

class Vec { double x,y z; }

Vec p1 = ...
Vec p2 = ...

double dx = p2.x-p1.x;
double dy = p2.y-p1.y;
double dz = p2.z-p1.z;

double distance = Math.sqrt(dx*dx+dy*dy+dz*dz);
double dirX = dx / distance;
double dirY = dy / distance;
double dirZ = dZ / distance;

// Bewege beide Punkte um "alpha" nach vorne:
double alpha = 0.5;

p1.x += alpha * dx;
p1.y += alpha * dy;
p1.z += alpha * dz;

p2.x += alpha * dx;
p2.y += alpha * dy;
p2.z += alpha * dz;

Und wie geht das seitwärts, also wie in bild eins, bzw. bild zwei ?

Das Prinzip ist dasselbe. Die Veränderung an [tex]P_1[/tex] musst du auch an [tex]P_2[/tex] machen. Das sind die Zeilen 19 - 25 aus @Marco13 s Code. Auf der rechten Seite steht dann nur nicht alpha * dX, sondern der Unterschied zwischen den einzelnen Koordinaten.

Für “seitwärts” gibt es in 3D unendlich viele Möglichkeiten. In 2D könnte man einfach die Richtung (dirX und dirY) um 90° drehen:

double dirX = dy / distance;
double dirY = -dx / distance;

Ich verstehe noch nicht welche “dir-Berechnung” für welches der beiden Bilder da ist und außerdem ist die Seitwärtsbewegung immer anders, abhängig davon wohin die Blickrichtung ist.

zunächst muss das Problem eindeutig feststellen, was genau hast du gegebenen?
irgendeine Seitwärtsbewegung, dann sage ich dir, dass jeder neue Punkt in 3D die Kooridinaten (12, 13, 14) hat,
passt nicht? inwiefern, welche Bedingungen sind rechnerisch oder zumindest augenscheinlich gebrochen?

wie willst du eine bestimme Bewegung beschreiben? zwischen zwei Punkten ist eine exakte Linie denkbar, Abstand x ergibt einen exakten Punkt darauf,

in 2D kommt als ähnlich klare Seitwärtsbewegung noch die Senkrechte dazu, Lot bei Wikipedia

dazu sind die Berechnungen von Marco13 gedacht

ob genau senkrecht/ 90 Grad ist aus deinem Beispiel nicht zu sehen, und selbst wenn gäbe es dann in 3D eine ganze Lotebene,
da fehlt noch eine Richtungsangabe, was du vielleicht mit Blickrichtung meinst

was ist denn der exakte Unterschied der Bilder? außer dass für 2D recht gut die Senkrechte in die eine oder in die andere Richtung,

sind 3 Punkte aus den Beispielen gegeben?
die Diffenz zwischen zweien (etwa P1 und P1’) auf den dritten addieren?
ob mal wieder zu negieren usw., Bezug auf ungenaue Vorstellung ‚Blickrichtung‘ für deine Anwendung einfach an Beispielen austesten


niemand anders kann das entscheiden, du musst selber festlegen was du möchtest,
und wie IMMER UND ÜBERALL AUF DER WELT IN ALLEN THEMEN, DIMENSIONEN UND ZEITEN NÜTZLICH :wink: :
mit Beispiel-Zahlen exakte Ziele erkennbar, wo Worte (und sogar teils Bilder) nur begrenzt vollständig sind

Gut ich habs jetzt und überraschenderweise funktionierts richtig gut :wink: