PGR21.com
- 자유 주제로 사용할 수 있는 게시판입니다.
- 토론 게시판의 용도를 겸합니다.
Date 2015/06/26 20:00:14
Name 우주모함
Subject [일반] 게임 속의 수학

안녕하세요. 갑자기 게임에서 수학이 어떻게 쓰이는지를 대략적으로 소개해보고 싶어서
이렇게 글을 쓰게 되었습니다.
당연히 수학적인 설명은 최대한 배제하고
대략 어떤 개념으로 쓰이는지만 간략하게 소개해보겠습니다.



프로그래밍 분야라면 어디든 수학이 쓰이지 않는 곳이 없겠지만
특히 게임쪽은 수학으로 현실세계를 구현한다 해도 과언이 아닙니다.

예를들면 어떤 맵에서 어떤 유닛이나 캐릭터가 자리하는 위치값을 나타고자 한다면 가장 쉬운방법은
3차원공간의 x y z 각 축의 좌표로 나타내는 것이 가장 쉽겠죠.

때문에 캐릭터를 나타내고, 이동시키는 것은 물론이고
폴리곤을 실제 화면에 띄우고, 그 안에 색을 입히는 단순한 작업에도 수학이 쓰입니다.

화려하고 현실감있는 색감을 표현하는 셰이더도 있고, 물체와 물체간의 충돌을 검출할 때에도 그렇고.
마우스로 화면을 클릭했을 때, 내가 찍은 그 포인트가 게임상의 어떤 오브젝트를 가리키는지 알아야 할 때도 역시 수학이 쓰이죠.


저는 그중에서도 3차원공간에서 캐릭터를 화면에 띄우기까지 어떤 과정을 거치는지에 대해 소개해 보겠습니다.




일반적으로 그래픽디자이너는 3DsMax로 캐릭터를 모델링하여 
그것을 리소스로 제공합니다. 이렇게 제공된 리소스는 익스포터를 거쳐서
게임에 쓸수있는 형태로 변환하여 사용하게 되는데, 

이 최초의 리소스는 일반적으로
x, y, z의 3개의 축으로 이루어진 3차원공간의 0,0,0 즉 원점에 자리하고 z축 방향을 바라보고 있습니다.

즉, 좌표축의 원점에서 앞을 바라보고 있다는 말이죠.

이 캐릭터를 실제 게임에 쓰이는 맵의 어느위치에 놓을것인지를 수행하는 작업을
'월드변환'이라고 합니다.


월드변환이 이루어지기 전의, 0,0,0에서 z축방향을 바라보고있는 상태의 좌표계를 '로컬 좌표계'라고 하고,
월드변환이 이루어져서 월드에 캐릭터가 배치된 상태의 좌표계를 '월드좌표계'라고 합니다

그림으로 나타내면 이렇습니다.

게임상에서 캐릭터는 단순히 위치 뿐만 아니라, 회전도 있을 수 있고,
경우에 따라서는 스케일링(크기 조절)이 들어갈 수도 있기때문에
일반적으로 회전, 확대축소, 위치이동(평행이동) 3개의 정보를 하나의 행렬에 담아서 그것을 캐릭터에 적용합니다.

아래는 그것을 보여주는 그림입니다.


확대축소행렬 X 회전행렬 X 평행이동행렬 = 월드변환 행렬.

이 월드변환 행렬을 캐릭터의 위치값에 곱해주면 월드좌표계에서의 캐릭터의 상태가 나오게 되죠.
여기서 끝이냐?? 아닙니다.

게임에서 캐릭터를 화면의 어느곳에 띄울것인지를 결정하는데는 캐릭터의 위치변환 뿐만 아니라,
여기에 영향을 주는 것이 또 하나 있습니다. 바로 카메라죠.

제자리에 고정되어 움직이지 않는 물체라도,
우리가 그 물체를 바라보는 시선의 각도나, 우리의 눈의 위치에 따라서
그 물체는 우리의 시야에서 조금씩 다르게 보일겁니다.

예를들면 물체를 위에서 볼때와, 앞에서볼때는 모양이 전혀 다르겠죠.

카메라 변환은 이것을 계산하기 위한 것입니다.

간단히 말하자면 카메라변환이란, 월드좌표계에 위치한 물체를 
카메라를 중심으로 한 좌표계로 다시 변환하여 나타내는 겁니다. 
위의 그림이 바로 그것을 보여줍니다.

수식으로 나타내면 아래와 같습니다.


