2011-01-09 2 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

EDIT :

// 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)를 갖는다 : 여기 raytracer.cpp의 관련 코드는 .

+0

나만인가, 아니면 항상 stackoverflow = =에서 코드가 더 선명하게 보입니까? –