3D-vektoren zu 2D-vektoren?

10/01/2013 17:29 varien#1
Hallo, kann mir jemand kurz und knapp die Formel zur Umrechnung von 3D-Koordinaten zu 2D-Bildschirm-Koordinaten geben? Evtl. auch mit Erklärung, warum die so und so geht?
Ich schreibe das hier in dieses Forum, weil ich mehrere Parameter hab: Fov, (x,y,z der Vektors), kameraposition, kamerawinkel & fenstergröße(D.h. breite x höhe)

Ich habe schon gegoogelt, allerdings, muss ich ganz ehrlich sagen, habe ich den Wikipedia-Artikel dazu nicht verstanden. Leider hatte ich Vektorenumrechnung auch noch nicht in der Schule.


Danke im Vorraus :-)
10/01/2013 21:43 Shadow992#2
Quote:
Originally Posted by varien View Post
Hallo, kann mir jemand kurz und knapp die Formel zur Umrechnung von 3D-Koordinaten zu 2D-Bildschirm-Koordinaten geben? Evtl. auch mit Erklärung, warum die so und so geht?
Ich schreibe das hier in dieses Forum, weil ich mehrere Parameter hab: Fov, (x,y,z der Vektors), kameraposition, kamerawinkel & fenstergröße(D.h. breite x höhe)

Ich habe schon gegoogelt, allerdings, muss ich ganz ehrlich sagen, habe ich den Wikipedia-Artikel dazu nicht verstanden. Leider hatte ich Vektorenumrechnung auch noch nicht in der Schule.


Danke im Vorraus :-)
Das war zwar ursprünglich für einen hack geschrieben, lässt sich aber auf dein Problem anwenden, da ich auch beschrieben habe, wie man die Z Koordinate in der Ebene darstellt.

Aber ohne Vektorrechnungkentnisse wird das eher nichts:

[Only registered and activated users can see links. Click Here To Register...]
10/01/2013 22:35 varien#3
Vielen Dank. Genau das habe ich gesucht.
10/01/2013 23:09 .SkyneT.#4
Ich weiß den genauen Wortlaut der Funktion nicht auswendig,
aber DirectXMath sollte da etwas parat haben.

Wie das genau funktioniert kannst du in Wikipedia, etc. nachschlagen.
10/01/2013 23:22 varien#5
Ich möchte gerne auf Libs verzichten.
1. Weil es ein Haufen Arbeit ist diese Libs in Visual Basic zu bringen
2. Weil ich das Prinzip verstehen möchte und es in ein paar Rechenoperationen sowieo getan ist
10/02/2013 18:33 Master674b#6
Quote:
Originally Posted by varien View Post
Ich möchte gerne auf Libs verzichten.
1. Weil es ein Haufen Arbeit ist diese Libs in Visual Basic zu bringen
2. Weil ich das Prinzip verstehen möchte und es in ein paar Rechenoperationen sowieo getan ist
Kannst einfach bei MSDN nachschauen, wie sich die Matrizen zusammensetzen. Die Umrechnung des Vektors ist dann einfach das Produkt der Matrizen mal den Welt-Positions-Vektor.

Wieso etwas dies und jenes ist, wird da aber nicht erklärt. Da steht einfach dort wie sich die Matrix zusammensetzt.
10/03/2013 01:18 varien#7
Die Grundformel kann man fast überall nachlesen. Nur ich habe keine Ahnung, wie man dann Field of View usw. einrechnet.
10/03/2013 07:29 freeskier4lif3#8
The basic function to take a 3D point in space and convert it into 2D screen space is:

Code:
vec2 getVec2(vec3 point3D, mat4x4 viewMatrix,
                 mat4x4 projectionMatrix, int width, int height) 
{

      mat4x4 viewProjectionMatrix = projectionMatrix * viewMatrix;
      //transform world to clipping coordinates
      vec3 = viewProjectionMatrix.multiply(point3D);
      int winX = (int) Math.round((( point3D.getX() + 1 ) / 2.0) *
                                   width );
      //we calculate -point3D.getY() because the screen Y axis is
      //oriented top->down 
      int winY = (int) Math.round((( 1 - point3D.getY() ) / 2.0) *
                                   height );
      return new vec2(winX, winY);
}
So, from the data you have listed above you are missing two critical pieces, the projectionMatrix and view Matrix.

