OldSchoolHack

Register / Login English

Falsche World2Screen Berechnung


icon Falsche World2Screen Berechnung #1

Join Date: Sep 2011

Posts: 11

Hi,
ich habe mal mit den von CS:S "bereitgestellten" X,Y,Z Koordinaten und Pitch / Yaw für alle Spieler versucht, die 3D Koordinate eines Gegners zu einer 2D Koordinate für den Bildschirm umzurechnen.
Folgende Funktion habe ich (teilweise) erstellt:
CPP Code:
  1. D3DXVECTOR3 *World2Screen(LPDIRECT3DDEVICE9 pDevice, D3DXVECTOR3 &vScreenCoord, D3DXVECTOR3 vEnemy)
  2. {
  3. if( !pDevice ) return NULL;
  4.  
  5. D3DXMATRIX matProj;
  6. float fAspect = (float)(1280) / 720;
  7. D3DXMatrixPerspectiveFovRH(&matProj, (float)(D3DX_PI/180*90), fAspect, 0.1, -1);
  8.  
  9. float *pX = (float*)(*(DWORD*)(Base)+0x60);
  10. float *pY = (float*)(*(DWORD*)(Base)+0x68);
  11. float *pZ = (float*)(*(DWORD*)(Base)+0x64);
  12. float *pitch = (float*)(*(DWORD*)(Base)+0x6C);
  13. float *yaw = (float*)(*(DWORD*)(Base)+0x70);
  14.  
  15. D3DXVECTOR3 vEye ( *pX, *pY, *pZ);
  16. D3DXVECTOR3 vTarget ( *pX + *yaw, *pY + (*pitch * -1), *pZ);
  17. D3DXVECTOR3 vUp ( 0, 0, 1 );
  18. D3DXMATRIX matView;
  19. D3DXMatrixLookAtRH( &matView, &vEye, &vTarget, &vUp);
  20.  
  21. D3DVIEWPORT9 viewPort;
  22. D3DXMATRIX identity;
  23.  
  24. pDevice->GetViewport( &viewPort );
  25. D3DXMatrixIdentity( &identity );
  26.  
  27. D3DXVec3Project(&vScreenCoord, &vEnemy, &viewPort, &matProj, &matView, &identity );
  28.  
  29. if(vScreenCoord.z < 1)
  30. return &vScreenCoord;
  31.  
  32. return NULL;
  33. }

Die Berechnung ist absolut falsch, seht selbst:

http://img7.imagebanana.com/img/z4bk0r00/fu1.png
http://img6.imagebanana.com/img/l03mfttv/fu2.png

Irgendwelche Ideen, oder CS:S spezifische Funktionen  ;o ?

Danke.

icon #2

Join Date: Aug 2007

Posts: 8646

User-Rating:

199 positive
33 negative
am einfachsten ist es World to Screen von der Engine zu benutzen, das passt immer. Ob man bei CSS deine Methode überhaupt anwenden kann, weiß ich nicht.

CPP Code:
  1. class Engine
  2. {
  3. public:
  4. virtual void function1() = 0;
  5. virtual void function2() = 0;
  6. virtual void function3() = 0;
  7. virtual void function4() = 0;
  8. virtual void function5() = 0;
  9. virtual void function6() = 0;
  10. virtual void function7() = 0;
  11. virtual void function8() = 0;
  12. virtual bool GetPlayerInfo(int ent_num, player_info_t *pinfo) = 0;
  13. virtual int GetPlayerForUserID(int userID) = 0;
  14. virtual void function9() = 0;
  15. virtual bool Con_IsVisible() = 0;
  16. virtual int GetLocalPlayer() = 0;
  17. virtual void function10() = 0;
  18. virtual void function11() = 0;
  19. virtual void function12() = 0;
  20. virtual void function13() = 0;
  21. virtual void function14() = 0;
  22. virtual void function15() = 0;
  23. virtual void function16() = 0;
  24. virtual void function17() = 0;
  25. virtual int GetMaxClients() = 0;
  26. virtual void function18() = 0;
  27. virtual void function19() = 0;
  28. virtual void function20() = 0;
  29. virtual void function21() = 0;
  30. virtual bool IsInGame() = 0;
  31. virtual void function22() = 0;
  32. virtual void function23() = 0;
  33. virtual void function24() = 0;
  34. virtual void function25() = 0;
  35. virtual void function26() = 0;
  36. virtual void function27() = 0;
  37. virtual void function28() = 0;
  38. virtual void function29() = 0;
  39. virtual void function30() = 0;
  40. virtual float* WorldToScreenMatrix() = 0;
  41. };
  42.  
  43. bool ScreenTransform(Vector &point, Vector &screen)
  44. {
  45. float w;
  46. float *WorldToScreen = engine->WorldToScreenMatrix(); //hier bekommste von der Engine die WorldToScreenMatrix
  47. screen.x = WorldToScreen[0] * point.x + WorldToScreen[1] * point.y + WorldToScreen[2] * point.z + WorldToScreen[3];
  48. screen.y = WorldToScreen[4] * point.x + WorldToScreen[5] * point.y + WorldToScreen[6] * point.z + WorldToScreen[7];
  49. w = WorldToScreen[12] * point.x + WorldToScreen[13] * point.y + WorldToScreen[14] * point.z + WorldToScreen[15];
  50. screen.z = 0.0f;
  51.  
  52. bool behind = false;
  53.  
  54. if (w < 0.001f)
  55. {
  56. behind = true;
  57. }
  58. else
  59. {
  60. behind = false;
  61. float invw = 1.0f / w;
  62. screen.x *= invw;
  63. screen.y *= invw;
  64. }
  65. return behind;
  66. }
  67. //---------------------------------------------------------------------------
  68. bool WorldToScreen(Vector &vOrigin, Vector &vScreen)
  69. {
  70. if (ScreenTransform(vOrigin, vScreen) == false)
  71. {
  72. int iScreenWidth = gui.Viewport.Width, iScreenHeight = gui.Viewport.Height;
  73.  
  74. float x = iScreenWidth / 2;
  75. float y = iScreenHeight / 2;
  76. x += 0.5 * vScreen.x * iScreenWidth + 0.5;
  77. y -= 0.5 * vScreen.y * iScreenHeight + 0.5;
  78. vScreen.x = x;
  79. vScreen.y = y;
  80. return true;
  81. }
  82. return false;
  83. }

