Skip to content

C++, OpenGL API와 GLSL 쉐이더를 기반으로 3D 뷰잉(카메라) 변환과 충돌 방지 기능 구현, 퐁 라이팅, 고라드 쉐이딩, 알파 블렌딩, rim 라이팅 등의 다양한 효과를 구현하였습니다.

Notifications You must be signed in to change notification settings

jinnyleeis/ComputerGraphics-OpenGL_3D_Viewing-Lighting_Effects

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

62 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Table of Contents


Keyboard Controls

다음 키보드 입력으로 각 기능을 제어할 수 있습니다:

설명
1 / 2 CAT Gouraud / Phong Shading
N / L 텍스처 필터 Nearest / Linear
3 월드 광원 ON/OFF
4 카메라 고정 광원 ON/OFF
5 Tiger 헤드라이트(모델링 좌표계 광원) ON/OFF
6, +, − 20‑면체 블렌딩 토글 & 알파 조절
7 / 8 Dragon Lava / Ironman Fresnel
← / → / ↑ / ↓ Wolf 이동 (Main Camera 추적 대상 이동)
A / D Main Camera 좌/우 둘러보기 (leftRight)
W / S Main Camera 위/아래 보기 (upDown)
Q / E Main Camera 머리 기울이기 (headTilt)
Z / X Main/CCTV-D 확대(Z) 또는 축소(X) (Zoom In/Out)
V / B CCTV-D 카메라 FOV 세밀 조정
0 Main ↔ CCTV‑D 전환
Y 카메라 축(Frame) 표시 토글
Esc 프로그램 종료

1.OpenGL API 3D 뷰잉

요구사항 구현 요약

요구사항 항목 구현 여부
(a)i) 정적 기하 물체 5개 이상 배치 ✔️
(a)ii) 동적 기하 물체 2개 이동 구현 (Tiger & Spider) ✔️
(b)i) 주 카메라 축 이동 ✔️ Wolf 추적
(b)ii) 주 카메라 축 회전 (Yaw/Pitch/Roll) ✔️
(b)iii) 줌 인·아웃 (Z/X) ✔️
(b)iv) 정적 CCTV 카메라 3개 (A,B,C) ✔️
(b)v) 동적 CCTV 카메라 1개 (D) ✔️ 뷰포트 & 제어
(b)vi) 직교투영 3개 (정·측·상) ✔️ Front/Side/Top
(b)vii) 카메라 프레임 토글 ('Y') ✔️

추가 구현

'카메라 충돌 회피 기능 구현 + 늑대 시야를 주 카메라로 설정'

늑대의 약간 윗부분에 주 카메라를 계층적 모델링을 통해 배치하였고,
floor_mask를 참조하여 이동 가능한지 검사하고, 벽(cell==1)일 경우 이동을 무시할 수 있도록 하여,
주 카메라가 벽이나 물체를 뚫고 가지 않도록 구현했습니다.
주 카메라는, 건물 밖을 뚫고 나갈 수 없으며, 건물 내부에서 움직입니다.
image image

요구사항별 설명

(a)i) 정적 기하 물체 5개 배치

image

(a)ii) 동적 기하 물체 2개 이동 구현

image
Tiger와 Spider 객체가 지정된 경로(PathSeg)를 따라 자동으로 이동합니다.
해당 경로는 벽을 뚫지 않는, 자연스러운 이동 경로로 설정하였습니다.
tiger는 바닥을 걷는 호랑의 자연스러운 움직임을, 거미는 바닥을 굴러다니는 움직임을 통해 동적 애니메이션을 생성하였습니다. 
draw_object() 내부의 path_pos_dir() 호출로 경로를 따라 위치와 방향을 계산하고, ModelMatrix를 갱신합니다.

실행 후 타이머에 의해 특정 주기마다 draw()가 호출되어,
Tiger와 Spider가 미리 정의된 PathSeg 배열을 따라 자동으로 순환하도록 구현했습니다.

(b)i) 주 카메라 축 이동

설명: Main Camera는 상하좌우 키를 통해 이동이 가능합니다.

(b)ii) 주 카메라 축 회전

image
Main Camera의 로컬 축(u, v, n) 둘레 회전 기능을 구현했습니다.
A / D : Main Camera 좌/우 둘러보기 (leftRight)
W / S : Main Camera 위/아래 보기 (upDown)
Q / E : Main Camera 머리 기울이기 (headTilt)
주 카메라를 늑대의 시야라고 가정하였으므로, 360도 회전이 되는 움직임은 자연스럽지 않아, 각각의 회전의 범위를 지정해주었습니다. 
특히, 위 아래로 둘러보기 기능에서, 아래로 기울어지는 것을 큰 범위를 허용해주면,
카메라가 늑대 오브젝트를 뚫고 들어가 늑대 오브젝트 와이프레임 내부를 보여주게 되므로,
이땐, 더 범위를 좁게 *0.15f를 곱하여 지정했습니다.

(b)iii) 줌 인·아웃

원근 투영 시 Field of View(FOV)를 조절하여 확대/축소 효과를 구현했습니다.
작동법: Z 키로 줌 인, X 키로 줌 아웃을 수행할 수 있습니다.

(b)iv) 정적 CCTV 카메라 3개

CCTV-A/B/C 카메라는 건물 위쪽에 고정된 위치에서 건물 내부를 관찰합니다.
프로그램 실행 시 좌측 상단 3개의 작은 뷰포트에 각각 A, B, C 뷰가 표시됩니다.

