OldSchoolHack

Registrieren / Anmelden Deutsch

Source Engine WorldtoScreen

icon Thema: [Help] Source Engine WorldtoScreen

Anmeldungsdatum: Mai 2011

Beiträge: 419

Benutzer-Bewertung:

199 positiv
8 negativ
Die ViewMatrix lässt sich im Speicher ziemlich einfach finden:

TEXT Code:
  1. ViewMatrix[3][3] == -1 * KameraPosition.X , wenn ViewAngle == { 0, 0, 0}
  2. ViewMatrix[3][3] == -1 * KameraPosition.Y , wenn ViewAngle == { 0, 90, 0}

So habe ich in Dota 2 ziemlich schnell eine ViewMatrix gefunden: client.dll + 0x13393AC (float [4][4])(03:02, 25.07.15)



Allerdings legt dir Dota noch ein paar Steine in den Weg..

http://abload.de/img/dota_viewportp1o0k.png

Nur innerhalb des roten Rechtecks hat das Game einen Viewport, wenn du die
ViewMatrix auf die volle Fenstergröße anwendest, wirst du verzerrte ergebnisse bekommen...

Das kann man aber Quick&Dirty fixen

CPP Code:
  1. ScreenOffset.x = 0;
  2. ScreenOffset.y = WindowSize.cy / 25.f + 0.5f;
  3.  
  4. ScreenSize.height = WindowSize.cy * 0.8038411f;
  5. ScreenSize.width = WindowSize.cx;

Problem solved

CPP Code:
  1. bool WorldToScreenMatrix::WorldToScreen(Vector& Position3D, D2D1_POINT_2F& ScreenPos)
  2. {
  3. float x, y, w;
  4.  
  5. w = this->W2SMat[3][0] * Position3D.x + this->W2SMat[3][1] * Position3D.y + this->W2SMat[3][2] * Position3D.z + this->W2SMat[3][3];
  6.  
  7. if (w <= 0) return false;
  8.  
  9. x = this->W2SMat[0][0] * Position3D.x + this->W2SMat[0][1] * Position3D.y + this->W2SMat[0][2] * Position3D.z + this->W2SMat[0][3];
  10. y = this->W2SMat[1][0] * Position3D.x + this->W2SMat[1][1] * Position3D.y + this->W2SMat[1][2] * Position3D.z + this->W2SMat[1][3];
  11.  
  12. float invw = 1.0f / w;
  13.  
  14. x *= invw;
  15. y *= invw;
  16.  
  17. ScreenPos.x = ((float)(this->ScreenSize.width)  / 2.f) + (0.5f * x * (float)(this->ScreenSize.width)  + 0.5f);
  18. ScreenPos.y = ((float)(this->ScreenSize.height) / 2.f) - (0.5f * y * (float)(this->ScreenSize.height) + 0.5f);
  19.  
  20. ScreenPos.x += ScreenOffset.x;
  21. ScreenPos.y += ScreenOffset.y;
  22.  
  23. return true;
  24. }

und schon ist die Dota 2 World-To-Screen Funktion fertig

mfg Dr_Pepper

__________________

http://abload.de/img/signaturmitoshlogos2ufb.jpg
http://abload.de/img/pfeila4uzk.png Da unten ist ein Like-Button, benutze ihn doch
3 positiv
0 negativ
Dieser Beitrag wurde bewertet von:
zZzeta/S (Sa 25. Jul 2015, 03:21), KN4CK3R (Sa 25. Jul 2015, 15:01), radiocity (Mi 23. Dez 2015, 18:00)