2016년 10월 15일 토요일

뷰 변환

지오메트리 파이프라인에서 모델변환(로컬좌표계 -> 월드좌표계로의 변환) 다음으로 이루어지는 변환으로 월드 월드좌표계의 좌표축을 카메라 좌표계로 이동시키는 변환

  1. 월드 좌표계의 좌표축을 카메라가 있는 위치 C 평행이동
  2. 이동한 좌표축을 카메라 방향에 맞춰 회전

식으로 표현하다면  행렬변환 V는


단위벡터

단위벡터는 크기를 제외한 방향만 나타내는 벡터를 이야기 합니다.

아래는 A벡터와 B벡터간에 단위벡터를 구하는 예제입니다.


모델 변환

평행이동, 회전, 스케일을 한번에 하는 변환

M = TRS (T : trasnfom, R : rotation, S : Scale 뜻합니다.)


참고로 평행이동과 회전의 변환을 리지드바 변환이라고 합니다.

2016년 10월 13일 목요일

지오메트리 파이프 라인

오브젝트가 가지고 있는 로컬좌표를 모델변화를 통해 월드 좌표계상의 좌표로 변화할  있습니다.
그리고 변환을 통해 카메라 좌표계상의 좌표로 변화하고
좌표계로 변환된 지오메트리는 프로젝션 변화을 통해 클립공간으로 바뀌게 됩니다.

프러스텀
카메라에서 보이지 않는 부분을 삭제한 육면체의 영역(시야)

정규 볼륨(canonical view volume)
정점 좌표가 정규화된 정육면체로 변환하는

프로젝션 변환
시야 바깥쪽의 정점 정보를 버리고, 프러스텀을 정규 볼륨이라 하는, 정점 좌표가 정규화된 정육면체로 변환하는 것이 프로젝션 변환입니다.

행렬식의 기하학적 의미

행렬식을 사용하면 평행사변형과 평행육면체의 부피를 구할 수 있습니다.

아래는 (유니티로 배우는 게임 수학) 책에서 나온 내용을 좀더 세부적으로 전개한 것입니다.




여기서 중요한건 3x3 행렬식의 내적, 외적과의 관계입니다.

행렬식

행렬식은

행렬에서 스칼라 값을 뽑는 것입니다.


내적이 두 벡터에서 스칼라 값을 뽑듯이
행렬식은 행렬에서 스칼라 값을 가져오는 것이죠

위와 같이 계산하는 것을 사루스 법칙이라합니다.



그러나 이는 3x3 행렬까지 가능하며 그 이상은 여인수전개(라플라스 전개)를 사용해서 풀어야 합니다.



우선 여인수전개는 여인수를 사용한 전개 방식입니다.

여인수는 소행렬식에 부호를 붙인것을 말하죠

아래의 링크된 사이트에 이 두가지의 개념이 잘 나와있습니다.

소행렬 설명 : http://terms.naver.com/entry.nhn?docId=3338450&cid=47324&categoryId=47324

여인수 설명 : http://terms.naver.com/entry.nhn?docId=3405215&cid=47324&categoryId=47324

라플라스 전개 : http://terms.naver.com/entry.nhn?docId=3405055&cid=47324&categoryId=47324

행렬의 곱과 내적

행렬의 곱에서 가장 중요한 것은
내적과의 관계를 파악하는 것입니다.

아래는 원노트에 정리한 내용입니다.



위의 내용을 풀어 쓴다면



2016년 10월 11일 화요일

외적(cross)

유니티에서 Vector3.Cross(VectorA, VectorB)로 구할 수 있습니다.

외적은 무엇인가?


외적은 내적과 다르게 기하하적으로 설명이 됩니다.

위의 그림처럼 이미지가 딱 나오죠

외적을 설명하자면

벡터 a와b의 외적은 새로운 벡터(a와 b벡터에 수직인 벡터)를 생성합니다.

즉 내적이 만들어내는 것은 스칼라이며 외적이 만들어내는 것은 벡터라는 것입니다.

이것만 알면 내적 외적의 기본을 이해한 것이죠


외적이 생성해낸 벡터는?


외적이란 벡터 a와 b에서 새로운 벡터 c를 생성하는데

생성된 벡터c를 분석해보면

방향은 a벡터 b벡터에 수직이고

크기는 a벡터 b벡터가 만들어내는 평행사변형의 크기와 같습니다.
(||a|| x ||b|| 는 ||a|| 는 벡터a의 크기와 ||b||는 벡터 b의 크기의 외적이죠)

외적의 크기를 수식으로 나타내면 아래와 같습니다.



내적과 비슷하죠

참고로 내적의 수식은



내적은 cos이고 외적은 sin이라고 생각하면 외우기 쉽습니다.

단위원을 이루는 밑변이 cos이고 높이가 sin이므로 이 성질들을 이용해 응용되기도 합니다.

그리고 행렬과 붗꽃반응을 일으키며 판타지를 보여주죠 ㄷㄷㄷ;


내적(dot)

유니티에서 Vector3.Dot(VectorA,VectorB)를 사용하면 구할 수 있습니다.


내적은 무엇일까?


내적인 두개의 벡터에서 스칼라(방향이 없는 크기만 가지고 있는 물리량)를 뽑아내는 연산입니다.

내적은 이해하는데 애매한 경우가 많은데요
그 이유는 기하학적인(점,선,면 등의 공간의 성질)이 없기 때문에 형상화 하기 어렵기 때문입니다.(벡터를 더한다는 것처럼 머리속에 딱 떠오르지 않기 때문이죠)

즉 두 개의 벡터를 더하거나 빼는 것처럼 직관적이지 않고 정해진 연산에 의해 도출되기 때문에 직접적으로 다가오지 않는 것이죠

그냥 특정한 필요에 의해 (충돌체크 등) 두개의 벡터를 통해 스칼라(방향이 없는 크기만 가지고 있는 물리량)를 추출하는 것이라 생각하면 편합니다.

그렇다면 기하학적인 성질의 공식들을 사용하지 않고 굳이 내적을 사용하는 이유는 무엇이냐? 했을 때

결국 최적화 부분에 있습니다.

즉 싸인 코사인 등 매우매우 비싼 비용의 초월함수를 최소한 혹은 사용하지 않기 위함이죠

내적의 정의는 아래의 싸이트에 매우 잘 정리되어 있습니다.
http://j1w2k3.tistory.com/627

아래는 내적을 구하는 공식입니다.
||a|| 는 a의 크기를 나타내며 노름이라고 읽습니다.



벡터 크기 비교(sqrMagnitude)

단순히 벡터의 크기를 비교할
Vector3.sqrMagnitude를 사용하는 것이 좋습니다.

이유는 Vector3.Distance 함수는 제곱근의 연산(벡터의 길이를 구하기 위해) 들어가는데

sqrMagnitude 제곱근을 계산하지 않고 제곱한 값끼리 비교하므로 제곱근의 연산을 줄일  있기 때문이죠