2009-12-07 2 views
2

학교용 소프트웨어 래스터 라이저를 만들고 있는데, 기존의 매트릭스 계산 대신 비정상적인 렌더링 방법을 사용하고 있습니다. pinhole camera을 기반으로합니다. 나는 3D 공간에서 몇 가지 포인트를 가지고 있고, 나는 그와 카메라 사이의 거리를 복용하고이 나에게 카메라를 향해 방향 벡터를 제공 그것을핀홀 카메라 렌더링 시스템 최적화

Vec3 ray_to_camera = (a_Point - plane_pos).Normalize(); 

을 정상화 2D 화면 좌표로 변환합니다. 그런 다음 광선의 원점을 카메라에 배치하고 카메라 뒤의 평면과 광선 평면 교차를 수행하여 광선으로 그 방향을 전환합니다.

Vec3 plane_pos = m_Position + (m_Direction * m_ScreenDistance); 

float dot = ray_to_camera.GetDotProduct(m_Direction); 
if (dot < 0) 
{ 
    float time = (-m_ScreenDistance - plane_pos.GetDotProduct(m_Direction))/dot; 

    // if time is smaller than 0 the ray is either parallel to the plane or misses it 
    if (time >= 0) 
    { 
     // retrieving the actual intersection point 
     a_Point -= (m_Direction * ((a_Point - plane_pos).GetDotProduct(m_Direction))); 

     // subtracting the plane origin from the intersection point 
     // puts the point at world origin (0, 0, 0) 
     Vec3 sub = a_Point - plane_pos; 

     // the axes are calculated by saying the directional vector of the camera 
     // is the new z axis 
     projected.x = sub.GetDotProduct(m_Axis[0]); 
     projected.y = sub.GetDotProduct(m_Axis[1]); 
    } 
} 

이 기능은 훌륭하지만 궁금합니다. 알고리즘이 더 빨라질 수 있습니까? 지금은 장면의 모든 삼각형에 대해 3 개의 법선을 계산해야합니다. 그것도 매우 까다로운 될 것 빠른 상호 제곱근 근사 (1/sqrt(x))와

float length = 1/sqrtf(GetSquaredLength()); 
x *= length; 
y *= length; 
z *= length; 

.

내 질문은 다음과 같습니다.
세 법선을 근사하는 좋은 방법이 있습니까?
이 렌더링 기술은 무엇입니까?
센트 로이드의 법선을 사용하여 3 개의 꼭지점을 근사 할 수 있습니까? ((v0 + v1 + v2)/3)

미리 감사드립니다.

P. "이 분야의 전문가의 도움을 받아 앞으로 7 주 이내에 완벽한 기능의 소프트웨어 래스터 라이저를 만들 것입니다." 나는 내 교육을 경솔하다. :)

편집 :이 올바른 결과를 반환

Vec2 projected; 

// the plane is behind the camera 
Vec3 plane_pos = m_Position + (m_Direction * m_ScreenDistance); 

float scale = m_ScreenDistance/(m_Position - plane_pos).GetSquaredLength(); 

// times -100 because of the squared length instead of the length 
// (which would involve a squared root) 
projected.x = a_Point.GetDotProduct(m_Axis[0]).x * scale * -100; 
projected.y = a_Point.GetDotProduct(m_Axis[1]).y * scale * -100; 

return projected; 

그러나이 모델은 카메라 위치의 현재 독립적이다. :(

그것은 훨씬 짧고 빠른 생각의

+0

동료들과 함께 여기에있는 멋진 IGAD 학생들을 만나서 반갑습니다 :-) –

+0

핀홀 카메라 모델 동질적인 좌표를 가진 행렬 계산을 사용하여 종종 구현됩니다. 그럼 왜 그걸 사용하지 않니? –

답변

3

많은 중복 작업을 수행하는 것처럼 보이기 때문에 코드가하는 일을 정확히 이해하는 것은 어렵습니다! 난 당신이 당신이하려는 말을 이해한다면, 당신은 다음과 같습니다

  • 는 "
  • 그것을 정상화에 정규화 된 벡터를 따라 뒤쪽으로 돌출 점
  • 에 핀홀에서 벡터를 찾는 이미지 평면의 중심점에서이 점까지의 벡터를 찾는다. 결과에 점 제품을 사용하여 "축"벡터를 사용하여 x 및 y 화면 좌표를 찾는다.