이 간단해보이는 4x4 행렬은 3차원공간상의 벡터의 연산으로 인해 도출된 것입니다.
카메라좌표계의 z축은 카메라가 바라보는 방향,
그리고 y축은 카메라의 윗면, x축은 카메라의 오른쪽 면이 되는데,

카메라변환을 위해서 월드좌표계에서의 캐릭터의 위치를
카메라를 중심으로한 좌표계의 각 x y z축에 투영합니다. 벡터의 내적 연산을 통해서요.

위의 행렬은 그렇게 유도된 것입니다.


자 이제 끝이냐? 아니죠. 
투영 변환이 남았습니다.


우리가 지금까지 만든 것은 3차원 공간상의 좌표이지, 이것과 실제 모니터상의 좌표와는 거리가 멉니다.
예를들면 1680 x 1080 해상도에서 캐릭터의 위치를 어떻게 계산할까요? 
카메라변환까지 마친 좌표를 그대로 쓸까요? 당연히 안되겠죠.
모니터의 해상도에 맞게 적절한 좌표로 또다시 변환을 해줘야 하는데
투영변환은 이것을 하기 위한 것입니다.

투영변환에서 목표하는것은 
카메라좌표계상의 물체를 (-1,-1,0) ~ (1,1,1)의 크기를 갖는 직육면체 공간상의 좌표로 변환하는 것입니다.
저 직육면체에서 (0,0,0)즉 원점은 게임화면의 정 중앙이 됩니다. 그리고 -1,1,0은 화면의 왼쪽 상단,
1,-1,0은 화면의 오른쪽 하단이 되죠.

투영변환은 앞의 두 변환보다 훨씬 복잡한 과정을 거칩니다.

카메라의 시야를 육면체로 나타낸다면, 절대로 저런 직사각형이 되지 않습니다.
일반적으로 거리가 멀어질수록 더 넓게 볼 수 있죠. 


위에서 바라본다면, 위 그림의 왼쪽같은 모양입니다.
왼쪽그림에서 near는 카메라가 볼 수 있는 최소거리, far는 카메라가 볼 수 있는 최대 거리를 나타냅니다.
그것을 윗 그림의 오른쪽처럼 정규화를 시키는 겁니다.
저 왼쪽 사다리꼴 안에 있는 모든 정점을 오른쪽의 직사각형안의 좌표로 변환하는 거죠.
복잡한 유도과정은 생략하고.. 



최종적으로 투영행렬은 이렇게 됩니다.
여기서 width는 게임화면의 가로 사이즈, height는 세로사이즈이며
f는 카메라의 최대거리, n은 최소거리입니다.


투영변환까지 마친 정점은 화면에 띄울 수 있는 상태로 좌표계 변환이 모두 끝난 상태입니다.
지금까지 한 것은 캐릭터의 로컬 좌표계에서
월드변환 X 카메라변환 X 투영변환을 거쳐서 실제 화면상의 좌표까지 변환되어 온거죠.

요약하자면

최종 좌표 = 로컬좌표(모델좌표) x 월드변환행렬 x 카메라변환행렬 x 투영변환행렬

이죠. 
원래는 여기서 뒤에 클리핑이라던지 그런게 더 들어갑니다만 그건 생략하고..

이렇게 변환된 모델에 실제로 색을 입히는 과정은,
셰이더를 사용하여 그래픽카드에서 더 복잡한 연산을 거쳐서
실제 세계와 비슷한 색감과 라이팅을 적용하여 테라나 블소같은 현실감있는 캐릭터가 됩니다.



최대한 골치아픈건 빼려고 노력했는데 
행렬들이 주렁주렁 달려있으니 보기에 좀 안좋긴 하네요.

게임에서 수학이 어떻게 쓰이는지를 대충 써보려고 했는데 이해가 되실지 모르겠습니다.
(_ _) 



