묻공러
'게임 수학 & 물리/게임 수학' 카테고리의 글 목록

게임 수학 & 물리/게임 수학

게임 수학 & 물리/게임 수학

[게임 수학] 행렬(2)

행렬의 활용 게임에서는 이동, 회전, 크기를 제어할 때 행렬식을 이용하고 셰이더에서 많이 사용되며 그래픽스 랜더링 파이프라인에서 일어나는 모든 변환들이 행렬로 이루어지고 계산된다 행렬의 이동 (Translation) m03, m13, m23이 위치 값(x, y, z)을 가진다 기존 위치가 v이고 그 위치에서 t만큼 이동할 때, 위와 같은 계산 과정을 거치며 위치 변환이 이뤄진다 행렬의 확대, 축소 (Scaling) m00, m11, m22 요소를 이용해서 scale 변환이 이뤄진다 기존 스케일 행렬이 v이고 원하는 s만큼 scale 변환을 할 때, 위와 같은 계산 과정을 거친다 행렬의 회전 (Rotation) x축, y축, z 축에 따라 해당하는 값들이 변경되어 위와 같은 공식을 통해 회전 변환이 이뤄진..

게임 수학 & 물리/게임 수학

[게임 수학] 행렬(1)

행렬의 정의 식 또는 수를 직사각형의 형태로 배열한 것이다 가로를 행(row), 세로를 열(column)이라 표현한다 배열된 수를 행렬의 성분(entry)라고 표현한다 행렬 표현은 대문자로 표현하고 내부값은 소문자로 표현한다 행벡터, 열벡터 행벡터는 DirectX에서 주로 이용되고 열벡터는 OpenGL, 언리얼, 유니티에서 주로 이용된다 행벡터와 열벡터의 차이점은 요소들이 배열되는 방향이다 행벡터는 수평적으로 요소가 배열되며, 열벡터는 수직적으로 요소가 배열된다 이러한 차이는 벡터의 사용 목적이나 특정 연산에 따라서 중요한 역할을 한다 예를 들어, 행렬 곱셈에서 행벡터와 열벡터의 순서가 중요하며, 이에 따라 연산 결과가 달라질 수 있다 행렬의 크기 표현 단위행렬 단위행렬(identity matrix)은 ..

게임 수학 & 물리/게임 수학

[게임 수학] 벡터의 외적(2)

벡터의 외적 유니티 벡터의 외적은 유니티에서 Vector3.Cross를 이용해 쉽게 구할 수 있다 법선벡터 면(두 벡터)의 수직인 벡터를 노멀라이즈 한 것을 법선벡터라고 한다 셰이더에서는 빛이 들어오는 방향과 비치는 부분 등을 계산하는데 활용되고 카메라에서는 보이는 부분인지 안 보이는 부분인지 컬링 하는데 활용된다 벡터의 외적 예시 1 위는 Vec1과 Vec2를 외적 한 벡터를 노란 공(cVec)을 통해 출력하는 예시이며 아래와 같이 구현 가능하다 void Update() { CrossVector(); Vector3 dir = cVec - Vec3.position; if (dir.magnitude >= 0.1f) Vec3.position += dir.normalized * Time.deltaTime; }..

게임 수학 & 물리/게임 수학

[게임 수학] 벡터의 외적 (1)

내적과 외적 벡터의 내적에서는 자신을 기준으로 앞, 뒤 방향을 확인할 수 있었다면 벡터의 외적에서는 자신을 기준으로 좌, 우 방향을 확인할 수 있다 또한, 벡터의 내적을 통해 각도를 알아냈다고 하더라도 어떤 방향(좌, 우)으로 각도를 틀어야 하는지 헷갈리는 경우가 생기기 때문에 이를 보완한다 물론, 외적의 결과값들은 내적을 통해서도 추론할 수 있지만 외적은 정규화 과정을 거치지 않아도 되기 때문에 연산에서 효율적이다 벡터의 외적 X와 Y를 외적해서 Z가 나온 그림이다 외적에서는 교환법칙이 성립되지 않는다는 점을 주의해야 한다 교환법칙이 성립되지 않는 외적에 대한 결과는 아래와 같다 왼손 좌표계 vs. 오른손 좌표계 손(왼손 or 오른손)을 이용해서 시작 벡터에서 가려는 벡터로 손을 감싸면 엄지손가락이 가..

게임 수학 & 물리/게임 수학

[게임 수학] 벡터의 내적 (2)

벡터의 내적 복습 벡터의 내적이 게임에서는 어떻게 사용되는지 알아보기 전, 간단하게 백터의 내적을 복습해 보자 A 오브젝트의 벡터와 B 오브젝트의 벡터를 내적 하면, 0보다 큰 값(양수)이 나온다는 것을 통해 같은 방향을 바라보고 있다고 판단할 수 있고 A 오브젝트의 벡터와 C 오브젝트의 벡터를 내적 하면, 0보다 작은 값(음수)이 나온다는 것을 통해 다른 방향을 바라보고 있다고 판단할 수 있다 주로 게임에서는 두 오브젝트가 같은 방향을 바라보는지, 바라보지 않는지 확인이 가능하고 어떠한 오브젝트가 기준 오브젝트의 앞쪽인지 뒤쪽인지 구분도 가능하고 단순하게 두 벡터의 각도를 알아낼 수도 있다 내적 예시 유니티에서 벡터의 내적을 하려면, Vector3.Dot()을 이용하면 된다 두 가지 예시를 통해 알아보..

