콘텐츠로 이동

2차시: 나만의 3D 장면 꾸미기 - 색상·크기·위치로 객체 디자인하기

⏰ 50분 · 객체 속성 · 다양한 3D 객체 · 장면 조합 · 난이도 ●●○○○

학습목표: color, size, pos 등 속성을 조절하여 다양한 3D 객체를 생성하고, 여러 객체를 조합하여 의미 있는 3D 장면을 구성할 수 있다.

오늘의 질문: "레고 블록처럼 3D 도형들을 자유롭게 배치하면, 어떤 장면을 만들 수 있을까요?"


🎯 핵심 주제 카드

🧠 객체 속성 마스터하기

color, size, pos, radius 등 속성을 바꿔서 같은 도형도 완전히 다르게 표현합니다

🔧 다양한 3D 객체 탐험

cylinder, cone, arrow, ring 등 새로운 도형을 만들어 보고 각각의 고유 속성을 실험합니다

🎨 나만의 3D 장면 만들기

여러 객체를 조합하여 눈사람, 나무, 로봇 등 창의적인 장면을 직접 디자인합니다

📝 에러와 친해지기

속성 이름을 잘못 쓰거나 좌표를 헷갈렸을 때 나오는 에러를 직접 경험하고 해결합니다


⏱️ 수업 흐름

🔄 1단계: 지난 시간 복습 & 속성 확장 (8분)

1차시에서 배운 sphere, box를 떠올리며, 색상(color)과 위치(pos)를 바꿔보는 간단한 실습으로 시작합니다.

🧱 2단계: 새로운 3D 객체 탐험 (12분)

cylinder, cone, arrow, ring 등 새로운 객체를 하나씩 생성해 보면서 각 객체만의 고유 속성(axis, length 등)을 알아봅니다.

🚨 3단계: 에러 경험 & 디버깅 (8분)

의도적으로 틀린 코드를 실행하여 자주 발생하는 에러를 직접 만나보고, 스스로 고치는 방법을 익힙니다.

🎨 4단계: 나만의 3D 장면 만들기 (15분)

배운 객체들을 조합하여 눈사람, 간단한 캐릭터, 미니 태양계 등 자유로운 3D 장면을 설계하고 구현합니다.

✅ 5단계: 정리 & 평가 (7분)

핵심 개념을 되짚어보고, 형성 평가 문제를 풀며 오늘 배운 내용을 점검합니다.


📚 핵심 개념 1: 객체 속성(Attribute) 마스터하기

🍕 비유로 시작해 볼까요?

피자를 주문할 때를 떠올려 보세요. "라지 사이즈, 페퍼로니 토핑, 치즈크러스트"처럼 옵션을 지정하죠? Vpython에서 3D 객체를 만들 때도 똑같습니다. sphere()라는 기본 주문서에 색상은 빨간색, 반지름은 0.5, 위치는 왼쪽이라고 옵션을 붙이는 거예요!

파이썬에서 함수에 키워드 인자를 넘기던 것 기억나시나요?

# 파이썬 함수의 키워드 인자 (복습)
def make_pizza(size="medium", topping="cheese"):
    print(f"{size} 피자, {topping} 토핑!")

make_pizza(size="large", topping="pepperoni")

VPython 객체 생성도 정확히 같은 원리입니다:

sphere(pos=vector(0, 0, 0), radius=0.5, color=color.red)
#      ^^^^^^^^^^^^^^^^^^^  ^^^^^^^^^^  ^^^^^^^^^^^^^^^
#      위치 = 키워드 인자    반지름       색상

💡 핵심 연결: VPython의 sphere(radius=0.5, color=color.red)는 파이썬 함수의 키워드 인자(keyword argument) 와 완전히 같은 문법입니다. = 왼쪽이 속성 이름, 오른쪽이 값이에요!

📐 정의: 객체 속성이란?

객체 속성(Attribute)이란, 3D 객체의 외형과 상태를 결정하는 설정값입니다. 모든 VPython 객체는 공통 속성과 고유 속성을 가집니다.

VPython 주요 공통 속성 정리표:

속성 설명 예시 기본값
pos 객체의 중심 위치 (3D 좌표) pos=vector(1, 2, 0) vector(0,0,0)
color 객체의 색상 color=color.red color.white
opacity 투명도 (0~1) opacity=0.5 1 (불투명)
visible 보이기/숨기기 visible=False True

sphere(구)의 고유 속성:

속성 설명 예시
radius 구의 반지름 radius=0.5

box(상자)의 고유 속성:

속성 설명 예시
size 가로×세로×깊이 size=vector(2, 1, 0.5)

VPython 객체 속성의 구조를 다이어그램으로 살펴보겠습니다:

flowchart TD A["VPython 객체"] --> B["공통 속성"] A --> C["고유 속성"] B --> D["pos<br/>위치"] B --> E["color<br/>색상"] B --> F["opacity<br/>투명도"] C --> G["sphere: radius"] C --> H["box: size"] C --> I["cylinder: axis, radius"] C --> J["cone: axis, radius"]

🎨 VPython 색상 시스템

VPython은 미리 정의된 색상 상수를 제공합니다. 마치 물감 팔레트처럼요!

색상 코드 색상 색상 코드 색상
color.red 빨간색 🔴 color.green 초록색 🟢
color.blue 파란색 🔵 color.yellow 노란색 🟡
color.orange 주황색 🟠 color.purple 보라색 🟣
color.white 흰색 ⚪ color.cyan 청록색
color.magenta 자홍색 color.black 검정색 ⚫

🎨 커스텀 색상도 가능합니다! color=vector(R, G, B) 형식으로, 각 값은 0~1 사이입니다. 예를 들어 vector(1, 0.5, 0)은 주황색이에요. RGB 값이 0~255가 아니라 0~1 범위인 점이 일반적인 RGB와 다릅니다.


🔧 따라하기 실습: 속성 바꾸기 (점진적 빌드업)

실행 환경: VPython 3.2 (GlowScript 또는 로컬 vpython 패키지)

✅ v1: 가장 기본적인 구 하나 (3줄)

먼저 1차시에서 했던 것처럼, 아무 속성 없이 구 하나를 만들어 봅시다.

from vpython import *

# 아무 속성도 지정하지 않은 기본 구
sphere()

실행 결과: 화면 중앙에 흰색(white) 구가 하나 나타납니다. 반지름은 기본값 1입니다.

위 코드의 2번째 줄 sphere()가 바로 기본값(default)으로 객체를 생성하는 것입니다. 아무 키워드 인자도 넘기지 않았으니, VPython이 알아서 pos=(0,0,0), color=white, radius=1을 넣어준 거예요.

✅ v2: 색상과 반지름 추가 (+2줄 변경)

이제 색상과 크기를 바꿔볼게요. 바뀐 부분에 주목하세요!

from vpython import *

# v2: 색상과 반지름을 지정
sphere(
    radius=0.5,          # <- 기본값 1에서 0.5로 줄임
    color=color.red      # <- 기본 흰색에서 빨간색으로 변경
)

실행 결과: 화면 중앙에 빨간색의 작은 구가 나타납니다. v1보다 반지름이 절반이라 확실히 작아 보입니다.

위 코드의 4번째 줄 radius=0.5가 바로 고유 속성을 키워드 인자로 지정하는 것입니다.

✅ v3: 위치 이동 + 두 번째 객체 추가

이번에는 구의 위치를 옮기고, 상자도 하나 추가해 보겠습니다.

from vpython import *

# v3: 위치가 다른 두 객체 배치
sun = sphere(
    pos=vector(-2, 0, 0),   # <- 왼쪽으로 2만큼 이동 (x축 음의 방향)
    radius=0.8,
    color=color.yellow
)

earth = sphere(
    pos=vector(2, 0, 0),    # <- 오른쪽으로 2만큼 이동 (x축 양의 방향)
    radius=0.3,
    color=color.blue
)

실행 결과: 화면에 왼쪽에 노란 큰 구(태양), 오른쪽에 파란 작은 구(지구) 가 나타납니다.

v2에서 v3으로 바뀐 점: - pos=vector(-2, 0, 0) → 객체의 위치를 지정했습니다 - 객체를 변수에 저장했습니다 (sun = sphere(...)) — 나중에 이 변수로 속성을 바꿀 수 있어요! - 객체가 2개로 늘었습니다

💡 vector(x, y, z)에서 x는 좌우, y는 위아래, z는 앞뒤입니다. 레고판 위에 블록을 놓을 때 가로, 세로, 높이를 정하는 것과 같아요!

✅ v4 (최종): 투명도까지 추가한 완성 장면

from vpython import *

# 최종: 속성을 다양하게 활용한 미니 우주
scene.background = color.black  # <- 배경을 검정색으로 (우주느낌!)

sun = sphere(
    pos=vector(0, 0, 0),
    radius=1.0,
    color=color.yellow,
    emissive=True            # <- 스스로 빛나는 효과 (태양이니까!)
)

earth = sphere(
    pos=vector(3, 0, 0),
    radius=0.3,
    color=color.blue
)

moon = sphere(
    pos=vector(3.6, 0, 0),
    radius=0.1,
    color=color.white,
    opacity=0.8              # <- 살짝 투명하게 (달의 신비로운 느낌)
)

실행 결과: 검정 배경에 노란 태양(중앙), 파란 지구(오른쪽), 반투명 흰 달(지구 옆) 이 나타납니다!

이전 버전과 달라진 점: - scene.background = color.black → 배경색도 바꿀 수 있습니다 - emissive=True → 자체 발광 효과 (조명 영향을 받지 않음) - opacity=0.8 → 투명도 조절 (0이면 완전 투명, 1이면 불투명)


📚 핵심 개념 2: 다양한 3D 객체 탐험

🧊 VPython 객체 종류 한눈에 보기

1차시에서 sphere(구)와 box(상자)를 배웠죠? VPython에는 더 다양한 3D 도형이 있습니다. 마치 레고에 다양한 모양의 블록이 있는 것처럼요!

객체 생성 함수 모양 핵심 고유 속성
sphere() ⚽ 공 radius
상자 box() 📦 직육면체 size=vector(가로,세로,깊이)
원기둥 cylinder() 🧪 기둥 axis, radius
원뿔 cone() 🔺 뿔 axis, radius
화살표 arrow() ➡️ 화살표 axis, shaftwidth
고리 ring() 💍 도넛 axis, radius, thickness

💡 cylinder, cone, arrow에는 모두 axis 속성이 있습니다. 이 속성은 객체가 어느 방향으로 뻗어있는지를 결정해요. vector(1,0,0)이면 x축(오른쪽) 방향, vector(0,1,0)이면 y축(위쪽) 방향입니다.

각 객체의 관계를 시각화하면 이렇습니다:

mindmap root((VPython 3D 객체)) 둥근 계열 sphere<br/>구 ring<br/>고리 기둥 계열 cylinder<br/>원기둥 cone<br/>원뿔 특수 계열 box<br/>상자 arrow<br/>화살표

🧪 새로운 객체 하나씩 실험하기

1️⃣ cylinder (원기둥)

원기둥은 시작점(pos)에서 axis 방향으로 뻗어나갑니다.

from vpython import *

# 원기둥: pos에서 axis 방향으로 뻗어나가는 기둥
my_cylinder = cylinder(
    pos=vector(0, 0, 0),      # <- 시작점 (밑면의 중심)
    axis=vector(0, 3, 0),     # <- 위쪽으로 3만큼 뻗어감 (높이=3)
    radius=0.5,               # <- 밑면 반지름
    color=color.green
)

실행 결과: 원점에서 위쪽으로 초록색 기둥이 솟아 있습니다.

위 코드의 5번째 줄 axis=vector(0, 3, 0)이 바로 axis 속성입니다. axis는 "이 방향으로, 이 길이만큼 뻗어라"라는 뜻이에요. vector(0, 3, 0)은 y축(위쪽)으로 길이 3을 의미합니다.

2️⃣ cone (원뿔)

