[유니티로 배우는 게임 수학] (2)

혀니앤·2021년 10월 18일
0

3. 벡터

  • 수벡터
  • 기하벡터
  • 스칼라 : 컴퓨터의 CPU로서는 기하벡터 자체를 직접 처리할 수 없으므로 어디까지나 스칼라양 또는 스칼라 배열로 수벡터를 처리한다.
  • 벡터 연산
  • 크기 : Vector3.sqrMagnitude // 벡터 크기의 제곱을 나타내는 프로퍼티
  • 내적 : cos함수를 사용하여 구하는 것이 일반 공식이지만 이러한 초월함수는 컴퓨터상에서 처리 비용이 비싸므로, 내적의 성분표시를 이용하여 구한다.
    => a•b=axbx+ayby+azbz
  • 외적 : Cross (유니티 왼손 좌표계 상의 외적)
    => 세 개의 정점으로 구성되는 삼각형의 두 변을 이루는 벡터의 외적을 구해 정규화해주면, 그 삼각형이 존재하는 평면의 법선벡터를 얻을 수 있다.

▶ 예제 : 간이 충돌 판정

벡터의 내적과 외적의 성질을 사용

마우스 휠을 돌리면 카메라로부터 녹색 선이 나타나고, 그 선의 끝이 큐브와 닿으면 선이 붉게 변한다.

위의 외적의 성질을 통해, 두 벡터의 외적의 정규화=법선 벡터이고, 점 P가 삼각형 ABC 내부에 있다면 각 변의 정점에서 점 P로의 벡터로 법선 벡터를 구해도 같은 법선벡터가 나와야 한다.
아니라면, 법선벡터의 방향은 반전된다.

  1. 큐브 오브젝트에 있는 임의의 점 세 개를 뽑는다.
Mesh mesh = pivot.gameObject.GetComponent<MeshFilter>().mesh; 
// mesh : 폴리곤 메시의 정점 좌표 배열
for (int i = 0; i < mesh.vertices.Length; i++)
{
	if (triangleVertices.Count < 3) {
		triangleVertices.Add(mesh.vertices[i]);
	}
}
  1. 임의의 점 3개와 카메라 선 끝 사이의 외적을 구한다.
		Vector3 edge1 = triangleVertices [1] - triangleVertices [0];
		Vector3 edge2 = cameraPoint - triangleVertices [1];
		
		Vector3 edge3 = triangleVertices [2] - triangleVertices [1];
		Vector3 edge4 = cameraPoint - triangleVertices [2];
		
		Vector3 edge5 = triangleVertices [0] - triangleVertices [2];
		Vector3 edge6 = cameraPoint - triangleVertices [0];
		
		Vector3 cp1 = Vector3.Cross (edge1, edge2);
		Vector3 cp2 = Vector3.Cross (edge3, edge4);
		Vector3 cp3 = Vector3.Cross (edge5, edge6);
  1. 세 벡터의 내적을 통해 부호를 확인한다.
	if (Vector3.Dot (cp1, cp2) > 0 && Vector3.Dot (cp1, cp3) > 0) { 
    		//두 벡터의 부호가 같으면 한 평면에 있는 것 = 빨간 선으로 표시
		Debug.DrawLine (transform.position, cameraPoint, Color.red);
	} else {
		Debug.DrawLine (transform.position, cameraPoint, Color.green);
	}

4. 행렬

  • 행 row 열 col
  • 행렬의 스칼라배 곱셈
  • 행렬의 곱셈 : * 연산자
  • 전치행렬 : Matrix4x4 -> transpose 프로퍼티
  • 역행렬 : inverse 프로퍼티
  • 행렬과 벡터의 곱 : 행렬과 벡터의 곱은 벡터가 됨.
  • 스위즐 연산 : 행렬과 벡터의 곱으로 벡터의 성분을 변경함
  • 행우선과 열우선 : Matrix4x4는 열우선(세로로 끊어서 들어감)
  • AoS(구조체의 배열)와 SoA(배열의 구조체) : 행우선과 열우선의 메모리 상의 데이터 레이아웃 방식의 문제
  • 행렬식 : 행렬을 수식으로 간주해 스칼라 값을 얻는다. det(A). 오른쪽으로의대각선 - 왼쪽으로의대각선
    => 2x2 행렬식은 평행사변형의 면적과 같다

예제 : 행렬 계산을 위한 Inspector 확장

행렬 계산 기능을 시험하는 간이 계산기
Determinant(3x3) : 3x3 행렬식
RHS : 4차원 열벡터

  1. 에디터 기능 확장을 위한 준비
    Scripts 폴더에 들어가 있는 다른 스크립트와는 달리 Editor라는 폴더를 만들어 확장 기능을 구현한다.
    Editor 폴더는 가장 마지막으로 컴파일되어 폴더 밖의 컴포넌트를 참조할 수 없다.
    게임 개발을 위한 도구와 디버그 기능 등의 코드는 Editor 폴더에 넣어주면 된다.

[CustomEditor( typeof(Chapter04) )] //클래스 정의를 해줌으로써 커스터마이징 클래스로 만듦
public class Chapter04Editor : Editor {
...
}

클래스 코드는 Editor 클래스를 상속하고, 클래스 정의를 추가해준다.

profile
일단 시작하기

0개의 댓글