위의 설명이 의도를 나타내는 경우 정규화는 중복되어야합니다. 전혀 수행하지 않아도됩니다. 정규화를 제거하면 나쁜 결과를 얻는다면 명시된 계획과 약간 다른 점을 알게 될 것입니다 ... 다른 말로하면 나와 함께 혼란스러워하고 정규화 단계가 테스트 케이스에서 충분히 좋아 보이지만, 여전히 원하는대로 수행하지는 못합니다.

전체적인 문제는 내부 루프에서 실행될 코드로 모든 상위 레벨 벡터 대수를 쓰고 있다는 것입니다. 이를 최적화하는 방법은 종이에있는 모든 벡터 대수학을 계산하고, 내부 루프에 대해 가능한 가장 간단한 표현을 찾아 카메라 설정 시간에 필요한 모든 상수를 사전 계산하는 것입니다. 핀홀 카메라 사양은 카메라 설정 루틴의 입력 일뿐입니다.

추측을 그리워하지 않는 한, 이것은 기존의 지루하고 오래된 행렬 계산으로 핀홀 카메라를 줄여야합니다. (광선 추적을하면 시원한 비표준 카메라 물건을 쉽게 만들 수 있습니다. 그러나 당신이 묘사하는 것은 완벽하게 표준이되어야합니다 ...)

+0

하! 당신 말이 맞아요, 정규화는 꽤 중복되었습니다.: P는 내가 가진 문제를 해결하지만 분명히 그것을 종이에 써 줄 것입니다. – knight666

4

이는 광선 추적라고 -!하고 흥미로운 구현 세부 정보를 많이 찾을 수 있습니다 - * 첫 번째 컴퓨터 그래픽 코스 다소 전형적인 과제 고전 폴리/반 당국이 교과서 (Computer Graphics Principes and Practice). 난 강력하게 당신이/구입이 교과서를 빌려주의 깊게 읽으십시오.

* 당신은 반사와 굴절에 시작 때까지 그냥 기다릴 ... 이제 재미가 시작된다!

+0

우리는 레이 트레이서 마지막 블록을 만들었습니다. raytracer에서 카메라의 광선을 세계로 추적하지 않습니까? – knight666

+0

맞습니다. 일반적인 광선 추적기는 꼭지점 대신 픽셀 단위로 이동합니다. 그러나 수학과 가능한 최적화가 매우 유사하다고 생각합니다. – Kena

+1

하나의 가능한 최적화는 SSE를 사용하여 4 개의 역 스퀘어 루트를 동시에 수행하는 것이지만, 실제로 알고리즘 최적화를 시도하기 전에이를 확인하고 싶습니다. – knight666

3

코드가 나에게 약간 불분명하다. (plane_pos?) 불필요한 계산을 생략했습니다.

광선을 표준화하는 대신 (길이 1로 스케일링) z 축척이 카메라에서 평면까지의 거리와 같도록 축척하지 않는 이유는 사실이 요소로 x 및 y의 크기를 조절하고, 너는 z를 필요로하지 않는다.

 
float scale = distance_to_plane/z; 
x *= scale; 
y *= scale; 

이것은 비행기의 x와 y 좌표를 나타내며, sqrt()는 점 제품이 아닙니다.

+0

원하는 경우 올바른 거꾸로 된 핀홀 효과를 위해 눈금을 음영에 맞 춥니 다. – cobbal

+0

또한 항상 z 축을 내려다 보는 것이 아니라면 카메라가 가리키는 방향으로 단위 벡터를 만들고 그 내적 점의 역수로 비율을 조정할 수 있습니다 벡터 및 포인트. 'camera_direction = (0, 0, 1)'일 때 psuedocode :'scale = distance_to_plane/(camera_direction. (x, y, z))' – cobbal

+0

. 이것은 렌더링 된 모든 요소에 대해 하나가 아닌 카메라 방향을 변경할 때마다 1 정규화 만 필요로하는 장점이 있습니다. – cobbal

0

박쥐에서 떨어져서, 프로그램을 시작할 때 모든 삼각형에 대한 법선을 계산할 수 있습니다.그런 다음 실제로 실행 중이면 법선에 액세스하면됩니다. 나중에 비용을 절약하기위한 이러한 종류의 시작 계산은 그래픽에서 많이 발생하는 경향이 있습니다. 이런 이유로 우리는 우리의 비디오 게임의 큰 선적 스크린이있다!