greetz KN4CK3R

__________________

Hallo
icon #3

Join Date: Sep 2011

Posts: 11

Hallo KN4CK3R,
danke für Deine Antwort.

Wie binde ich das denn genau ein? Ich habe mal provisorisch die Source SDK exportiert, Includes, Libs, etc mit dem Compiler verknüpft. Ich habe den cdll_int.h includiert, damit sind schonmal Fehler wie 'undeclared identifier player_info_t' verschwunden. Der nächste Fehler wäre jetzt
TEXT Code:
  1. cannot convert from 'const VMatrix' to 'float *'
beim WorldToScreenMatrix holen. Wenn ich die originale ScreenTransform Methode aus der SDK benutze, erhalte ich folgenden Fehler:
TEXT Code:
  1. binary '[' : 'const VMatrix' does not define this operator or a conversion to a type acceptable to the predefined operator
Und das 12 mal.

Irgendwie bekomme ich das nicht ganz gebacken. Hilfestellung erwünscht
Vielen Dank!
icon #4

Join Date: Aug 2007

Posts: 8646

User-Rating:

199 positive
33 negative
ich benutze bei meiner Engine Klasse nicht das SDK, weil mir da zuviel drin ist, was ich nicht brauche.

CPP Code:
  1. typedef void* (*CreateInterfaceFn)(const char *name, int *returnCode);
  2.  
  3. CreateInterfaceFn CaptureFactory(char *FactoryModuleName)
  4. {
  5. CreateInterfaceFn ret = NULL;
  6.  
  7. while (!ret)
  8. {
  9. HMODULE FactoryModule = GetModuleHandleA(FactoryModuleName);
  10.  
  11. if (FactoryModule)
  12. ret = reinterpret_cast<CreateInterfaceFn>(GetProcAddress(FactoryModule, "CreateInterface"));
  13.  
  14. Sleep(10);
  15. }
  16.  
  17. return ret;
  18. }
  19. //---------------------------------------------------------------------------
  20. void *CaptureInterface(CreateInterfaceFn Fn, char *InterfaceName)
  21. {
  22. unsigned long *ret = NULL;
  23.  
  24. while (!ret)
  25. {
  26. ret = reinterpret_cast<unsigned long*>(Fn(InterfaceName, NULL));
  27. Sleep(10);
  28. }
  29.  
  30. return ret;
  31. }
  32.  
  33. ...
  34.  
  35. Engine *engine;
  36.  
  37. CreateInterfaceFn engineInterface = CaptureFactory("engine.dll");
  38. engine = (cEngine*)CaptureInterface(engineInterface, "VEngineClient013");
  39.  
  40. ...
  41.  
  42. float *WorldToScreen = engine->WorldToScreenMatrix();

greetz KN4CK3R

__________________

Hallo
icon #5

Join Date: Sep 2011

Posts: 11

Vielen Dank, es funktioniert

Nur noch eine Frage. Die Koordinaten des Gegners werden bei mir erst richtig und vor allem regelmäßig berechnet, wenn das Spiel diesen "rendert".
Also so:
http://img6.imagebanana.com/img/t2exn0j8/off.png
http://img7.imagebanana.com/img/yb4yxem6/imba.png

Gibt es einen Trick, wie man die Koordinaten richtig und regelmäßig updaten kann, auch wenn der Gegner nicht "gerendert" ist? Oder einfach eine andere Addresse?

Das hab ich mir mit CE gesaugt: "client.dll"+0x5AAAC8 und dann eben + pI*0x140 + offset
icon #6

Join Date: Aug 2007

Posts: 8646

User-Rating:

199 positive
33 negative
nein, die BaseEntity Klasse (die du benutzt indirekt) wird nur aktuallisiert, wenn ein Model mehr oder weniger sichtbar ist. Aus der Radar Klasse kann man in dem Fall die Positionen auch noch auslesen, aber dort wird nur jede Sekunde einmal aktuallisiert. Das ist aber immerhin noch brauchbarer, wie gar keinen ESP anzuzeigen.

greetz KN4CK3R

__________________

Hallo
icon #7

Join Date: Sep 2011

Posts: 11

Schaut doch sexy aus. Danke nochmal!

http://img7.imagebanana.com/img/3jmrzhwa/asd.png
icon #8

Join Date: Aug 2007

Posts: 8646

User-Rating:

199 positive
33 negative
was meinst du mit "kann man das fixen"?

greetz KN4CK3R

__________________

Hallo
icon #9

Join Date: Sep 2011

Posts: 11

Sonderzeichen werden so kryptisch dargestellt
Vermutlich die Konvertierung?
icon #10

Join Date: Aug 2007

Posts: 8646

User-Rating:

199 positive
33 negative
ja, die namen der Spieler stehen in einem char[] sind aber eigentlich wchar_t... 8)
kannst du mit MultiByteToWideChar umwandeln

greetz KN4CK3R

__________________

Hallo