통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
15/06/26 20:14
수정 아이콘
이분 최소 선형대수 배우신분
우주모함
15/06/26 20:19
수정 아이콘
아무래도 행렬을 기본으로 연산을 하는데다 벡터가 안쓰이는 곳이 없다보니 선형대수랑 겹치는데가 많습니다.
카미너스
15/06/26 20:20
수정 아이콘
지나가던 문과생입니다.
계속 지나가겠습니다.
우주모함
15/06/26 20:25
수정 아이콘
네 볼일보세요~ 허허허
LoNesoRA
15/06/26 20:28
수정 아이콘
같이 가겠습니다
깡디드
15/06/26 23:10
수정 아이콘
안타고 뭐해요? 먼저 갑니다~
전크리넥스만써요
15/06/27 00:05
수정 아이콘
어디까지가세요? 태워드릴께요
15/06/26 20:27
수정 아이콘
직교투영, 원근투영 유도공식을 손으로 풀어보면서 3d에 대한 이해가 꽤 넓어졌던 기억이 나네요.
이거 외에도 벡터 내/외적, 쿼터니언까지는 기본적으로 알아야 되던 시절이 있었는데
이제 엔진을 주로 쓰다보니 이런 지식을 쓸 곳이 별로 없네요. 어흑 ㅠ
우주모함
15/06/26 20:29
수정 아이콘
저도 그게 아쉽습니다. 요새 유니티가 기본이되다보니까 아예 3차원을 다룰기회조차도 거의 없어지고있죠. 그렇다고 그걸 안하자니 그거 할줄모르면 제대로된 게임프로그래머로 안보고... ㅠㅠ

저도 셰이더같은거 스스로 짜고 수정하고 하고싶은데 그런쪽은 소수의 코어프로그래머들이 독점하고있고 관련된일을 맡는것도 어렵죠 ㅠㅠ
하우두유두
15/06/26 20:58
수정 아이콘
하하 좋은내용이군요!
잿빛토끼
15/06/26 20:58
수정 아이콘
정말 뜬금없는 질문이지만. 요즘 이런 것들은 다 게임엔진에서 해줘버리는거죠??
우주모함
15/06/26 21:22
수정 아이콘
그렇긴합니다만 게임프로그래밍이라는게 기본적으로 저기서부터 시작되는거라서 저걸 이해하지못하면 단순히 캐릭터를 원하는 방향으로 회전시키는것조차도 하기힘듭니다. 평생UI만 만들다 끝날게 아니라면요. 반드시이해해야하죠.
세종머앟괴꺼솟
15/06/26 21:06
수정 아이콘
재밌어 보이네요 식이 좀 있으니 스크랩해놓고 시간날때 볼께요 크
우주모함
15/06/26 21:34
수정 아이콘
허허 재밌어보이신다니 어쩌면 게임프로그래머가 적성에 맞으실지도 모르겠습니다.
15/06/26 21:20
수정 아이콘
아니..... 템상자 확률얘기할줄 알았네요... 제목만보고서
우주모함
15/06/26 21:23
수정 아이콘
그런건 산수라고 하죠 허허
워터젤리
15/06/26 21:22
수정 아이콘
고딩때 행렬 배웠던게 다 이런데 쓰이는 거였군요
선생님이 알려주면 또 쓸데없는거 알려준다고 딴짓했는데 재밌네요
우주모함
15/06/26 21:32
수정 아이콘
네 바로 그걸 알려드리고 싶었습니다! 행렬은 적은 데이터로 많은정보를 담을수있어서 게임에 많이쓰이죠. 게임에서 캐릭터의 애니메이션도 행렬연산으로 이루어집니다. 각 애니메이션의 변환정보를 담고있는 행렬을 구성하는 데이터를 각 캐릭터의 파츠마다 모두 갖고있고 이것을 행렬로만들어서 캐릭터를 애니메이션시킵니다.
싸이유니
15/06/26 21:35
수정 아이콘
학부때 컴퓨터 그래픽스로 배운내용이네요. 가르처준건 위에내용인대 플젝요구는 사람이걸어다는걸 요구하던대요..opengl이 싫어용크크크크
우주모함
15/06/26 21:37
수정 아이콘
무리한 요구를 하셨군요. 크크크크크
15/06/26 21:38
수정 아이콘
으 다음학기에 선대 들어야겠네요..
15/06/26 21:41
수정 아이콘
전자기학만 하면 직각좌표계 원통좌표계 구좌표계때문에 머리가 깨질것 같았는데 게임도 똑같다니...
python3.x
15/06/26 23:29
수정 아이콘
전 고전역학에서 강체회전 공부하다가 오일러 때문에 이가 갈렸드랬죠 크크크크
절름발이이리
15/06/26 21:46
수정 아이콘
히드라와 질럿에 대한 글도 써주세요.
우주모함
15/06/26 21:56
수정 아이콘
히드라가 최강이라 뭐라 더 할말이 없습니다.
스타1 최강의 유닛이죠.
이상용
15/06/26 23:37
수정 아이콘
뜬금없어도 캐리어 가야죠
15/06/26 21:58
수정 아이콘
크.. 역시 이분야는 보는 사람은 정말 멋지고 재미있는데 만드는 사람은 저주하는 분야죠
게임 테스터 했을 때 게임을 평가하면서 참 열심히 만드셨는데... 정말 예쁜데... 재미가 없어요... 안돼... 망할거야... 흑흑
개고기라면
15/06/26 22:15
수정 아이콘
사영기하는 쓰고, 접벡터니 이런거까지는 필요없는 거군요.
가끔 겜돌이 친구들이 어디까지 공부해야되냐고 물어보곤 해서 어렴풋이 벡터 쓰니까 선대나 해놓으라고 했는데, 현대기하까지도 하라고 하면 되겠습니다.
SugarRay
15/06/26 22:19
수정 아이콘
저기도 잠깐 배웠는데 회전변환이 저렇게 되는군요. 저는 xyz 축에대한 회전으로 세개의 회전변환행렬을 외웠었는데... 저 변환들이 homogenous한지 아닌지랑 저기에 있는 것 말고도 따로 배웠던 건 광원의 위치를 상정했을 때 명암을 표면에 나타내는 행렬 같은 것이었는데요.
15/06/26 22:51
수정 아이콘
그래픽스 시간에 요거 다음 충돌에 관해 들어가면서
조용히 와우나 하던 기억이 나네요

