Upload
kiyoung-moon
View
421
Download
14
Embed Size (px)
Citation preview
유니티고급과정1. 왜유니티인가?
- 학생들의이해수준에따라 C# 문법강의를할예정
2. 3차원좌표계3. 게임에서쓰이는수학- 벡터, 행렬4. 유니티에서제공하는기능들
Kiyoung Moon(문기영)
왜유니티인가?
크로스플랫폼
C#언어의채용
개발컨셉- 콤포넌트프로그래밍
크로스플랫폼한번만만들면최소한의작업으로여러플랫폼에동시에출시가가능하다.
급변하는모바일시대에시간은 ‘금’ 최소한의작업으로여러플랫폼출시는대단한경쟁력
자체엔진의경우플랫폼별로하드웨어에밀접한부분들은플랫폼에맞게재작성해야함. 예를들어 Windows에서 렌더링을위해 DirectX를사용해야하고 Mac에서는 OpenGL을사용해야함.
유니티를사용하면이런내부적인작업들은건드리지않아도됨. (물론유니티에서제공하지않는기능들을사용하려면직접구현하거나유니티에서만들어줄때까지기다려야함. 이것이단점이라면단점.)
C#의채용Java와비슷하게만들었으나자바는아님.
델파이를개발한프로그래머가마이크로소프트로옮기면서
만든언어. (Anders Hejlsberg)
터보파스칼, 델파이, C# 모두이사람이만들었음.
C# 문법강의필요에따라서할예정. 책은강연자가저술한책을기본으로하여강의.
3차원좌표계좌표계란?
좌표계가왜필요한가?
벡터벡터(Vecctor)는크기와방향을모두가진수량을가리키는말.
크기(Magnitude)
방향(Direction)
벡터로위치를표기벡터의꼬리를원점으로만들고위치를머리로표현한다.
3차원에서표현되는벡터의요소
v = (x,y,z)
왼손좌표계, 오른손좌표계x축에네손가락을향하고 y축방향으로쥐었을때엄지손가락의방향이 z
벡터연산들1. 상등벡터 u, v가있을때각각의요소들이모두같을때상등이라한다.
2. 벡터덧셈u + v = (ux + vx, uy + vy)
3. 벡터의스칼라곱ku = (kux, kuy)
4. 벡터뺄셈u - v = u + (-1 * v) = u + (-v) = (ux - vx, uy - vy)
예제>
u = (1,2,3), v = (1,2,3), w = (3,0,-2), k = 2일때
1. u + w = (1,2,3) + (3,0,-2) = (4, 2, 1)
2. u = v
3. u - v = u + (-v) = (1,2,3) + (-1, -2, -3) = (0, 0, 0) = 0
4. kw = 2(3,0,-2) = (6, 0, -4)
벡터의길이, 단위벡터길이와단위벡터
벡터 u가있고길이는 ||u||로 표기한다.
3차원벡터의길이는?
단위벡터(Unit Vector)란?
길이가 1인벡터
길이가중요하지않고방향만중요할때
길이가있는벡터를단위벡터화시키면방향만남는다.
방법은?
단위벡터화.
단위벡터화
증명?
내적(Dot Product)
벡터의내적은결과로스칼라값을얻는다.
벡터 u, v가있을때 u ● v = (uxvx + uyvy + uzvz)
요소들끼리곱하고모두더하는것이내적.
내적이무슨의미인가?
내적값의의미u ● v = ||u|| ||v || cos θ
1. u ● v = 0이면 u와 v는직교한다.
2. u ● v > 0이면두벡터사이의각도는 90도보다작다.
3. u ● v < 0이면두벡터사이의각도는 90보다크다.
벡터의외적w = u x v = (UyVz - UzVy, UzVx - UxVz, UxVy - UyVx)
벡터의외적의결과는내적과는다르게벡터.
이때 w의방향은왼손좌표계, 오른손좌표계에따라서방향이달라짐.
그러므로벡터의외적에교환법칙은성립하지않는다.
u x v != v x u
선형결합v = a0v0 + a1v1 + … + an-1vn-1
a는스칼라, v는벡터
표준기저벡터
e0 = (1,0,...,0)
e1 = (0,1,...,0)
en-1 = (0,0,...,1)
예를들어 3차원 R^3에서 기저벡터 e0, e1, e2를이용하면모든벡터표현이가능하다. 그리고벡터는다음과같이
v = a0e0 + a1e1 + a2e2
로모든 3차원좌표계에서벡터표현이가능하다. 보통 3차원을다룬책에서는 e0, e1, e2를 i, j, k로표현해서다음과같이모든벡터 v는
v = xi + yj + zk로표현한다. 이때 i, j, k는스칼라값이아니라. 벡터이고선형결합을이용해서표현하고있다.
행렬m x n행렬은 m개의행, n개의열로구성된실수들의모임이다.
예> 4x4행렬
Mij
로원소를지칭할수있고이때 i는행, j는열이다.
행렬의연산
행렬곱셈행렬 A가 m x n이고 B가 n x p일때둘의곱이정의된다. 즉 A의열(n)과 B의행
(n)이같아야곱셈이가능하다. 결과로얻는행렬은 m x p가된다.
예를들어다음과같은행렬은곱을할수없다.
행렬곱셈
행렬곱셉에교환법칙은성립하지않는다.
AB와 BA는같지않다.
AB != BA
행렬의결합법칙행렬 A, B, C가있을때
(AB)C = A(BC)
행렬의전치전치(Transpose)는행렬의행과열을바꾼것.
따라서 m x n는 n x m으로바뀐다. 표기는
행렬의전치속성들
단위행렬대각요소가모두 1이고그외에는모두 0인행렬.
단위행렬은 I로표기하고행렬 A가있을때
AI = B, IB = B이다.
어떠한행렬에 I를곱하면그결과는본래행렬그대로를얻는다.
행렬식(Determinant)
행렬 A의행렬식은 detA로표기한다. 우리가 2x2 행렬식은외워서얻는값.
행렬식이값이 0이아닐때가역이존재한다. 즉행렬 A의역행렬이존재함을의미한다. 역행렬은이후에소개한다.
행렬식의정의
행렬식을구하는방법
복잡한데행렬식을구하는이유?
보통은역행렬을구하기위해서사용한다. 중요한것은역행렬.
역행렬(Inverse Matrix)
정방행렬(행과열이같은정사각형)은역행렬이존재할수있다.
n x n행렬 M의역행렬은 n x n이고
모든정방행렬에역행렬이존재하는것은아니다. 행렬식의값이 0이아닐때에만역행렬이존재한다. 또한역행렬이존재할경우그역행렬은고유하다.
행렬 M이있을때 M^-1(역행렬)을곱할경우결과는단위행렬 I를얻는다.
MM^-1 = I
지금까지행렬을배웠는데왜배웠나?
3차원공간에서위치와방향을가지는것들(예를들어벡터)은변환(Transform)
을통해이동, 회전, 스케일이가능하다.
유니티는행렬관련된수학연산들을제공하고있다. 가령스케일행렬 S는본래
다음과같으나유니티에서는간단하게함수 x를이용해이를구현할수있다.
Matrix4x4 scaleTM = Matrix4x4.Scale(new Vector3(sx, sy, sz));
이동, 회전, 스케일이동, 회전, 스케일만이용해도거의대부분의게임은작성할수있다.
행렬모두를설명하는것은낭비. 강연자보다더잘설명한책들이너무많다.
프로그래밍은단순노동이아니다.
그랬으면얼마나좋았을까?
본인이아는만큼. 더좋은코드, 더좋은프로그램을만들수있다.
아는것이힘이다.
뚝심?
뚝심이있어야할수있다.
우리가지금까지배웠던기초적인수학은게임프로그래밍의극히일부분.
그외에도모든부분에수학적인요소가있고그것을알고있는사람만이이해하고더코드를작성할수있다.
만일다른사람이만든라이브러리가없을때어떻게해야할까?
예를들어유니티에서수학함수, 클래스들을제공하지않는다면?
본인이직접해결. 프로그래머는문제를풀어내는(Solve) 사람이다.