게임 수학 & 물리/게임 수학

[게임 수학] 벡터의 내적 (1)

벡터의 내적 벡터의 내적은 곱셈을 의미한다 일반적으로 벡터의 합과 차의 결과 값은 벡터지만 벡터의 곱셈(내적)의 결과값은 스칼라라는 것이 특징이다 벡터의 내적 공식 벡터의 내적 공식은 2개가 있으며 아래와 같다 주의 깊게 볼 것은 두번째 공식이다 A벡터와 B벡터를 내적한 결과는 A의 magnitude(length)와 B의 magnitude(length)를 곱한 값에 cos θ를 곱한 것과 같다는 것이다 이 공식을 이용하여 θ를 구하기 위해서는 아래와 같은 과정을 거치게 된다 앞서, tangent를 이용해서 세타각을 구하는 것을 기억해 보면 아래와 같은 과정을 거쳤다 tan θ = y/x θ = arctan(y/x) 이처럼, arctan를 이용한 것과 마찬가지로 벡터의 내적에서는 arccos을 이용한다 결..

게임 수학 & 물리/게임 수학

[게임 수학] 벡터의 기초 (2)

벡터의 정규화 예시 1 벡터의 방향을 계산해 정규화를 거친 코드는 아래와 같다 Vector3 dirVec = targert.position - transform.position; dirVec.Normalize(); // dirVec = dirVec / dirVec.magnitude; transform.position += dirVec * speed * Time.deltaTime; 유니티에서 제공하는 정규화 함수를 사용하면 되고 주석에 있는 것처럼 직접 구해도 상관은 없다 이처럼 Normalize를 해주면, 노란 공처럼 Normalize를 해주지 않으면, 빨간 공처럼 아래와 같은 결과물이 나타난다 벡터의 정규화 예시 2 (with. tangent) tangent를 활용하여 아래의 결과물처럼 오브젝트가 해당..

게임 수학 & 물리/게임 수학

[게임 수학] 벡터의 기초 (1)

벡터 3d공간의 좌표의 기본 개념은 벡터이다 게임 내 대부분의 오브젝트는 위치가 존재하며 이동이 일어나고 벡터의 크기나 방향이 기반이 된다 벡터는 선분과 다르게 화살표이다 다시 말해, 벡터는 크기와 방향을 가지고 있다는 것이 핵심이고 벡터의 크기를 무시하고 단위벡터를 만든다면, 방향성을 각도, 기울기를 통해 표현할 수 있다 또한, 벡터는 시작 위치가 없는 것이 특징이다 벡터의 합과 차 벡터의 합과 차는 아래 그림과 같다 벡터의 차는 결국 A - B = A + (-B)로 접근을 하는 것이다 결과는 D벡터가 되며, 단순히 B벡터에서 A벡터로 바라보는 방향과도 같다는 사실을 알 수 있다 이는 벡터는 시작위치가 없기 때문에 가능한 것이다 Normalized 벡터 벡터의 크기(길이)를 1로 만들어서 방향만 신경을..

게임 수학 & 물리/게임 수학

[게임 수학] tangent

tangent 게임에서 cos sin은 각에 관련된 것이었고 tangent도 마찬가지로 각도와 관련이 있고 기울기가 핵심이다 tan θ는 높이/밑변으로 c/b이다 이는 결국 a가 1이라는 가정하에, sin θ / cos θ를 의미한다 우리가 원하는 건 tan θ가 아닌 tan를 뺀 θ 이기 때문에 arcTan(역삼각함수)을 이용해서 θ 를 구할 수 있다 θ = c/b의 arcTan 유니티의 Atan() 유니티에서는 역삼각함수로 쉽게 바꿀 수 있는 Atan과 Atan2가 있다 Mathf.Atan(parameter)을 이용하면 길이의 비율을 (y / x)을 인자로 작성하면 된다 Mathf.Atan2(parameter 01, parameter 02)을 이용하면 길이의 비율을 (y, x)를 순서대로 인자로 작성..

게임 수학 & 물리/게임 수학

[게임 수학] sin, cos (2)

sin, cos 활용 예시 sin, cos을 활용하여 다양한 각도를 적용하여 패턴을 쉽게 만들 수 있다 단순하게 좌우로 움직이게 하려면 sin의 패턴을 활용해 DegreeComponent를 아래처럼 작성할 수 있다 using System.Collections; using System.Collections.Generic; using UnityEngine; public class DegreeComponent : MonoBehaviour { [Range(1, 4)] public float scalar = 0.0f; [Range(0, 360)] public float degree = 0.0f; float dTime; // Start is called before the first frame update void..