2016-07-01 11 views
0

Я пытаюсь создать камеру качания лучей в DirectX11 с помощью XMVector3Unproject(). По моему мнению, я буду проходить в позиции (Vector3) пикселя на ближней плоскости и в отдельном вызове - соответствующую позицию на дальнем плане. Тогда я бы вычитал эти векторы, чтобы получить направление луча. Тогда происхождение будет непроектированной координатой на ближней плоскости. Моя проблема здесь вычисления координат луча будет принят в.Как рассчитать положение луча камеры для использования с XMVector3Unproject(), DirectX11?

Пример

// 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*** 
     } 
    } 

Надеюсь, я правильно понять это. Любая помощь в определении происхождения луча или исправлений была бы весьма признательна.

ответ

0

В соответствии с the documentation функция XMVector3Unproject дает координаты луча, который вы предоставили в пространстве камеры (координаты нормализованного устройства), в пространстве объектов (с учетом вашей модельной матрицы).

Для создания своих камер лучи, вы считаете вашу камеру крошечное отверстие (весь свет проходит через одну точку, которая является вашей камеры (0, 0, 0), то вы выбираете направление луча. Предположим, вы хотите создать W*H камеры лучи, ваш цикл может выглядеть следующим образом

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); 
    } 
} 

Вы также можете захотеть взглянуть на this link, который звучит интересно