콘텐츠로 이동

코스 2: One Basics - 3D 게임 입문

코스 개요

이 코스에서 학생들은 2D 거북이 그래픽에서 3D 게임 세계로 도약합니다. Ursina 엔진을 사용하여 입체적인 객체를 만들고 조작하면서, 3D 공간에 대한 이해와 게임 개발의 기초를 배웁니다. 실제로 작동하는 3D 프로그램을 만드는 경험은 학생들에게 큰 성취감과 동기부여를 제공합니다.

예상 소요 시간: 8~16시간

소요 시간은 학생의 학년, 사전 경험, 학습 속도에 따라 크게 달라집니다. 또한 기본 개념만 익히고 넘어가는 경우와 추가 실습 문제나 창의적 프로젝트를 더 진행하는 경우에 따라서도 차이가 납니다. 위 시간은 평균적인 범위이며, 자녀의 페이스에 맞추어 유연하게 진행하시기 바랍니다.

어떤 능력을 키우게 되나요?

3D 공간의 모든 것은 위치(x, y, z), 크기, 회전 등의 숫자 데이터로 표현됩니다. 학생들은 현실 세계를 데이터로 모델링하는 방법을 배웁니다. 이는 자율주행차가 공간을 인식하고, VR/AR이 가상 세계를 구축하고, 3D 프린터가 물체를 만드는 원리와 동일합니다.

어떤 원리를 배우나요?

  • (객체 데이터) 3D 객체의 위치, 크기, 색상은 모두 숫자 데이터입니다. 변수에 이 데이터를 저장하고 변경하면서 데이터가 현실(화면)에 미치는 영향을 직접 확인합니다.
  • (파라미터화) 함수에 다양한 값을 전달하여 결과가 달라지는 것을 보면서, 입력 데이터에 따라 출력이 결정되는 원리를 이해합니다. 이것이 모든 데이터 처리 시스템의 기본입니다.
AI 시대 사고력: 컴퓨팅 (문제해결) | 데이터 기반 | 확률적 사고력

컴퓨팅 사고력 (Computational Thinking)

스킬 설명 활동 예시
📦 공간 시각화 3D 좌표계로 위치 표현 position=(2, 1, -3) → x, y, z축 이해
🌳 계층 구조 부모-자식 관계로 객체 조직화 자동차(부모) → 바퀴(자식)
⚙️ 속성 조작 객체의 특성 변경 cube.scale = 2 → 크기 2배
🔌 API 이해 라이브러리 사용법 학습 Entity() 함수의 인자들 파악

수학적 연결고리

수학 개념 프로그래밍 적용 학습 효과
3D 좌표계 position=(x, y, z) 공간에서 점의 위치 표현
벡터 scale=(2, 1, 0.5) 방향과 크기를 가진 양
비율과 배율 scale=2 → 2배 확대 비례 관계 이해
회전과 각도 rotation=(0, 45, 0) 3축 회전 개념

공간 추론 능력

flowchart LR
    A[3D 좌표계] --> X[X축: 좌우]
    A --> Y[Y축: 상하]
    A --> Z[Z축: 앞뒤]
방향 예시
X축 좌우 (← →) x=3 → 오른쪽으로 3
Y축 상하 (↑ ↓) y=2 → 위로 2
Z축 앞뒤 (깊이) z=-5 → 뒤로 5

객체 관계 이해

Parent-Child 관계:

자동차 (부모)
├── 앞바퀴 (자식) → 부모 따라 이동
├── 뒷바퀴 (자식) → 부모 따라 이동
└── 핸들 (자식) → 부모 따라 이동

부모가 움직이면 → 모든 자식도 함께 움직임
💻 코드 예시 & 시각화

예시 1: 첫 번째 3D 큐브

from ursina import *

app = Ursina()  # 게임 엔진 시작

# 3D 큐브 생성
cube = Entity(
    model='cube',
    color=color.red,
    position=(0, 0, 0)
)

app.run()  # 게임 실행