불의 세례를 받아라!
15/06/27 00:29
수정 아이콘
아. 충돌도 처음에 보면 참 기가 막히죠. 마우스 이동 시마다 선택한 폴리곤 나타내는게 왜이리 느리던지..
이거랑 별개로 메탈기어 솔리드의 절단 액션을 처음 봤을 땐 테크데모로 끝날 줄 알았는데 진짜 게임으로 나오더군요;;
https://youtu.be/FadrpERMqbg?t=9m48s
좋은하루되세요
15/06/26 23:41
수정 아이콘
쿼터니언일줄 알았는데........
우주모함
15/06/27 01:27
수정 아이콘
그건 너무 크크크.. 난해하죠 ㅠㅠ
15/06/26 23:49
수정 아이콘
수학은 정말이지.. 세상을 숫자로 전환해서 그걸 정리하고 도출하고 표현했던 것이, 인류 발전에 얼마나 기여를 했는지 감도 안옵니다.
우주모함
15/06/27 01:28
수정 아이콘
수학이 지존이죠. 허허허
모지후
15/06/26 23:52
수정 아이콘
게임 스토리에서 수학을 이용한 미션 수행(?) 이런 게 나올 줄 알고 클릭했다가......
학부때 미적분은 신나게 했으면서 '행렬 왜 이거 해야하노-_-' 라고 싫어했는데 이런 데서 쓰이다니, 프로그래머 분들에게 존경심이 생기네요.
ohmylove
15/06/26 23:53
수정 아이콘
전기쟁이들도 행렬 써요~!
15/06/27 00:13
수정 아이콘
행렬은 거의 모든 과학, 공학 분야에 사용됩니다.
많은 공학적 문제들은 방정식의 해를 구하는 것으로 생각할 수 있는데
이 중 대부분은 자체가 선형이거나 선형으로 근사해서 푸는게 간단하고 합리적입니다.
최종적으로 행렬계산을 통해서 정답에 가까운 값을 구하게 되는 것이죠.
15/06/27 01:27
수정 아이콘
이래서 우리 모두는 수학과로 진학해야 합니다
시노부
15/06/27 01:56
수정 아이콘
좋은글 감사합니다 초보 임베디드개발자는 멍- 때리다 갑니다크크크
Sydney_Coleman
15/06/27 02:24
수정 아이콘
물리엔진에는 더 엄청난 것들이 들어가는 것이겠지요! 흐흐
수학자들 홈페이지 중에 물리엔진으로 각종 자연현상 구현한 그래픽이 엄청나게 유려한 분이 있었던 것 같은데 어느 분이었는지 기억이 잘 안 나네요.

그런데 좀 이상한 것이, 좌->우 곱을 적용하는 행렬식에서, 평행이동 매트릭스는 본문에 올라온 것의 transpose가 되어야 하지 않나요? local coordinate column의 네번째 행을 1로 두고 평행이동을 구현하려면 행렬의 네번째 칼럼에 평행이동값(T_{x_i})이 들어가야 할 텐데요. 역행렬 역시 넷째 열 값에 단순히 -를 붙인 형태일 테고..