(b)v) 동적 CCTV 카메라 1개

image
CCTV-D 카메라는 고정된 위치에서 키 입력으로 회전 및 FOV 조절이 가능합니다.
작동법: 0 키로 Main ⇄ CCTV-D 전환, W/S/A/D/Q/E로 회전(main과 동일), V/B로 FOV 조절(동적 카메라에 추가).
z 키로 줌 인, x 키로 줌 아웃은 메인과 동일하게 작동 가능합니다.


(b)vi) 직교투영 3개

Front, Side, Top 카메라가 각각 정면도, 측면도, 상면도를 표시합니다.
작동법: 실행 시 우측 상단에 3개의 뷰포트에서 직교 투영 화면이 함께 표시됩니다.


(b)vii) 카메라 프레임 토글

image
직교 투영 카메라를 제외한 모든 카메라 프레임을 토글할 수 있습니다.
작동법: Y 키를 눌러 축 표시(on/off)를 전환할 수 있습니다。

Lighting & Effects

요구사항 구현 요약

항목 (번호) 구현 여부 비고
1. Gouraud / Phong Shading (키 1,2) ✔️ 고양이(CAT) 모델
2. 영상 텍스처 매핑 (정적 1 + 동적 1) & 필터 토글 (키 N/L) ✔️ Wood Tower & Wolf
3. 월드 좌표계 광원 (키 3) ✔️ 천장 램프 3개
4. 눈 좌표계(카메라 고정) 광원 (키 4) ✔️ CCTV‑D 플래시
5. 모델 좌표계 광원 (키 5) ✔️ Tiger 헤드라이트
6. 투명 다면체 + 알파 조절 (키 6 ±) ✔️ 정 20‑면체
7. 창의적 쉐이더 효과 2종 (키 7,8) ✔️ Dragon Lava / Ironman Fresnel

상세 구현 설명

1. Gouraud / Phong Shading

image
임의 물체: 고양이(CAT). gouraud.vert / phong.vert 셰이더를 준비하고
'1'(Gouraud) ↔ '2'(Phong) 키로 g_shading_mode를 변경,
Static_Object::draw_object()에서 각 셰이더를 선택적으로 바인딩합니다.
고라드에선, 버텍스에서 라이팅을, 일반 라이팅 퐁에선, fragd에서 라이팅을 계산하여, 세밀도의 차이가 확연히 드러납니다. 

2. 영상 텍스처 매핑 & 필터 토글

정적 물체: Wood Tower, 동적 물체: wolf .
my_woodtower_diff.png, my_spider_diff.png 를 데이터 파일에 추가하여.
load_png_to_texture()로 업로드.

 'N' / 'L' 키를 눌러 Scene::set_user_filter()에서 GL_NEAREST / GL_LINEAR 로 필터를 즉시 적용합니다.
기본은, GL_LINEAR 로 필터입니다. 

1. 정적 물체: Wood Tower 확인 방법
image

해당 위치로 카메라 main을 이동하여, wood tower를 바라봅니다. (주의 : 혹시나, 해당 wood tower가 여러 조작을 거친뒤에 사라질 수 있는데, 이땐 재실행 하면 다시 보일 것입니다.)

2.동적 물체 : wolf 확인 방법
image

고개를 아래로 숙일 수 있도록, S 키를 통해, 메인 카메라의 고개를 아래로 숙이고, z를 통해, 확대해서, wolf의 머리 부분을 봅니다.

3. 월드 좌표계 광원

image
Light_Parameters 3개(#0,#3,#4)를 천장 고정 위치에 배치하였습니다.
'3' 키가 입력되면 쉐이더 uniform과 scene.light[].light_on 플래그를 동시에 토글하여 전체 월드 램프를 일괄적으로 on/off 합니다.

4. 눈 좌표계 광원

image
0 키를 통해 cctv d를 활성화시킨 후,(좌측 맨 위 두번째 카메라) 해당 카메라의 방향을 조절하면,
CCTV‑D 카메라에 고정된 플래시가 움직이는 것을 확인할 수 있습니다.
카메라 ViewMatrix 를 사용하여 갱신함으로써 이러한 효과가 가능하게 되었습니다.

5. 모델 좌표계 광원

image
Tiger 모델 머리 위 헤드라이트를 부착하고, ModelMatrix 변환 후 position/spot_dir 업데이트하여 모델링 좌표계 광원을 구현했습니다.
 '5'키를 통해, 해당 광원을 토글할 수 있습니다.

6. 투명 다면체

image
'6' 키로 g_flag_ico_blend를 토글하고, '+/-' 로 g_ico_alpha 조절할 수 있습니다.
정20면체  블렌딩을 구현했습니다.

7. 창의적 쉐이더 효과 2종

image
* Dragon Lava Dissolve (키 7)
lava.frag 에서 radial‑UV와 cosine flicker를 결합해 녹아내리는 용암 텍스처
+ 깜빡이는(삼각함수 + clamp(0~1))애니메이션을 구현했습니다.

* Ironman Fresnel‑Neon (키 8)
fresnel.frag 에서 rim lighting +네온 글로우 효과를 생성하고,
rim 강도를 시간에 따라 변화시켜 생동감을 부여합니다.

About

C++, OpenGL API와 GLSL 쉐이더를 기반으로 3D 뷰잉(카메라) 변환과 충돌 방지 기능 구현, 퐁 라이팅, 고라드 쉐이딩, 알파 블렌딩, rim 라이팅 등의 다양한 효과를 구현하였습니다.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published