Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi DirectX Vector zu Winkel? (https://www.delphipraxis.net/152713-directx-vector-zu-winkel.html)

Zacherl 2. Jul 2010 20:53

DirectX Vector zu Winkel?
 
Hey,

ich habe folgendes Problem. Ich möchte in einem DirectX Spiel die Kamera auf ein bestimmtes Objekt ausrichten. Dazu muss ich die Pitch und Yaw Werte der Kamera verändern. Jetzt habe ich allerdings nur folgende Werte:
* Vektor des Zieles (Wold Matrix denke ich mal)
* Kameravektor (View Matrix sollte das sein)

Ich habe es bisher so versucht:
Delphi-Quellcode:
function GetCameraVectorFromViewMatrix(Device: IDirect3DDevice9): TD3DXVECTOR3;
var
  View: TD3DXMATRIX;
begin
  FillChar(Result, SizeOf(TD3DXVECTOR3), #0);
  if (Device.GetTransform(D3DTS_VIEW, View) = D3D_OK) then
  begin
    Result.x := - View._41;
    Result.y := - View._42;
    Result.z := - View._43;
  end;
end;

function GetDirectionVector(StartVector, EndVector: TD3DXVECTOR3): TD3DXVECTOR3;
var
  Diff: TD3DXVECTOR3;
begin
  D3DXVec3Subtract(Diff, EndVector, StartVector);
  D3DXVec3Normalize(Result, Diff);
end;
Delphi-Quellcode:
  CameraVector := GetCameraVectorFromViewMatrix(Device);
  if (not TransformBone(
    Device, PlayerObject, Bone, TargetVector, false)) then Exit;
  DirectionVector := GetDirectionVector(CameraVector, TargetVector);
Dies sollte mir nach meinem Verständniss den Richtungsvektor von Camera zu Target liefern. Ich bin mir leider nicht sicher, ob das alles so stimmt und wie ich jetzt hierraus die Winkel bestimmen kann. DirectX ist für mich ein recht neues Gebiet deshalb bin ich für jede Hilfe und auch Erklärung dankbar!

Viele Grüße
Zacherl

Medium 2. Jul 2010 23:33

AW: DirectX Vector zu Winkel?
 
Die Matrizen sind keine Verktoren auf Dinge, sondern in denen steckt die Vorschrift, nach der Punkte auf ihrem Weg auf die 2D-Abbildung transformiert werden sollen. Die World-Matrix sagt dabei aus, was mit jedem Vertex der Welt schon mal vorab passieren soll (d.h. Verschiebung, Drehung und Verzerrung), und diese werden dann mit der View-Matrix auf eine Ebene abgebildet - eben dem Bild.

Während man aus der View-Matrix durchaus wieder die Kameraposition herausrechnen kann, klappt das mit der Welt-Matrix zu Objekt schon nicht mehr so unbedingt, da Objekte ja nicht zwangsläufig immer im Ursprung definiert sein müssen (sind sie meist, aber eben nicht zwangsweise), und oft wird für jedes Objekt eine separate World-Matrix verwaltet - die zuletzt verwendete ist daher eher selten zufällig die, die du willst.

Statt mir mit den Matrizen einen abzubrechen, würde ich mir viel eher die Kameraposition und die, des betreffenden Objektes separat mitführen, um dann daraus eine LookAt-Matrix basteln zu können. (Die sich eben aus Blickrichtungsvektor, Up-Vektor und FOV zusammensetzt.)


Edit: Achso, der Titel ist übrigens etwas irreführend. Du suchst an keiner Stelle irgendwelche Winkel ;)

Zacherl 3. Jul 2010 12:48

AW: DirectX Vector zu Winkel?
 
Also das Spiel um das es sich handelt, verwendet ganz sicher nur eine World Matrix. Ich habe aus dem Spiel halt nicht mehr Informationen rausziehen können und kann auch nicht direkt den Quelltext verändern.

Mir wurde gesagt, dass es mit den mir bekannten Werten klappen müsste. :)

Dem intern verwendetne Kameraobjekt im Spiel kann man nicht sagen "guck mal in diese Richtung (Vektor)", sondern nur "stell dich mal ein auf diese Position (in Winkeln Pitch & Yaw). Pitch und Yaw von der Kamera kann ich auch berechnen bzw. auslesen, fals das hilft.

Es geht jetzt darum, dass ich die Winkeldifferenz in horizontaler und vertikaler Richtung zwischen meiner aktuellen Blickrichtung und der Richtung in die ich die Kamera gucken lassen will berechnen kann. Nur mit diesen Werten kann ich ja die Kamera korrekt ausrichten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:14 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz