본문 바로가기
대학생활/수업

게임기획과비주얼스크립팅 3주차 - 게임 수학/ 물리 그리고 코딩

by se.jeon 2023. 9. 14.
728x90
반응형

프로그래머는 거진 이과출신이 많지만, 기획자는 문/이과 거진 반반으로 나뉘는 경향.

기획자도 수학과 물리에 대해 잘 알아둬야 한다.

진수와 진법

수를 세는 단위.

게임에서 사용하는 수학과 물리를 알아보기 전에 컴퓨터가 사용하는 2진법을 먼저 알아보자.

- 미적분의 창시자 라이프니츠가 고안.

- 전자기기의 경우 특정 상태(전류가 흐르는 상태를 1, 반대의 경우 0)를 구별하기 위해서 사용

  (우리는 10진법 체계에 익숙하다.)

- 두가지의 상태만을 표현함으로 오류가 적고, 속도가 빠르다.

- 전류가 흐르는 상태 1을 True 반대의 상태 0을 False로 표현하기도 한다.

2진법

- 기본적으로 0과 1로만 표현이 가능하며, 2보다 큰 수를 표현하기 위해서는 자릿수를 변경해야 한다.

- 2진법과 16진법에 대한 설명 진행

- 오버플로우와 보수 표현에 대한 설명 진행

- 자료형에 대한 간단한 설명 진행 (short : 2의 16제곱까지, 양수만 쓰는 자료형)

 

기획자는 데이터를 다룰 일이 많다.

프로그래머가 한 테이블의 최대값이 255라고 알려줬을 때, 256을 사용하는 순간 어떤 문제가 발생할 지 아무도 모른다.

 

의도치 않은 버그 하나로 보상이 255배 나갈 수도 있다.

라이브 중인 게임에서 보상을 회수하는 것의 무게는 매우 다르다.

우리가 보기 편하게 바뀌었을 뿐이지, 기본적으로 0과 1을 벗어나지 않는다.

게임 물리

게임에서 사용하는 물리

- 가상의 3D공간에 현실감을 더하기 위해서는 현실의 물리법칙을 적용해야 한다.

- 게임의 게임요소와 현실과의 이질감의 최소화가 관건이다.

- 자연스러운 물리환경을 위해 "시간", "운동(힘)", "속도"등이 고려되어야 한다.

 

앵그리버드에서 사용된 물리 : 방향, 중력, 속도 등...

딥한 계산식을 알기보다는, 어떤 현상이 어디에 어떻게 영향이 되는가에 집중할 예정.

 

물리에서 가장 기본이 되는 단위는 "힘"

 

 

뉴튼의 운동 법칙

- 법칙 1 : 물체에 외력이 작용하지 않는 한, 물체는 계속 정지한 상태를 유지하려고 한다. (관성의 개념)

- 법칙 2 : 물체의 가속도는 물체에 작용하는 합력에 비례하고 가속도의 방향은 합력의 방향이다. (벡터를 알아야 하는 이유)

- 법칙 3 : 물체에 힘이 작용하면, 동시에 항상 크기가 같은 힘이 반대 방향으로 작용하며 (반작용), 반작용과 작용하는 힘은 동일선 위에 있다.

 

특히 법칙 2는 동역학에서 매우 중요한 법칙이며, F = ma로 쓴다.

F = 힘, m = 질량, a = 물체의 무게중심의 가속도.

 

