2016-07-01 19 views
0

Ich versuche, eine Ray-Casting-Kamera in DirectX11 mit XMVector3Unproject() zu erstellen. Nach meinem Verständnis werde ich die (Vektor3) Position des Pixels auf der nahen Ebene und in einem separaten Aufruf eine entsprechende Position auf der fernen Ebene übergeben. Dann würde ich diese Vektoren subtrahieren, um die Richtung des Strahls zu erhalten. Der Ursprung wäre dann die Unprojected-Koordinate auf der nahen Ebene. Mein Problem hier ist der Ursprung des Strahls Berechnung in weitergegeben werden.Wie berechnet man die Position des Kamera-Strahls für die Verwendung mit XMVector3Unproject(), DirectX11?

Beispiel

// assuming screenHeight and screenWidth are the number of pixels. 
    const uint32_t screenHeight = 768; 
    const uint32_t screenWidth = 1024; 

    struct Ray 
    { 
     XMFLOAT3 origin; 
     XMFLOAT3 direction; 
    }; 

    Ray rays[screenWidth * screenHeight]; 

    for (uint32_t i = 0; i < screenHeight; ++i) 
    { 
     for (uint32_t j = 0; j < screenWidth; ++j) 
     { 
      // 1. ***calculate and store the current pixel position on the near plane*** 
      // 2. ***calculate the corresponding point on the far plane*** 
      // 3. ***pass both positions separately into XMVector3Unproject() (2 total calls to the function)*** 
      // 4. ***store the returned vectors' difference into rays[i * screenWidth + j].direction*** 
      // 5. ***store the near plane pixel position's returned vector into rays[i * screenWidth + j].origin*** 
     } 
    } 

Hoffentlich ich das richtig bin zu verstehen. Jede Hilfe bei der Bestimmung der Strahlenursprünge oder Korrekturen würde sehr geschätzt werden.

Antwort

0

Gemäß the documentation gibt Ihnen die Funktion XMVector3Unproject die Koordinaten eines Strahls, den Sie im Kameraraum bereitgestellt haben (Normalisierte Gerätekoordinaten), im Objektraum (bei Ihrer Modellmatrix).

Kamera Strahlen zu erzeugen, Sie als Ihre Kamera Pinhole (alle das Licht durch einen Punkt, der (0, 0, 0) Ihre Kamera ist, dann wählen Sie Ihre Strahlrichtung. Lassen Sie sagen, Sie W*H Kamera strahlen, Ihre Schleife könnte generieren möchten so aussehen

Vector3 ray_origin = Vector3(0, 0, 0); 
for (float x = -1.f; x <= 1.f; x += 2.f/W) { 
    for (float y = -1.f; y <= 1.f; y += 2.f/H) { 
     Vector3 ray_direction = Normalize(Vector3(x, y, -1.f)) - ray_origin; 
     Vector3 ray_in_model = Unproject(ray_direction, 0.f, 0.f, 
             width, height, znear, zfar, 
             proj, view, model); 
    } 
} 

Sie könnten auch einen Blick auf this link haben wollen, die interessant

klingt