2011-01-09 113 views
0

我在http://www.devmaster.net/articles/raytracing_series/part1.php學習射線追蹤,當我遇到這一段代碼來:光線跟蹤問題,如何將屏幕座標映射到世界座標?

void Engine::InitRender() 
{ 
// set first line to draw to 
m_CurrLine = 20; 
// set pixel buffer address of first pixel 
m_PPos = 20 * m_Width; 
// screen plane in world space coordinates 
m_WX1 = -4, m_WX2 = 4, m_WY1 = m_SY = 3, m_WY2 = -3; 
// calculate deltas for interpolation 
m_DX = (m_WX2 - m_WX1)/m_Width; 
m_DY = (m_WY2 - m_WY1)/m_Height; 
m_SY += 20 * m_DY; 
// allocate space to store pointers to primitives for previous line 
m_LastRow = new Primitive*[m_Width]; 
memset(m_LastRow, 0, m_Width * 4); 
} 

我在筆者地圖畫面如何協調世界座標相當混亂......
誰能告訴我作者如何派生這些線?
或告訴我如何將屏幕座標映射到世界座標?

// screen plane in world space coordinates 
m_WX1 = -4, m_WX2 = 4, m_WY1 = m_SY = 3, m_WY2 = -3; 

預先感謝您!

回答

1

編輯:這裏是raytracer.cpp相關代碼:

// render scene 
vector3 o(0, 0, -5); 

// initialize timer 
int msecs = GetTickCount(); 

// reset last found primitive pointer 
Primitive* lastprim = 0; 

// render remaining lines 
for(int y = m_CurrLine; y < (m_Height - 20); y++) 
{ 
    m_SX = m_WX1; 

    // render pixels for current line 
    for (int x = 0; x < m_Width; x++) 
    { 
     // fire primary ray 
     Color acc(0, 0, 0); 
     vector3 dir = vector3(m_SX, m_SY, 0) - o; 
     NORMALIZE(dir); 
     Ray r(o, dir); 
     float dist; 
     Primitive* prim = Raytrace(r, acc, 1, 1.0f, dist); 
     int red = (int)(acc.r * 256); 
     int green = (int)(acc.g * 256); 
     int blue = (int)(acc.b * 256); 
     if (red > 255) red = 255; 
     if (green > 255) green = 255; 
     if (blue > 255) blue = 255; 
     m_Dest[m_PPos++] = (red << 16) + (green << 8) + blue; 
     m_SX += m_DX; 
    } 

    m_SY += m_DY; 

    // see if we've been working to long already 
    if ((GetTickCount() - msecs) > 100) 
    { 
     // return control to windows so the screen gets updated 
     m_CurrLine = y + 1; 
     return false; 
    } 
} 

return true; 

因此相機在(0,0,-5)和其上的世界被投影屏幕具有左上角(-4,3,0)和右下角(4,-3,0)

+0

只是我,還是代碼總是看起來更清晰stackoverflow = = ... – 2011-01-10 01:30:53