3D 좌표계:

       Y (위/아래)
       │    ╱ Z (앞/뒤)
       │   ╱
       │  ╱
       │ ╱
       │╱──────── X (좌/우)
      ╱│
     ╱ │


예시 2: Entity 속성 조작

from ursina import *

app = Ursina()

# 다양한 속성을 가진 Entity
my_cube = Entity(
    model='cube',
    color=color.azure,
    position=(2, 1, 0),    # x=2, y=1, z=0
    scale=(2, 0.5, 1),     # 가로2, 세로0.5, 깊이1
    rotation=(0, 45, 0)    # Y축 기준 45도 회전
)

app.run()

속성 시각화:

position = (2, 1, 0)
─────────────────────
     Y
     │   ┌───┐
   1 │   │ ■ │  ← 큐브 위치
     │   └───┘
   0 ┼─────────── X
     0   1   2

scale = (2, 0.5, 1)
─────────────────────
가로 2배  │████████│
세로 0.5배 ← 납작함
깊이 1배  (기본)

rotation = (0, 45, 0)
─────────────────────
       ╱╲
      ╱  ╲  ← Y축 기준 45° 회전
     ╱    ╲


예시 3: 여러 객체 생성

from ursina import *

app = Ursina()

# 바닥
ground = Entity(
    model='plane',
    color=color.green,
    scale=10
)

# 플레이어 (빨간 큐브)
player = Entity(
    model='cube',
    color=color.red,
    position=(0, 0.5, 0)
)

# 나무들 (초록 큐브들)
for i in range(3):
    tree = Entity(
        model='cube',
        color=color.lime,
        position=(i * 3 - 3, 1, 2),
        scale=(0.5, 2, 0.5)
    )

app.run()

장면 구성:

측면도 (Side View):

          🌲    🌲    🌲
          │     │     │
  ■ (플레이어)
━━━━━━━━━━━━━━━━━━━━━━━ (바닥)


위에서 본 모습 (Top View):

     🌲    🌲    🌲
      │     │     │
─────────────────────
      │     │     │
      ■ (플레이어)


예시 4: Parent-Child 관계

from ursina import *

app = Ursina()

# 부모: 자동차 본체
car = Entity(
    model='cube',
    color=color.blue,
    scale=(2, 0.5, 1)
)

# 자식: 바퀴들 (부모를 따라 움직임)
wheel1 = Entity(
    model='sphere',
    color=color.black,
    scale=0.3,
    position=(-0.8, -0.3, 0),
    parent=car  # ← car의 자식으로 설정
)

wheel2 = Entity(
    model='sphere',
    color=color.black,
    scale=0.3,
    position=(0.8, -0.3, 0),
    parent=car  # ← car의 자식으로 설정
)

# 자동차가 움직이면 바퀴도 함께 움직임
car.x = 3  # car 이동 → wheel1, wheel2도 이동

app.run()

Parent-Child 관계:

car (부모)         car.x = 3 이동 후
┌─────────┐        →        ┌─────────┐
│         │                 │         │
◯         ◯                 ◯         ◯
wheel1  wheel2           wheel1  wheel2

부모 이동 → 자식들 자동으로 함께 이동!


예시 5: 색상과 투명도

from ursina import *

app = Ursina()

# 불투명 큐브 (기본)
cube1 = Entity(
    model='cube',
    color=color.red,
    position=(-2, 0, 0)
)

# 반투명 큐브 (alpha=0.5)
cube2 = Entity(
    model='cube',
    color=color.rgba(0, 0, 255, 0.5),  # 반투명 파랑
    position=(0, 0, 0)
)

# 거의 투명한 큐브 (alpha=0.2)
cube3 = Entity(
    model='cube',
    color=color.rgba(0, 255, 0, 0.2),  # 거의 투명 초록
    position=(2, 0, 0)
)

app.run()

투명도 시각화:

alpha = 1.0     alpha = 0.5     alpha = 0.2
(불투명)         (반투명)        (거의 투명)

  ████           ▓▓▓▓            ░░░░
  ████           ▓▓▓▓            ░░░░
  ████           ▓▓▓▓            ░░░░

RGBA = (R, G, B, A)
R = 빨강 (0~255)
G = 초록 (0~255)
B = 파랑 (0~255)
A = 투명도 (0=투명 ~ 1=불투명)


챕터 01: 첫 번째 3D 앱 (Hello Ursina)

A. Ursina 라이브러리 불러오기

항목 내용
무엇을 배우나요? 3D 게임 엔진 라이브러리 가져오기
핵심 개념 라이브러리 import, 프레임워크

from ursina import *전문 게임 개발 도구 상자를 여는 것과 같습니다. Ursina는 Python으로 3D 게임을 쉽게 만들 수 있게 해주는 엔진입니다. 학생들은 복잡한 3D 그래픽 계산을 직접 하지 않아도 라이브러리가 대신 처리해준다는 것을 배웁니다. 이것은 현대 소프트웨어 개발의 핵심인 "바퀴를 다시 발명하지 않기" 원칙입니다. 전문 개발자들도 검증된 라이브러리와 프레임워크를 활용하여 개발 시간을 단축합니다.


B. 게임 창 만들기

항목 내용
무엇을 배우나요? 애플리케이션 인스턴스 생성하기
핵심 개념 객체 인스턴스화, 애플리케이션 구조

app = Ursina()app.run()게임의 시작과 실행을 담당합니다. 학생들은 프로그램이 단순히 위에서 아래로 실행되는 것이 아니라, 이벤트 루프를 통해 지속적으로 실행된다는 것을 배웁니다. 게임 창이 열리고, 사용자 입력을 기다리고, 화면을 갱신하는 연속적인 과정이 있습니다. 이것은 거북이 그래픽의 done()보다 훨씬 발전된 애플리케이션 구조입니다. 실시간으로 반응하는 인터랙티브 프로그램의 기본 구조를 이해하게 됩니다.


C. 변수 선언 (3D 맥락)

항목 내용
무엇을 배우나요? 3D 객체를 변수에 저장하기
핵심 개념 참조, 객체 관리

3D 환경에서 변수는 화면에 표시되는 객체를 참조합니다. my_cube = Entity(...)처럼 큐브를 변수에 저장하면 나중에 그 큐브를 이동, 회전, 크기 조절할 수 있습니다. 학생들은 변수가 단순한 숫자나 문자열뿐 아니라 복잡한 객체도 저장할 수 있다는 것을 배웁니다. 여러 객체를 관리할 때 각각에 의미 있는 이름을 붙이는 것이 코드 가독성에 중요합니다. 이 개념은 게임에서 플레이어, 적, 아이템 등 여러 요소를 관리하는 기초가 됩니다.


D. Entity로 3D 큐브 만들기

항목 내용
무엇을 배우나요? 3D 공간에 객체 생성하기
핵심 개념 3D 좌표, 속성, 인자

Entity는 Ursina에서 모든 3D 객체의 기본입니다. Entity(model='cube', color=color.red, position=(0, 0, 0))처럼 모양, 색상, 위치를 지정합니다. 학생들은 3D 좌표계(x, y, z)를 처음 접하며, x는 좌우, y는 상하, z는 앞뒤를 나타낸다는 것을 배웁니다. 함수에 여러 인자를 전달하는 방법(키워드 인자)도 익힙니다. 2D에서 3D로의 전환은 공간적 사고력을 확장하는 중요한 단계입니다.


E. 완성 코드와 실행

항목 내용
무엇을 배우나요? 전체 프로그램 구조 이해하기
핵심 개념 코드 구조, 실행 순서

완성된 코드는 import → 앱 생성 → 객체 생성 → 실행의 구조를 가집니다. 학생들은 각 부분이 어떤 역할을 하는지, 순서가 왜 중요한지 이해합니다. 코드를 수정하고 결과를 즉시 시각적으로 확인할 수 있어 실험적 학습이 가능합니다. 이 단순한 프로그램이 더 복잡한 게임의 기초가 된다는 것을 알게 됩니다. 학생들은 자신만의 3D 세계를 만들었다는 성취감을 경험합니다.