To Calculate the ProjectionMatrix use this function:

Code:
mat4x4 ProjectionMatrix(const float near_plane, // Distance to near clipping plane
                        const float far_plane,  // Distance to far clipping plane
                        const float fov_horiz,  // Horizontal field of view  angle, in radians
                        const float fov_vert)   // Vertical field of view angle, in radians
{
    float    h, w, Q;

    w = (float)1/tan(fov_horiz*0.5);  // 1/tan(x) == cot(x)
    h = (float)1/tan(fov_vert*0.5);   // 1/tan(x) == cot(x)
    Q = far_plane/(far_plane - near_plane);

    mat4x4 ret;
    ZeroMemory(&ret, sizeof(ret));

    ret(0, 0) = w;
    ret(1, 1) = h;
    ret(2, 2) = Q;
    ret(3, 2) = -Q*near_plane;
    ret(2, 3) = 1;
    return ret;
}
And Lastly, you can calculate the viewMatrix simply by taking the inverse of the Camera Position transform.
10/03/2013 12:59 varien#9
inverse of the Camera Position transform?
What does that mean? I'm really new to vectors. What exactly do i have to calculate?
10/03/2013 15:19 freeskier4lif3#10
The easiest way would be just to use DirectX or OpenGL (glu) functions to invert the matrix. D3DXMatrixInverse & gluInvertMatrix respectively

However, this page has the math behind it. [Only registered and activated users can see links. Click Here To Register...]
10/03/2013 19:14 MrSm!th#11
Warum sträubst du dich gegen Libs wie DX? Wenn du mit Grafiken/Spielen arbeitest, ist die doch sowieso vorhanden - warum dann nicht nutzen?
Implementierst du auch Sinus und Cosinus selbst, oder wie?
10/03/2013 20:04 Master674b#12
Quote:
Originally Posted by MrSm!th View Post
Warum sträubst du dich gegen Libs wie DX? Wenn du mit Grafiken/Spielen arbeitest, ist die doch sowieso vorhanden - warum dann nicht nutzen?
Implementierst du auch Sinus und Cosinus selbst, oder wie?
D3DX sollte man nicht mehr benutzen. Ist offiziell deprecated. Gegen DirectXMath (DirectXTK) spricht aber nichts.

Quote:
Originally Posted by MSDN
Note The D3DX (D3DX 9, D3DX 10, and D3DX 11) utility library is deprecated for Windows 8 and is not supported for Windows Store apps.
10/03/2013 22:45 varien#13
Ich möchte ja nicht selber ein Spiel programmieren, sondern einen Wallhack schreiben.
Warum ich kein DX benutze?
Ich möchte keine ganze Lib für nur eine Funktion implementieren. Außerdem möchte ich das System dahinter verstehen.
10/03/2013 22:49 freeskier4lif3#14
The specific "D3DX9/10/11" libs are deprecated in Win8. However the replacement is DirectXMath here [Only registered and activated users can see links. Click Here To Register...]

Reference for conversion of functions: [Only registered and activated users can see links. Click Here To Register...]

Just because the libraries are officially deprecated does not mean they cannot be used if you are developing on a platform with the specific SDK. The reason for this deprecation is the simple fact that with DX11 Microsoft declared DirectX complete and the deprecation is not much more than a name change for the library in it's now "complete" form.
10/04/2013 00:06 MrSm!th#15
Von D3DX sprach ich auch nicht spezifisch, das bezog sich eher auf Libs im Allgemeinen :x

Quote:
Originally Posted by varien View Post
Ich möchte ja nicht selber ein Spiel programmieren, sondern einen Wallhack schreiben.
Warum ich kein DX benutze?
Ich möchte keine ganze Lib für nur eine Funktion implementieren. Außerdem möchte ich das System dahinter verstehen.
Wie machst du den Wallhack ohne DirectX? Die Lib ist doch sowieso eingebunden, wenn das Spiel sie nutzt.
Verstehen ist eine Sache, aber dafür muss man ja nicht im fertigen Hack das Rad neu erfinden.
Wie gesagt, implementierst du etwa auch Sinus selbst, damit du nicht für nur eine Funktion <math> einbinden musst?