Mose Handling - Managed DirectX
-
Hi, bin noch neu mit DirectX.
Ich will einen kleinen Shooter zu Testzwecken schreiben und meine Frage ist nun:
Wie wird das Mouse Handling/Look berechnet. Gibts da ne Formel oder sogar ne Methode in Direct3D(Wohl eher nicht).
Damit mein ich dem Typischen Shooter Mouselook den glaub ich fast jeder kennt.und wie wird wird das dann gehandhabt wenn ich in ne richtung schau und per Key::W in diese richtung laufen will.
also einfach in die Richtung laufen in die man gerade sieht. Keyboardstates abfragen ist kein Problem, aber in die Richtung laufen in die man gerade schaut doch wohl eher...wäre sehr dankbar für ne kleine hilfestellung
-
eine methode dafür gibts soweit ich weiß nicht. du musst halt selbst berechnen, wie weit sich deine maus bewegt hat und diesen wert mit deiner aktuellen kameraposition verrechnen (die kamera ist bei einem egoshooter ja der spieler selbst quasi).
schau dir mal diese funktion an: D3DXMatrixLookAtLH
damit kannst du auch direkt nach dem drücken der w taste die "kameraposition" und die "lookat"-werte verändern und hast somit eine einfache bewegung.soweit erstmal...
-
danke für die Antwort erstmal,
Es geht mir hauptsächlich darum:
Das Richtingsobjekt ist ja eigentlich ein eigenes Object, und dieses soll sich ja immer bei der Kamera bewegen, oder um die Kamera rum.
Wenn ich jetzt die Mausbewegung (Relativ vom letzten Frame) auf die Richtung übertrage, also zum beispiel nur auf der X Achse, dann bewegt sich das Richtungs objekt von mir weg. Also dreh ich mich nicht sondern ich schau nur nach rechts/links weiter in die ferne.
Und diese Formel/berechnung brauch ich.
-
also irgendwie versteh ich das ganze glaube ich nicht richtig. meiner meinung nach funktioniert ein einfacher egoshooter folgendermaßen:
du hast ein spielerobjekt, welches du nicht siehst (oder nur ein gewehr oder sowas). das objekt ist zb einfachheitshalber eine box. sie hat genau die gleiche position wie die kameraposition (siehe funktion aus meinem letzten post). drückst du zb w oder a, wird das objekt nach vorne oder links verschoben (siehe folgende funktion: D3DXMatrixTranslation). dementsprechend musst du auch die kameraposition und den punkt, wo die kamera hinschaut ändern.
bewegst du die maus nach rechts, sollte sich der spieler, also das spielerobjekt (unsere box) und die kamera drehen - stichwort rotation. wenn man davon ausgeht, dass deine welt in y-richtung nach oben zeigt, wäre es zb folgende funktion: D3DXMatrixRotationY. hierbei ist zu beachten, dass bei der kamera nur der punkt, an den die kamera hinguckt, rotiert, also angepasst werden muss. die box sollte natürlich auch rotiert werden.also ganz allgemein, such dir tutorials zum thema translation, rotation und kamera an.
-
also tut´s und bücher hab ich, nur steht zwar alles über die ganzen methoden wie Projection Matrix, World und View Matrix, aber nichts darüber wie das gehandhabt wird mit sonem Shooter Mouse Handling.
Ich hab das probiert mit den Methoden, aber irgentwie stell ich mich warscheinlich nur dumm an
-
Ich hab das probiert mit den Methoden, aber irgentwie stell ich mich warscheinlich nur dumm an
Kein Problem, aller Anfang ist schwer
..dann zeig doch mal, was Du schon hast und wo Du nicht weiterkommst, dann finden sich hier bestimmt auch einige, die Dir auf die Sprünge helfen
-
hab ich erwähnt das ich C++/CLI programmiere?
-
Lern lieber erst noch etwas Mathematik. Wenn du es noch nicht schaffst die Kamera auszurichten und dich vorwaerst zu bewegen, dann scheiterst du bei Kollisionsabrage o.ae. sowieso. f'`8k
AutocogitoGruß, TGGC (Das kommt gut)
-
Also,
die Methode der Kamera:
public: void SetupCamera(){ gDevice->Transform->Projection = Matrix::PerspectiveFovLH(Math::PI/4, this->Width/this->Height, 1.0, 500.0); gDevice->Transform->View = Matrix::LookAtLH(Vector3(Pos_X, Pos_Y, Pos_Z ), /*Position*/ Vector3(Look_X, Look_Y, Look_Z), /*Richtung*/ Vector3(0.0, 1.0, 0.0) /*Oben*/ ); }
und die Mausabfrage:
public: void TestMouseMove(){ mDevice->Acquire(); mState = mDevice->CurrentMouseState; Look_X += mState->X/16.0000; Look_Y -= mState->Y/16.0000; Look_Z += mState->Z/80.0000; }
Wenn ich jetzt die Maus bewege, bewege ich nur das Richtungs objekt an irgenteine Position und nicht um die Kamera rum.
Die MethodeMatrix::RotateX(angle);
dreht zwar die Kamera, aber so das man nix mehr erkennt.
-
wegen "TGGC":
jaa... Mathe war noch nie so ganz mein ding, ich brauch ja nur die Formel das sich das Object um die Kamera dreht...
-
Ich für meinen Teil habe noch nicht ganz durchschaut, was Du genau machst..
Wenn Du die Maus abfragst und die LookAt Werte änderst, musst Du danach natürlich die Kamera auch aktualisieren, sonst ändert sich ja nichts (wobei aus Deinem Posting meiner Meinung nach nicht herauskommt, ob Du das tust oder nicht). Also rufst Du deine
gDevice->Transform->View = Matrix::LookAtLH(Vector3(Pos_X, Pos_Y, Pos_Z ), /*Position*/ Vector3(Look_X, Look_Y, Look_Z), /*Richtung*/ Vector3(0.0, 1.0, 0.0) /*Oben*/ );
Funktion nochmal nach der TestMouseMove() auf.
So, und was meinst du genau mit "Richtungs objekt"? Ist das der Vektor, der die Kamera-LookAt Werte enthält oder Deine "Spielerbox"?
-
Die Funktionen werden bei jedem Frame aufgerufen, also immer kamera setzen und immer Maus Testen...
Den Ganzen Source kann ich net reinstellen, des sind mehrere hundert zeilen schon.
und richtung ist halt die richtung, also der zweite vector..