perspective 원근표현
2023. 2. 9. 13:12ㆍ컴퓨터 그래픽스/그래픽 알고리즘 및 표현
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 |