perspective 원근표현

2023. 2. 9. 13:12컴퓨터 그래픽스/그래픽 알고리즘 및 표현

 

https://honglab.co.kr/

 

honglab

About Jeong-Mo Hong 약력 2020-2021 인스타그램 소프트웨어 엔지니어 2008-2019 동국대학교 컴퓨터공학과 부교수 2005-2007 스탠포드대학교 전산과 박사,연구원 2002-2005 고려대학교 전산학 박사 1996-2002 KAIST

honglab.co.kr

위의 수업을 바탕으로 공부한 자료입니다.

 

원근법을 표시할 때 우리는 가까운 것이 더 크게 먼 것이 더 작게 표현하게 된다.

그러면 해당 현상을 표현하기 위해 필요한 것이 무엇이 더 가까운지에 대한 것과 가까운 것은 크고, 먼 것은 작게 표현하는 것이다.

 

해당 그림을 보면 같은 크기의 나무가 거리만 다른 것을 볼 수 있는데 눈을 따라가면 크기를 조절해주지 않아도 크기가 다르게 보이는 것을 알 수 있다.

 

여태 해왔던 ray tracing에서 perspective방식은 픽셀 하나당 같은 방향벡터를 가진 orthogonal perspective 였는데 해당 방법을 구현하기 위해서는 perspective projection을 이용해야 한다.

 

perspective projection은 눈의 위치를 따로 두고 눈에서 각 픽셀로의 벡터를 방향벡터로 갖는 것이다.

물체의 가까움, 먼 정도는 어떻게 구현할까

 

물체로 쏜 ray가 충돌할때 항상 물체와 ray를 쏜 곳에서의 거리가 최소인 곳을 정해서 return 주면 된다.

// 스도코드 가장 가까운 충돌지점 찾기
hit findCloestCollision(ray)
{
	float min_distance = 100000000; // 대충최대float값
	for(i = 0; i < object.size(); i++)
    {
    	set var_hit // 충돌지점과 거리를 갖는 변수
        if(hit.d >= 0) // 거리가 0이상이여야 충돌
        {
        	if(min_distance > hit.d)
            {
            	min_distance = hit.d;
                cloest_hit = hit;
            }
            
        }
    }
    return cloest_hit;
}
/* 충돌지점은 raytrace 함수 내에서 설정해준다고 가정 그리고 색까지 바꿔주는 함수이다
매개변수로 ray를 받아서 원근 표현에 이용한다, ray 클래스에서 점과 방향벡터를 받음
pixels 는 각 32bit의 rgba 값을 가진 vec4짜리 vector or 배열이다 */
void render(pixels)
{
	vec3 eyePosition(0.0f,0.0f,-1.5f); // 눈 위치 고정
    
    for(int j = 0; j < height; j++){ // 각 픽셀에 접근
    	for(int i = 0; i < width; i++)
        {
        	Ray rayPixel = {pixelPositon, pixelPosition - eyePosition;} // perspective projection 방향벡터
            pixels[j* width + i] = vec4(Raytrace(rayPixel), 1.0); // 각 픽셀마다 원근 표현을 해줌
        }
    }
}

'컴퓨터 그래픽스 > 그래픽 알고리즘 및 표현' 카테고리의 다른 글

Rasterization 원 그리기  (0) 2023.02.22
Rasterization  (0) 2023.02.15
Phong shading 을 이용한 물체의 표현  (0) 2023.02.05
Drawing Sphere 구 그리기  (0) 2023.02.05
좌표계 변환  (0) 2023.02.04