DirectX: ViewMatrix richtig einstellen.

xaitech

Mitglied
Hallo,
wie stelle ich die ViewMatrix so ein, dass mich immer um einen bestimmten Punkt drehe?
Also nehmen wir z.B. "new Vector3(-32.007011f, 1.386353f, 10.628818f)".
Um diesen Punkt möchte ich mich mit der Maus (x-und y-) drehen können(quasi im Kreis), sodass aber immer der besagte Punkt zu sehen ist.

Danke

Gruß,
xai
 

Sunray

Erfahrenes Mitglied
Hehe... ich habe da ein recht ähnliches Problem.

In meiner Anwendung werden sämtliche Objekte im 3D-Raum durch Actors repräsentiert. Ein Actor hat eine Position, eine Ausrichtung (in Winkeln yaw, pitch, roll gespeichert), Geschwindigkeit, Rotation, Masse usw.

Das gilt auch für den Camera Actor. Das Problem ist nun: Wie komme ich von den Ausrichtungswinkeln auf die ViewMatrix.

Mir ist schon klar, dass ich Matrix.LookAtLH verwenden muss, nur wie komme ich an den LookAt- und den Up- Vektor?

Der LookAt Vektor müsste irgendwas in der Form Camera.PositionVector + Camera.DirectionVector, wobei DirectionVector yaw und pitch repräsentiert. (Eben nur die Richtung, aber nicht die Drehung um die Z-Achse)

Hier: CUnit -> MDX Tutorials -> Camera habe ich ein Tutorial zur Erstellung einer First-Person Kamera gefunden. Nur leider kann ich es nicht auf mein Problem anwenden, da in meinem Fall die View-Matrix nicht mit der Kamera gespeichert wird. (Und ich verstehe den Code/die Mathematik dahinter nicht so ganz :-( )
Es muss doch mathematisch eindeutig möglich sein, aus der Position und der Ausrichtung in Winkeln die entsprechende Matrix zu berechnen....
 
Zuletzt bearbeitet:

xaitech

Mitglied
Hallo Sunray,
ja mit LookAtLH und so weiter eier ich hier auch schon eine ganze Zeit rum...aber das MDX Tutorial werde ich mir mal reinziehen, danke dafür! Ich habe hier ein anderes DirectX+C# Projekt liegen, in dem man sich mit der "First-Person" Kamera bewegt. Ansich müsste es damit ein leichtes sein, sich um einen fixen Punkt zu drehen.
Ich hoffe mal, dass sich bis ins nächste Jahr...in 3 Tagen :) noch wer mit einem Lösungsweg findet.

Guten rutsch,
xai
 

Sunray

Erfahrenes Mitglied
Ich habe eine Lösung für mein Problem gefunden!
Code:
public static Vector3 CreateDirection(float yaw, float pitch)
{
	Vector3 v = new Vector3(0, 0, 1);
	v.TransformCoordinate(Matrix.RotationYawPitchRoll(yaw, pitch, 0));
	return v;
}

public static Vector3 CreateUp(float pitch, float roll)
{
	Vector3 v = new Vector3(0, 1, 0);
	v.TransformCoordinate(Matrix.RotationYawPitchRoll(0, pitch, roll));
	return v;
}
Mit diesen Funktionen kommst du von Winkeln zu den für Matrix.LookAtLH benötigten Vektoren. Alles, was jetzt noch zu tun ist, wäre das Einstellen der Kamera. In deinem Fall musst du die Kamera Position einfach noch ein wenig auf der negativen Z-Achse der Ausrichtung bewegen.
Code:
Vector3 obj = new Vector3(-32.007011f, 1.386353f, 10.628818f);
Vector3 direction = CreateDirection(yaw, pitch);
Vector3 up = CreateUp(pitch, roll);
float distance = 5; //Distanz zu deinem Punkt

Vector3 camera = obj + (distance * (- direction));

device.Transform.View = Matrix.LootAtLH(camera, direction, up);
Ich habe das allerdings nicht ausprobiert.
 

xaitech

Mitglied
Ja cool,
was muss ich denn für yaw, pitch und roll angeben?
Guck mir den Rest sonst morgen etwas genauer an.

Danke erstmal,
xai
 

Sunray

Erfahrenes Mitglied
Yaw, Pitch und Roll sind die Winkel der Orientierung, wobei Yaw für die horizontale Drehung, Pitch für auf- und ab und Roll für die Neigung steht.
Achtung: diese Winkel sind im Bogenmass!

Wenn du automatisch um den Punkt drehen willst, musst du den Wert eines Winkels einfach immer weiter erhöhen. Wenn du die Rotation mit der Maus kontrollieren willst, musst du die relative Bewegung der Maus verglichen mit den letzten Frame nehmen (DirectInput) oder berechnen (Windows.Forms). Diese relativen Koordinaten kannst du dann als Änderung der Yaw/Pitch Winkel anwenden...

Allerdings aufgepasst: Winkel sind zyklisch. Ein Winkel von 370° ist in Wahrheit nur 10°. Desgleichen ist 2.2*Pi eigentlich 0.2*Pi. Wenn du also direkt die Mauskoordinaten verwendest, wird sich nicht viel bewegen.
 

xaitech

Mitglied
Sunray hat gesagt.:
Yaw, Pitch und Roll sind die Winkel der Orientierung, wobei Yaw für die horizontale Drehung, Pitch für auf- und ab und Roll für die Neigung steht.
Achtung: diese Winkel sind im Bogenmass!

Wenn du automatisch um den Punkt drehen willst, musst du den Wert eines Winkels einfach immer weiter erhöhen. Wenn du die Rotation mit der Maus kontrollieren willst, musst du die relative Bewegung der Maus verglichen mit den letzten Frame nehmen (DirectInput) oder berechnen (Windows.Forms). Diese relativen Koordinaten kannst du dann als Änderung der Yaw/Pitch Winkel anwenden...

Allerdings aufgepasst: Winkel sind zyklisch. Ein Winkel von 370° ist in Wahrheit nur 10°. Desgleichen ist 2.2*Pi eigentlich 0.2*Pi. Wenn du also direkt die Mauskoordinaten verwendest, wird sich nicht viel bewegen.

Jane,
ist klar. Hab bloss die Umrechung ins Bogenmaß vergessen!
Hmm, hiermit:
Code:
x+=0.2f;
			//this.device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI/4, this.device.PresentationParameters.BackBufferWidth/this.device.PresentationParameters.BackBufferHeight, 1.0f, this.meshRadius*3 + z);
			Vector3 obj = new Vector3(-32.007011f, 1.386353f, 10.628818f);
			Vector3 direction = CreateDirection(Geometry.DegreeToRadian(x), 0.0f);
			Vector3 up = CreateUp(0.0f, 0.0f/*roll*/);
			float distance = 10; //Distanz zu deinem Punkt

			Vector3 camera = obj + (distance * (- direction));

			device.Transform.View = Matrix.LookAtLH(camera, direction, up);

drehe ich mich zwar um meinen Punkt(Vector3(-32.007011f, 1.386353f, 10.628818f)), aber die Kamera guckt in eine andere Richtung.
Ich wollte doch, dass ich mich um den Punkt drehe und Ihn dabei immer in Blickrichtung habe....oder habe ich noch was vergessen? :confused:

Gruß,
xai
 

Sunray

Erfahrenes Mitglied
ah... moment.

Ich glaub ich hatte da was nicht verstanden. Ok... Versuch mal bei Matrix.LookAtLH anstelle von direction direkt deinen Punkt einzusetzen... Dann sollte die Kamera den angucken...