원뿔은 원기둥과 비슷하지만, 끝이 뾰족합니다. 아이스크림 콘을 떠올리면 돼요!

from vpython import *

# 원뿔: 밑면에서 꼭짓점까지 뾰족하게
my_cone = cone(
    pos=vector(0, 0, 0),      # <- 밑면의 중심
    axis=vector(0, 2, 0),     # <- 꼭짓점 방향과 높이
    radius=0.7,               # <- 밑면 반지름
    color=color.orange
)

실행 결과: 원점에서 위쪽으로 주황색 원뿔이 나타납니다. 밑면은 넓고 위로 갈수록 뾰족해집니다.

3️⃣ arrow (화살표)

화살표는 물리학에서 벡터(힘, 속도 등)를 표현할 때 아주 유용합니다!

from vpython import *

# 화살표: 방향과 크기를 시각적으로 보여줌
my_arrow = arrow(
    pos=vector(-2, 0, 0),     # <- 시작점
    axis=vector(4, 0, 0),     # <- 오른쪽으로 길이 4
    shaftwidth=0.2,           # <- 화살대 굵기
    color=color.red
)

실행 결과: 왼쪽에서 오른쪽으로 향하는 빨간색 화살표가 나타납니다.

위 코드의 7번째 줄 shaftwidth=0.2는 arrow만의 고유 속성입니다. 화살대(shaft)의 굵기를 조절해요.

4️⃣ ring (고리)

고리는 도넛 모양입니다. axis는 고리가 바라보는 방향(법선 벡터)을 뜻해요.

from vpython import *

# 고리: 도넛 모양, axis는 고리면에 수직인 방향
my_ring = ring(
    pos=vector(0, 0, 0),
    axis=vector(0, 1, 0),     # <- 고리가 바닥에 평행하게 놓임
    radius=1.0,               # <- 고리의 큰 반지름 (중심에서 고리까지)
    thickness=0.1,            # <- 고리 자체의 굵기
    color=color.purple
)

실행 결과: 바닥에 평행하게 보라색 고리가 나타납니다.

💡 ring의 thickness는 "고리 줄의 굵기"이고, radius는 "고리 전체의 크기"입니다. 실제 반지의 두께와 반지 크기를 생각하면 쉬워요!

📊 axis 속성 방향 비교

같은 axis 값이 각 객체에서 어떤 의미인지 정리해 봅시다:

axis 값 cylinder cone arrow ring
vector(1,0,0) 오른쪽으로 뻗은 기둥 오른쪽으로 뾰족한 뿔 오른쪽 화살표 정면을 바라보는 고리
vector(0,1,0) 위로 솟은 기둥 위로 뾰족한 뿔 위쪽 화살표 바닥에 평행한 고리
vector(0,0,1) 앞으로 나온 기둥 앞으로 뾰족한 뿔 앞쪽 화살표 벽에 걸린 고리

🚨 에러 경험 설계: 실수에서 배우기

실제 코딩을 하다 보면 반드시 에러를 만나게 됩니다. 미리 한번 만나보면, 나중에 당황하지 않아요! 아래 코드를 직접 실행해 보세요.

❌ 에러 1: 속성 이름 오타

from vpython import *

# 🚨 일부러 틀린 코드 - 어디가 잘못됐을까요?
sphere(
    pos=vector(0, 0, 0),
    radious=0.5,              # <- 철자가 틀림! radius가 맞음
    color=color.red
)

🤔 이 코드를 실행하면 어떤 에러가 날까요? 잠시 생각해 보세요!

에러 메시지:

AttributeError: 'sphere' object has no attribute 'radious'

원인 분석: radious는 VPython이 모르는 속성 이름입니다. 올바른 철자는 radius예요. VPython은 알 수 없는 속성을 넘기면 에러를 발생시킵니다.

수정 코드:

from vpython import *

# ✅ 수정: radious → radius
sphere(
    pos=vector(0, 0, 0),
    radius=0.5,               # <- 올바른 철자!
    color=color.red
)

❌ 에러 2: color에 잘못된 값 넣기