이어지는 내용의 카메라 변환에서 좌표열이 아닌 좌표행을 사용하신 걸 보면 따오신 이미지에서 역시 그런 점들이 혼동된 것이 아닌가 합니다.(좌표행을 쓰면 평행이동 행렬의 넷째 행에 이동값이 들어가는 게 맞고, 이 행렬식을 고대로 transpose 시키면 좌표열을 사용한 행렬식이 나오는데 이 때 평행이동행렬의 넷째 열에 이동값이 들어가게 돼죠.)
우주모함
15/06/27 06:17
수정 아이콘
오 지금보니 그렇군요. 그림이 잘못됐네요. ;;
좌표열이 아니라 좌표행으로 앞에 붙이는게 맞는 것 같습니다.
Sydney_Coleman
15/06/27 10:56
수정 아이콘
투영행렬 z 스케일링 팩터도 조금 이상한 것 같은데요.

[0,1]로의 좌표변환이라면 z=f 선상에 있는 좌표가 z'=1 로 변환되어야 하는데, 좌표행을 표기하신 행렬에 때려넣으면 z' = f*z/(f-n)-fn/(f-n) 가 되어(이 때 1' = z 는 dummy value이니 무시) z=f일 때 z' = f, z=(f+n)/2일 때 z'=f/2 가 되므로 scaling이 명백히 [0,1]이 아니라 [0,f]가 되게 됩니다. 그림에 수정이 필요한 것 같네요.

또한 주어진 투영행렬 계산에 따르면 x, y 투영값의 경우 역시 [-1,1]X[-1,1]로 crop 해낸다 할지라도 n값 조절에 따라 xz plane 혹은 yz plane을 보았을 때 그림에 나타난 것처럼 도메인이 방사형 사다리꼴이 아니라 단순한 직사각형 모양의 영역이 되는 것 같습니다. 직접 작성하신 혹은 이미 작성된 문서에서 식을 따오시면서 조금 순서를 혼동하신 것이 아닐까 합니다.
뭐랄까요. 그림에 나타난 방사형 사다리꼴 투영변환의 경우, 최종 x'좌표는 x,z plane tangent값(x/z) 이 똑같으면 모조리 같은 x' 값을 가져야 하는데 이건 선형변환이 안 돼죠. 그래서 어찌 한 건가, 하고 행렬을 살펴보니 이상한 점들이 이외에도 몇가지 있어서 댓글로 달았습니다. 아마도 x' = x/z*scaling factor 로 한 번 비선형 변환을 한 후에, 여기 붙은 scaling factor만 따로 떼서 올려주신 최종 투영행렬로 옮겨버린 것 같네요.
우주모함
15/06/27 12:59
수정 아이콘
저그림엔 생략되어있습니다만 투영행렬을 거친 정점은 0에서1사이의 값에 이전정점의 z가 곱해진값입니다. 그래서 저런거고 말씀하신대로 원근투영은 방사형 사다리꼴의영역을 직사각형으로 만드는겁니다. 원근감을 위해서죠. 그래야 멀리떨어져있는물체의 x y의 절대값이 작아질테니까요.

자세한유도과정은 여길보시면됩니다.

http://createcode.tistory.com/m/post/15
Sydney_Coleman
15/06/27 14:18
수정 아이콘
네. 제 말(x' = x/z)이 그말(X_i = z*x_i)이죠. 스케일링 팩터 따로 떼서 투영변환행렬에 때려넣은 것 같다는 말도 링크 내용과 같구요.

말인즉슨, 본문의 [최종 좌표 = 로컬좌표(모델좌표) x 월드변환행렬 x 카메라변환행렬 x 투영변환행렬] 이라는 행렬식은 굉장한 오해를 불러올 수 있으니, 우주모함 님께서 본문에 생략하신 부분에 대해 부연이 더해지거나 식이 수정되어야 한다는 것입니다. 선형변환이 아니기 때문에 수학적으로 위 식이 성립하지 않으니까요.
우주모함
15/06/27 14:29
수정 아이콘
실제로 연산할때 로컬좌표에 월드행렬 x 카메라행렬 x 투영행렬을 곱합니다.

그 결과값에 z값이 붙어있을 뿐입니다. 그리고 선형변환이 아니라는건 뭘말하시는건지요?
선형변환이니 뭐니를 학창시절에 하긴 했던 것 같은데, 게임업계에서는 그런걸 잘 따지지 않아서
뭘 말하시고자 하는지는 잘 모르겠구요,
수학적으로 성립하지 않는다는 말도 이해가 안가는군요.
z가 저기서 생략되어있다는걸 표시하지 않았기 때문이라는 건지요?

어차피 여기서 저 변환행렬이 어떻게 유도되는지에 대해서 설명된 건 책도있고 사이트도 있고 많습니다.
하지만 제 목적은 그걸 여기다 강의하고자 쓴 글이 아닙니다.
그냥 수학이라는놈이 게임에서 이런식으로 쓰인다 라고 소개만 할 뿐이고
관심있으신 분들이라면 따로 찾아보시던지 하시면 되죠.
여기가 게임개발 사이트도 아니고 유도과정을 설명할 필요가 있을까요? 그렇게 자세히 쓸 필요가 있는지도 의문입니다.

그럴거면 그냥 책하나를 통째로 올리면 되겠죠?

뭐가 그렇게 불만이신건가요? 대충대충 흘러가듯이 써있어서 그게 불만이신건지요?
Sydney_Coleman
15/06/27 14:38
수정 아이콘
본문에 써 주신 투영변환행렬만 로컬좌표 좌표행 뒤에 붙였을 때의 이야기입니다. 상수로 이뤄진 행렬이니까요. 1/z 붙는 걸 본문에서 누락하셨으니까요. 유도과정을 하나하나 자세히 올리라는 말이 아니라 작성자분이 생략한 부분에 의해 본문 내용에 오류가 생긴다고요. 오류에 대해 댓글을 작성하니 무슨 불만 있냐고요?
뭐 아무튼 이미 서로 무슨말 하는지는 서로 알고 있는 것 같네요. 이만 하지요.
우주모함
15/06/27 14:40
수정 아이콘
투영변환행렬만 로컬좌표의 좌표행 뒤에 곱한다뇨?
월드 X 카메라 X 투영행렬을 로컬좌표에 곱하는 것이지 투영행렬만 따로 떼서 곱하지 않습니다.
그리고 말했다시피 그렇게 자세하게 쓸 필요가 없다고 생각했기 때문입니다. 자세히 쓸 필요가 없다고 생각해서
이것저것 생략하고 넘어간게 많으니까 논리적인 오류가 많아보일 수 밖에 없죠.

특히 투영변환 행렬의 z값같은거. 이걸 여기서 왜 써야하는지도 모르겠는게, 저는 그냥
월드, 카메라, 투영 행렬을 차례로 곱한것을 로컬좌표에 곱해서, 저런 변환과정이 차례로 이루어진다는 것만을 보이려고 했을 뿐이지
쓸데없이 z값이 붙어있네, 뭐 스케일링을 위해서 z가 붙어있네 어쩌네 이런걸 괜히 사족으로 달아서
혼동을 주고싶지 않았고, 어차피 게임개발을 목적으로 하는 것이 아닌 이상 z값에 대해서는 그렇게 자세히 아실 필요도 없고
애초에 그런게 목적이 아니었습니다.
Sydney_Coleman
15/06/27 14:57
수정 아이콘
하나하나의 디테일까지 모조리 올리지 않아 불만이 있는 게 아니라 그냥 글 내의 자체적인 수학적 오류가 있어서 댓글로 달았습니다. 애초에 좌표열 사용한 평행이동 행렬도 잘못 표기되어 있기도 했구요.
글 내부의 오류 수정보다 먼저 불만있냐고 물으실 정도로 제 댓글에 기분이 상하셨나 보군요. 맞춤법 지적도 아니고 수학이란 단어가 제목에 들어간 글의 수학적 오류에 대한 댓글인데..
우주모함
15/06/27 15:09
수정 아이콘
Sydney_Coleman 님// 평행이동행렬은 애초에 제가 퍼온 그림자체가 잘못되어있었기 때문에
그건 인정했구요.

그리고 님 말대로 얘기하면 제가 밑에 댓글단대로 카메라행렬이 내적으로 유도된다느니 하는것도 맞지않죠.
평행이동에 대한 이야기가 빠져있으니까.

그리고 당연히 기분나쁠수밖에요? 애초에 자세히 유도과정을 설명하기보다는 그냥 대략적인 개념만 이런식으로 사용된다는 것만 설명하기 위한 글에 이렇게 하나하나 태클거시는거 자체가 이해가 안가는군요.
우주모함
15/06/27 15:13
수정 아이콘
게임개발 입문서같은 것들을 봐도 유도과정이 자세히 설명된 것이 아니면
제가 글에 써놓은대로 투영변환은 정점값을 -1,-1,0에서 1,1,1까지로 변환시키는 행렬이다.
이런식으로만 소개되어 있습니다.

저도 그런 입문서들처럼 자세히 쓸 필요는 없다고 생각했기때문에 z값에 대한 것도 그냥 제외하고
투영행렬 관련 행렬이 소개되어있는 이미지만 가져다가 여기다 올린 것이구요.
님이 안그래도 그거 어떻게된거냐고 하시길래 제가 설명을 드렸죠. 사실 저기엔 z값이 생략되어있다고.
올릴필요가 없다 생각해서 그냥 올리지 않았다고.

제가 처음부터 짜증낸건 아니었지요
첨에는 그렇게 자초지종을 설명을 드렸는데 계속 이러시니 짜증이 날 수 밖에요.
우주모함
15/06/27 14:56
수정 아이콘
이를테면 저기 카메라변환 행렬이요.
본문에는 그냥 벡터의 내적연산으로 저런 행렬이 도출된다고 써놨지만 실제로는
벡터의 내적을 통해서 카메라의 좌표축으로 투영하는 것 이외에,
좌표계의 중심을 카메라의 위치가 좌표계의 원점이 되게 하도록
월드좌표를 평행이동 시키는 과정이 하나 더있습니다만, 그런것도 그냥 다 생략해버리고 저렇게 쓴거구요.
Sydney_Coleman
15/06/27 15:33
수정 아이콘
음. 제가 무슨말씀 드리는지 아직 전달이 잘 안 된 것 같아 댓글 답니다.
카메라변환행렬은 회전*평행이동 행렬입니다. 이미 글머리에 회전 따로, 평행이동 따로 소개되어 있으니 그냥 월드변환이나 카메라변환이나 실상 구조는 똑같죠. 거기에 단위벡터의 변환좌표기준성분에 의한 회전행렬에 대한 설명이나 Eye 벡터 성분에 대한 평행이동 등은 생략되었어도 '수식적으로는 오류가 없는' 거죠.

투영행렬에서 우주모함 님께서 생략하신 결과는 전혀 다릅니다. 1/z 가 결과식에서 누락되어 있죠.
이를테면 A는 B, C 를 거쳐 D가 된다. 이 때 B는 b에 의해 C가 된다. 이런 설명을, 'A는 b에 의해 D가 된다.' 이정도로는 써도 큰 상관은 없어요. 확장돼서 해석될 수 있는 줄글이니까요.
하지만 수식은 다르죠. 수식으로 대강 aA = B, bB = C, cC = D 로 둬 볼까요. D=cbaA가 올바른 수식이라고 하지요. 그런데 우주모함 님께서는 그걸 D=bA, 혹은 D=cbA, 또는 D=baA로 쓰신 겁니다.

애초에 투영행렬을 월드행렬, 카메라행렬을 연속해서 곱해줘서 변환한 값에다 마지막으로 곱해서 변환해 주면 우리 모니터에 나타나는 값이 된다, 하시며 투영행렬의 행렬값을 엔트리 하나하나마다 쓰지 않으셨으면 몰라도, 써주신 행렬 그대로 넣으면 식이 안맞다는 말입니다.

개념 소개글일수록 적절한 생략이 중요하고, 그러면서 무엇보다도 글 내부적인 오류는 없어야 한다고 생각하는지라 까탈스러웠는지도 모르겠습니다. 첫 댓글과 두번째 댓글, 세번째 댓글까지는 저로썬 큰 문제없이 '글에서 이부분이 좀 잘못된 것 같은데 고치시는 게 어떻겠냐' 정도라고 생각하는데, 냅다 '개념소개글에 무슨 불만있냐'는 댓글을 다셨다고 생각해서 저도 좀 공격적이었던 것 같네요. 말하는 사람과 받아들이는 사람의 입장 차이는 항상 큰 것 같습니다.

아무튼.. 정말 이만 하겠습니다.
우주모함
15/06/27 15:40
수정 아이콘
확대축소 * 회전 * 평행이동행렬이라고 설명한건 월드행렬이지 카메라행렬에는 그냥
회전에 대한 얘기만 써놨죠. 글을 자세히 보시기 바랍니다.

그리고 z에 대한 얘기를 자세히 쓰지않은건 제가 위에도 얘기했죠. 게임개발 입문서들도
유도과정을 자세히 쓰지 않는이상은 다 저런식으로 넘어간다고요.

제 얘기를 끝까지 이해못하시나본데요,
z값 하나 생략했다고 틀렸네 뭐네 할 계제가 아니라는 말입니다.

그리고 제가 냅다 그랬다고요?
첨에 님이 그러시길래 위에 이미지가 잘못된것에 대해서는 인정했습니다만
z값에 대한건 일부러 넣지않았다고, 넣을 필요가 없다고 생각해서 그냥 제외시켰다고 분명히 얘기했는데
계속 이러시는게 님인가요 저인가요? 짜증이 날 수 밖에요?

전 그런의도로 쓴 글이 아니라는데 왜 혼자 그러시냐구요.
지앞영소녀시대
15/06/27 14:55
수정 아이콘
글 재미있게 잘 읽었습니다 크크 게임하면서 '엥? 그거 마야로 그려서 파일 넣어놓으면 되는거 아니냐?' <-솔직히 이 이상도 이하도 아니었는데 역시

허투로 만드는건 세상에 아무것도 없군요 앞으로 감사하면서 게임을 해야겠네요 크크
우주모함
15/06/27 14:56
수정 아이콘
재밌게 봐주셨다니 감사합니다.
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회 추천
59416 [일반] 15개월 동안 15분 운동 후기 [40] 화잇밀크러버24989 15/06/27 24989 12
59415 [일반] 가족? [22] 구들장군4764 15/06/27 4764 15
59414 [일반] 인터넷 유머게시판들이 어느 순간부터 바이럴의 천국이 됐네요 [26] 만트리안11211 15/06/27 11211 4
59413 [일반] 미국에서 가장 많은 돈을 번 자수성가 여성 Top10 [9] 김치찌개3802 15/06/27 3802 0
59411 [일반] 전 세계에서 가장 영향력 있는 여성 Top10 [9] 김치찌개3414 15/06/27 3414 0
59410 [일반] 메르스와 비슷하면서도 다른 천연두 이야기 [17] 삭제됨4322 15/06/27 4322 12
59409 [일반] [해축] 어제의 bbc 이적가십 [17] pioren4541 15/06/27 4541 1
59408 [일반] 천재 가수 김광진의 노래들 [23] ohmylove6605 15/06/27 6605 4
59407 [일반] 스포유) 주인공 몽키 D.루피의 능력을 예측해보자. [41] 공허의지팡이11129 15/06/27 11129 4
59406 [일반] 2004년. 몽환에 빠진 중3병 환자를 달래준 노래. [6] 뀨뀨4251 15/06/27 4251 2
59405 [일반] 80년대 20대의 필력과 필체 [31] 낭만토스7980 15/06/27 7980 5
59403 [일반] 미국에서 가장 많은 흥행수입을 올린 한국 영화 Top10 [9] 김치찌개5905 15/06/27 5905 1
59402 [일반] 축하합니다, 이제 당신들은 서로에게 미안해하지 않아도 되겠군요. [29] 저글링앞다리11136 15/06/27 11136 93
59401 [일반] 교환 학생들을 보면서 느낀 점 [20] 웃다.5556 15/06/27 5556 5
59399 [일반] 바둑판으로 보는 아이돌 이야기- 비스무리한 단상 [12] 좋아요4657 15/06/27 4657 5
59398 [일반] [야구]SK는 결단을 내려야 하지 않을까요? [54] 이홍기8362 15/06/27 8362 3
59397 [일반] 미국 대법원이 전국적으로 동성 결혼 합법화했네요 [286] ShaRp11743 15/06/26 11743 22
59396 [일반] 팬 의혹 들은 김에 제대로 써보는 신인걸그룹 설명서, 오마이걸 [12] 좋아요9659 15/06/26 9659 3
59395 [일반] [짤평] <소수의견> - 뉴스보다 현실적인 픽션 [28] 마스터충달4542 15/06/26 4542 2
59393 [일반] 게임 속의 수학 [56] 우주모함13244 15/06/26 13244 13
59392 [일반] (수정) 민상토론 징계에 대한 기사가 나왔습니다. [32] 모여라 맛동산8801 15/06/26 8801 5
59390 [일반] 이번에 예비군 동미참을 다녀오면서 조별평가의 위력을 느꼈습니다. [39] 자전거도둑12290 15/06/26 12290 0
59389 [일반] 민주주의를 기다리며 [8] 아수라발발타3699 15/06/26 3699 21
목록 이전 다음
댓글

+ : 최근 1시간내에 달린 댓글
+ : 최근 2시간내에 달린 댓글
맨 위로