본문 바로가기

C Language

등각법(isometric) 과 원근법(perspective) 계산

등각법 Isometric view

다음 공식은 3D 공간의 점을 2D 평면에 30° 기울어진 등각 투영으로 변환하는 방법을 나타냅니다:

  1. x 좌표 변환:
    • (x - y) * cos(30°): 이는 x축과 y축을 30° 회전시키는 효과를 줍니다.
    • x와 y의 차이에 cos(30°)를 곱하여 수평 방향의 압축을 만듭니다.
  2. y 좌표 변환:
    • (x + y) * sin(30°): x와 y의 합에 sin(30°)를 곱하여 수직 방향의 압축을 만듭니다.
    • z를 빼는 것은 높이를 반영하여 3D 효과를 줍니다.

이 변환으로 인해:

  • 모든 축이 동일하게 축소됩니다 (약 86.6%).
  • 축 간 각도가 120°가 되어 등각 효과를 만듭니다.
  • 깊이감이 생기면서도 평행선은 평행을 유지합니다.

결과적으로, 3D 객체가 2D 평면에 입체감 있게 표현됩니다

 

perspective veiw 원근법

이 함수는 3D 공간의 선을 2D 평면에 원근 투영(perspective projection)하는 역할을 합니다. 각 부분을 상세히 설명하겠습니다:
함수 선언:
c
static void perspective(t_line *line)
static으로 선언되어 이 파일 내에서만 사용 가능합니다.
t_line 구조체 포인터를 매개변수로 받아 직접 수정합니다.

 

변수 선언:
c
t_point new_start;
t_point new_end;
double z;
변환된 좌표를 저장할 임시 변수들과 z 좌표를 위한 변수를 선언합니다.

 

X축 회전:
c
rotate_x(line, 3 * -ANG_45);
선을 X축을 기준으로 -135도(3 * -45도) 회전시킵니다.

 

시작점 변환:
c
z = line->start.z + line->transform_z;
new_start.x = line->start.x / z;
new_start.y = line->start.y / z;
z 좌표에 transform_z를 더해 깊이를 조정합니다.

 

x와 y 좌표를 z로 나누어 원근감을 만듭니다 (멀리 있는 물체가 작아 보이는 효과).
시작점 업데이트:
c
line->start.x = new_start.x;
line->start.y = -new_start.y;
계산된 새 좌표로 원래 점을 업데이트합니다.
y 좌표를 반전시켜 화면 좌표계에 맞춥니다.

 

끝점 변환:
c
z = line->end.z + line->transform_z;
new_end.x = line->end.x / z;
new_end.y = line->end.y / z;
시작점과 동일한 방식으로 끝점을 변환합니다.

 

끝점 업데이트:
c
line->end.x = new_end.x;
line->end.y = -new_end.y;
계산된 새 좌표로 원래 끝점을 업데이트합니다.

 

스케일 조정:
c
scale(line, line->transform_z);
변환된 선의 크기를 transform_z에 따라 조정합니다.
주요 포인트:
원근 투영은 물체의 깊이(z 좌표)에 따라 크기가 변하는 효과를 만듭니다.
X축 회전을 통해 시점을 조정합니다.
z 좌표로 나누는 것이 원근감을 만드는 핵심입니다.
y 좌표를 반전시켜 일반적인 화면 좌표계(위가 음수, 아래가 양수)에 맞춥니다.
최종적으로 스케일을 조정하여 화면에 적절히 표시되도록 합니다.
이 함수를 통해 3D 공간의 선이 2D 화면에 원근감 있게 투영됩니다.

'C Language' 카테고리의 다른 글

카메라 초기 설정  (0) 2025.02.01
선 좌표 초기화와 z축의 의미  (0) 2025.02.01
그레디언트 컬러 표현 알고리즘  (0) 2025.01.28
bresenham 알고리즘 설명  (0) 2025.01.28
정규화를 위한 z의 최소값 지정  (0) 2025.01.28