(영상 시청 - 또 美쳤다↗ 안성진 팀 자작곡 ′F=ma′♬ 스타워즈 샘플링! #본선2라운드 슈퍼밴드 (SuperBand) 6회)

https://youtu.be/xqF-RnVb5Vo?si=bdNiJCyqA5FBG_F_ 

 

강체란 무엇인가?

Unity의 Rigidbody(강체)에는 Mass(질량)의 정보가 포함되어 있다.

이 값이 여기에 왜 있는지, 어떤 작용을 하는지의 이해가 필요하다.

 

Unreal에도 동일한 부분이 구현되어있다. 기본적인 원리이기 때문.

잘은 모른다고 하더라도, 어느 정도의 이해는 하고 있어야 다른 엔진에 가더라도 어렴풋이 이해 할 수 있다.

 

- 힘의 정의

- 접촉력

- 마당힘

이런 개념이 존재한다는 설명만 진행하고, 상세 내용 스킵함.

슈팅의 탄도학

FPS 게임에서의 요즈음 탄도학

과거의 슈팅게임은 탄도학이 반영되지 않았으나, (에이밍 게임)

최근은 탄도학, 탄속 등이 반영되는 경우가 많다. (에이밍, 타이밍)

 

ex : 배틀그라운드 패치노트

- 탄환은 중력의 영향만 받으며 속도는 일정함 (짧은 이동 시간, 탄도 하강 적음)

- 탄환이 중력과 공기저항의 영향을 받으며, 속도는 시간이 지남에 따라 준기하급수적으로 감소 (긴 이동 시간, 탄도 하강 커짐)

 

총의 발사

조준선(Line of Sight), 총열 축선(Centerline of Barrel), 실제 탄도(Trajectory)

실제 총의 발사는 일직선으로 진행되지 않는다.

 

탄도학을 본격적으로 배우거나 곱하지는 않더라도, 어떤 값들의 영향을 받는지는 알고있는 편이 많은 도움이 된다.

(찾아볼수 있기 때문)

- 중력

- 중력 가속도(탄속)

- 저항력 (공기저항)

- 시간(거리)

 

데이브 더 다이버의 경우에도 물리가 들어가 있다.

다른 방향으로 살짝 틀어지는 부분. 관성의 법칙이다.

강체와 속도 (RigidBody)

게임 물리에서 강체란?

- 운동학에서 강체는 매우 중요한 개념

- "운동하는 동안 물체를 구성하는 모든 점들간의 거리가 변하지 않는 물체" (ex : 자동차)

- 쉽게 이야기하면 힘을 받아 운동을 시작하는 물체 중 변형이 생기지 않는 물체를 뜻한다.

야구공, 축구공과 같이 찌그러지는 것은 강체가 아니다.

 

속도와는 비슷한데 다른 속력

우리는 자동차의 속도를 보고 빠르다거나 느리다는 말을 한다.

- 속력 : 물체가 얼마나 빨리 움직이는가를 나타내는 스칼라의 양. (속력 = 이동거리/소요시간)

- 속도 : Velocity, 시간에 대한 물체의 위치 변화량을 나타내는 벡터량이다.

            크기와 방향을 가지는 물리량. (속도 = 위치 변화량/소요시간 = 변위/소요시간)

 

(영상 시청 - Understanding Velocity Acceleration Force - Buildbox/Unity Demonstration)

https://youtu.be/oj7vvIdschI?si=gQN0Pw3DqqTMY4qj 

속도와 마찰력

마찰력

동역학에서 운동을 방해하는 대표적인 힘.

두 물체 사이에서 작용하며, 마찰력의 방향은 물체의 운동방향과 반대로 작용한다.

 

마찰력의 크기

수직 항력과 물체 접촉면 사이의 거친 정도에 비례하다.

 

(영상 시청 - 마찰력을 이용하면 괴력을 쓸 수 있다? / YTN 사이언스)

https://youtu.be/iP8Q1IfSyzM?si=isJpl88siZ7U96JB 

벡터

게임에서 사용하는 수학?

- 엔진에서 대부분의 복잡한 수학식들은 함수로 제공한다.

- 하지만, 원리를 알고 사용하는 것은 매우 중요한 일이다.

  (수식을 모두 계산 할 수 있을 정도의 수학적 깊이가 필요하지는 않음)

- 기술이 발전하고, 다양한 엔진이 개발 되더라도, 수학적 이론은 변하지 않음.

게임수학의 꽃 : 벡터

- 벡터는 크기와 방향, 즉 공간을 표현하는 중요한 도구이다.

- 수학, 물리 및 대부분의 공학 문제에서도 가장 기본적으로 다루는 요소.

- 직선이나 평면같은 기하적 요소는 방향이나 평면이 어느 방향을 향해 있는지 나타내기 위해 벡터를 사용하며,

- 게임에서는 카메라, 조명, 텍스쳐 맵핑, 가시성 판단 등 전 분야에 걸쳐 폭넓게 사용된다.

 

게임에서 벡터를 사용하는 이유

- 표현이 직관적으로 누구나 쉽게 값을 확인할 수 있다.

- 방정식이나 복잡한 계산을 줄일 수 있다.

- "공간(Space) = 방향(Direction) + 위치(Position)"로 공간을 표현하기에 최적화 되어있다.

- 속도, 바람, 저항, 충돌 등 많은 물리현상을 계산/표현하는 데에 활용된다.

 

기즈모를 보면 x, y, z로 구성되어 있는 것을 확인 할 수 있다.

단순한 행렬로 사용되는 경우도 많다.

언리얼 노드를 보면 RGB값의 경우에도 x, y, z의 형태로, 생김새가 똑같다.

 

4차원 벡터란 무엇일까?

4개의 인자값으로 이루어진 단순 행렬로 이해해도 무방. x, y, z, a의 형태로 컬러를 표현함.

공간으로서의 좌표값을 의미하는 것인지, 자료형을 이야기하는 것인지 헷갈리는 구간이 올 것.

두 용도로 모두 사용한다.

 

자세히 다루지 않는 내용

- 벡터의 크기

- 벡터와 스칼라

- 벡터의 기본 연산 (덧셈, 뺄셈)

- 벡터의 기본 연산 법칙

 

벡터의 내적

두 벡터의 사잇각을 알 수 있다. 결과값은 스칼라.

캐릭터를 기준으로 적이 어느 각도에 있는지 알 수 있다. 시야 범위 내에 있는지.

 

컴퓨터 그래픽스에서는 Diffuse Shader에서 내적의 원리를 이용하여 램버트 코사인 법칙을 사용한다.

자연스러운 빛, 반사광, 가장 먼 지역은 어둡게 보이게 하는 쉐이더 또한 벡터의 내적을 이용하여 구할 수 있다.

빛이 들어온 방향, 반사광, 반사각. 프로그래머도 기획자도 기본적인 물리나 수학적인 부분은 아는 것이 좋다.

 

벡터의 외적

백터 곱셈의 또 다른 형태, 결과값은 벡터.

수직 값을 받아오기 때문에 폴리곤이 어떤 방향을 보고 있는지 알 수 있다.

보이지 않는 면 제거 기능에도 외적을 사용한다.

 

외적의 컨텐츠 활용 예

- 무궁화 꽃이 피었습니다.

- 뒷면에서 공격하면 데미지가 2배 되는 경우

- FPS와 같은 상황에서 피격된 방향을 알려줄 때

 

외적을 알면 컨텐츠에도 사용 할 수 있다.

내적, 외적 방식을 알아야 하는 것이 아니다.

수학, 물리 공식으로 컨텐츠를 만들어 낼 수 있기 때문에 공부를 해야 함을 알아야 한다.

 

참고 도서

- 생생한 게임 개발에 꼭 필요한 기본 물리

 

- 좋은 게임을 만드는 핵심 원리 : 게임 수학과 물리

 

벡터, 외적이 뭔지만 알면 된다.

두 책다 절판되었지만, 도서관에 비치되어 있다.

기획자 여러분들이 읽으면 좋은 내용은 일주일이면 충분하다.

어렵지 않은 코딩

파이썬 첫걸음 : 변수

- int

- float

- string

 

new : 새로운 데이터 타입일 경우 사용

크기를 잰 다음에, 메모리를 비워달라는 의미.

 

NPC라는 데이터타입의 mostarA라는 변수를 만들었을 때,

컴파일러 입장에서 보았을 때는 NPC라는 데이터를 저장 할 수 있는 메모리의 주소값을 가리키는 것.

(대충 겜과라면 다 아는 기초 프로그래밍 설명)

 

파이썬 첫걸음 : 조건문

상황에 따라 실행의 흐름을 다르게 하는 문법

프로그램은 기본적으로 절차형이다. 앞 줄이 실행되면, 뒷 줄이 실행된다.

if, elif, else 3가지로 구성된다.

 

큰 의미에서의 오르골과 같은 형태. 순서대로 실행되면서 음이 울리는.

하지만 게임은 절차형임에도 정말 많은 예외가 있고, 고정되어 있지 않다.

if 조건식 :
  조건을 만족하면 실행할 코드

 

파이썬 첫걸음 : 반복문

프로그램 내에서 똑같은 명령을 일정 횟수만큼 반복하여 수행하도록 제어하는 명령문

for, while문이 있다.

(대충 겜과라면 다 아는 기초 프로그래밍 설명 기획 버전)

실습 진행

https://www.mycompiler.io/ko/new/python

 

새 Python 프로그램 만들기 - 마이컴파일러 - myCompiler

실행 코드 코드 저장 기존 코드를 유지하시겠습니까? 에디터에 코드가 있는 동안 언어를 전환하려고 합니다. 이를 유지하려면 “기존 코드 유지”를 선택합니다. 예제로 바꾸려면 “예제로 바

www.mycompiler.io

 

게임 전투 공식 예시
1. 명중률 확률을 먼저 계산해 맞췄는지 판단한다.
2. 데미지는 내 공격력이 상대방의 "방어력"보다 높아야 한다.
3. 방어력 - 공격력은 최종 데미지가 된다.
4. 적의 HP는 데미지보다 많아야 차감이 이루어지고, 아니면 "사망" 처리된다.

- 반복문을 이용해서 체력이 100인 몬스터를 랜덤하게 변하는 명중률에 의해
- 공격을 하고 체력이 0이하가 되면 사망하는 전투를 구현 해 보자.
- 몇 번 반복해야 할지 알 수 있을까?

 

# 게임 전투 공식 예시
# 1. 명중률 확률을 먼저 계산해 맞췄는지 판단한다.
# 2. 데미지는 내 공격력이 상대방의 "방어력"보다 높아야 한다.
# 3. 방어력 - 공격력은 최종 데미지가 된다.
# 4. 적의 HP는 데미지보다 많아야 차감이 이루어지고, 아니면 "사망" 처리된다.

# - 반복문을 이용해서 체력이 100인 몬스터를 랜덤하게 변하는 명중률에 의해
# - 공격을 하고 체력이 0이하가 되면 사망하는 전투를 구현 해 보자.
# - 몇 번 반복해야 할지 알 수 있을까?

# [ 예시 ]
# 공격에 성공 하였습니다.
# 50의 체력이 남았습니다.
# 35 명중률
# 공격에 실패하였습니다.

import random

MonsterHP = 100
MonsterDef = 50
Damage = 60
Accuracy = 50

# 4. 적의 HP는 데미지보다 많아야 차감이 이루어지고, 아니면 "사망" 처리된다.
while MonsterHP > 0:

    # 1. 명중률 확률을 먼저 계산해 맞췄는지 판단한다.
    Accuracy = random.randint(0, 100)
    if Accuracy > 50:
        print("\n공격 명중 : %d" %Accuracy)

        # 2. 데미지는 내 공격력이 상대방의 "방어력"보다 높아야 한다.
        if Damage > MonsterDef:

            # 3. 방어력 - 공격력은 최종 데미지가 된다.
            MonsterHP -= (Damage - MonsterDef)
            print("대미지 : %d" %(Damage - MonsterDef))
            print("몬스터 체력 : %d\n" %MonsterHP)
    else:
        print("공격 실패 : %d" %Accuracy)

print("\n몬스터 사망")

728x90
반응형