챕터 02: 변수와 인자 (Cube 심화)

A. Entity 인자 기초

항목 내용
무엇을 배우나요? Entity의 다양한 속성 설정하기
핵심 개념 키워드 인자, API 이해

Entity는 model, color, scale, position, rotation다양한 인자를 받습니다. 학생들은 문서를 읽고 사용 가능한 옵션을 파악하는 능력을 기릅니다. 각 인자가 객체의 어떤 측면을 제어하는지 실험을 통해 이해합니다. scale=(2, 1, 1)처럼 튜플로 각 축의 값을 개별 지정할 수 있습니다. 이 경험은 나중에 다른 라이브러리의 API를 배울 때 적용 가능한 학습 방법을 익히는 것입니다.


B. 변수에 Entity 저장

항목 내용
무엇을 배우나요? 객체를 저장하고 나중에 조작하기
핵심 개념 참조, 객체 수정

player = Entity(...)로 저장하면 player.position = (1, 0, 0)처럼 나중에 속성을 변경할 수 있습니다. 학생들은 객체가 생성된 후에도 동적으로 수정 가능하다는 것을 배웁니다. 이것은 게임에서 캐릭터가 움직이고, 체력이 변하고, 상태가 바뀌는 게임 로직의 기초입니다. 변수에 저장하지 않으면 나중에 그 객체에 접근할 방법이 없다는 것도 이해합니다. 계획적인 코드 구조의 중요성을 배우기 시작합니다.


C. 깊이 이해하기 (z축)

항목 내용
무엇을 배우나요? 3D 공간의 깊이 개념
핵심 개념 z축, 카메라 관점, 원근법

z축은 화면 안쪽/바깥쪽 방향을 나타냅니다. 같은 크기의 객체도 z값이 크면 더 멀리 있어서 작게 보입니다. 학생들은 3D 공간에서 카메라의 관점이 중요하다는 것을 배웁니다. 원근법의 원리를 프로그래밍으로 체험하며 수학적/예술적 개념을 통합합니다. 이 이해는 3D 게임에서 배경, 전경, 캐릭터를 적절히 배치하는 데 필수적입니다.


D. Alpha와 Parent-Child 관계

항목 내용
무엇을 배우나요? 투명도 조절과 객체 계층 구조
핵심 개념 투명도, 계층적 관계, 상대적 위치

color.rgba(1, 0, 0, 0.5)의 네 번째 값(alpha)은 투명도를 결정합니다. Parent-child 관계에서 자식 객체는 부모를 따라 움직입니다. 예를 들어, 자동차(부모)의 바퀴(자식)는 자동차가 움직이면 함께 움직입니다. 학생들은 복잡한 구조를 계층적으로 조직하는 방법을 배웁니다. 이 개념은 로봇 팔, 태양계, 캐릭터 관절 등 실제 관계를 모델링하는 데 사용됩니다.


E. 메서드와 자주 하는 실수

항목 내용
무엇을 배우나요? 객체의 행동(메서드) 이해와 오류 방지
핵심 개념 메서드 호출, 디버깅

메서드는 객체가 수행할 수 있는 행동입니다. player.look_at(target)처럼 객체에게 명령을 내릴 수 있습니다. 학생들은 속성(데이터)과 메서드(행동)의 차이점을 이해합니다. 흔한 실수들(오타, 잘못된 인자, 누락된 콤마 등)과 해결 방법을 배웁니다. 오류 메시지를 읽고 해석하는 디버깅 능력을 기릅니다.


이 코스를 마치면...

학습 성과

학생들은 다음 능력을 갖추게 됩니다:

  • 3D 좌표계(x, y, z)를 이해하고 활용할 수 있음
  • 게임 엔진 라이브러리를 import하고 사용할 수 있음
  • Entity 객체를 생성하고 속성을 조작할 수 있음
  • 키워드 인자로 객체의 다양한 속성을 설정할 수 있음
  • 객체의 계층적 관계(parent-child)를 구성할 수 있음
  • 더 복잡한 게임 로직(이동, 충돌 등)을 배울 준비가 됨