:: 게시판
:: 이전 게시판
|
- 자유 주제로 사용할 수 있는 게시판입니다.
- 토론 게시판의 용도를 겸합니다.
통합규정 1.3 이용안내 인용"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
15/06/26 20:27
직교투영, 원근투영 유도공식을 손으로 풀어보면서 3d에 대한 이해가 꽤 넓어졌던 기억이 나네요.
이거 외에도 벡터 내/외적, 쿼터니언까지는 기본적으로 알아야 되던 시절이 있었는데 이제 엔진을 주로 쓰다보니 이런 지식을 쓸 곳이 별로 없네요. 어흑 ㅠ
15/06/26 20:29
저도 그게 아쉽습니다. 요새 유니티가 기본이되다보니까 아예 3차원을 다룰기회조차도 거의 없어지고있죠. 그렇다고 그걸 안하자니 그거 할줄모르면 제대로된 게임프로그래머로 안보고... ㅠㅠ
저도 셰이더같은거 스스로 짜고 수정하고 하고싶은데 그런쪽은 소수의 코어프로그래머들이 독점하고있고 관련된일을 맡는것도 어렵죠 ㅠㅠ
15/06/26 21:22
그렇긴합니다만 게임프로그래밍이라는게 기본적으로 저기서부터 시작되는거라서 저걸 이해하지못하면 단순히 캐릭터를 원하는 방향으로 회전시키는것조차도 하기힘듭니다. 평생UI만 만들다 끝날게 아니라면요. 반드시이해해야하죠.
15/06/26 21:32
네 바로 그걸 알려드리고 싶었습니다! 행렬은 적은 데이터로 많은정보를 담을수있어서 게임에 많이쓰이죠. 게임에서 캐릭터의 애니메이션도 행렬연산으로 이루어집니다. 각 애니메이션의 변환정보를 담고있는 행렬을 구성하는 데이터를 각 캐릭터의 파츠마다 모두 갖고있고 이것을 행렬로만들어서 캐릭터를 애니메이션시킵니다.
15/06/26 21:35
학부때 컴퓨터 그래픽스로 배운내용이네요. 가르처준건 위에내용인대 플젝요구는 사람이걸어다는걸 요구하던대요..opengl이 싫어용크크크크
15/06/26 21:58
크.. 역시 이분야는 보는 사람은 정말 멋지고 재미있는데 만드는 사람은 저주하는 분야죠
게임 테스터 했을 때 게임을 평가하면서 참 열심히 만드셨는데... 정말 예쁜데... 재미가 없어요... 안돼... 망할거야... 흑흑
15/06/26 22:15
사영기하는 쓰고, 접벡터니 이런거까지는 필요없는 거군요.
가끔 겜돌이 친구들이 어디까지 공부해야되냐고 물어보곤 해서 어렴풋이 벡터 쓰니까 선대나 해놓으라고 했는데, 현대기하까지도 하라고 하면 되겠습니다.
15/06/26 22:19
저기도 잠깐 배웠는데 회전변환이 저렇게 되는군요. 저는 xyz 축에대한 회전으로 세개의 회전변환행렬을 외웠었는데... 저 변환들이 homogenous한지 아닌지랑 저기에 있는 것 말고도 따로 배웠던 건 광원의 위치를 상정했을 때 명암을 표면에 나타내는 행렬 같은 것이었는데요.
15/06/27 00:29
아. 충돌도 처음에 보면 참 기가 막히죠. 마우스 이동 시마다 선택한 폴리곤 나타내는게 왜이리 느리던지..
이거랑 별개로 메탈기어 솔리드의 절단 액션을 처음 봤을 땐 테크데모로 끝날 줄 알았는데 진짜 게임으로 나오더군요;; https://youtu.be/FadrpERMqbg?t=9m48s
15/06/26 23:52
게임 스토리에서 수학을 이용한 미션 수행(?) 이런 게 나올 줄 알고 클릭했다가......
학부때 미적분은 신나게 했으면서 '행렬 왜 이거 해야하노-_-' 라고 싫어했는데 이런 데서 쓰이다니, 프로그래머 분들에게 존경심이 생기네요.
15/06/27 00:13
행렬은 거의 모든 과학, 공학 분야에 사용됩니다.
많은 공학적 문제들은 방정식의 해를 구하는 것으로 생각할 수 있는데 이 중 대부분은 자체가 선형이거나 선형으로 근사해서 푸는게 간단하고 합리적입니다. 최종적으로 행렬계산을 통해서 정답에 가까운 값을 구하게 되는 것이죠.
15/06/27 02:24
물리엔진에는 더 엄청난 것들이 들어가는 것이겠지요! 흐흐
수학자들 홈페이지 중에 물리엔진으로 각종 자연현상 구현한 그래픽이 엄청나게 유려한 분이 있었던 것 같은데 어느 분이었는지 기억이 잘 안 나네요. 그런데 좀 이상한 것이, 좌->우 곱을 적용하는 행렬식에서, 평행이동 매트릭스는 본문에 올라온 것의 transpose가 되어야 하지 않나요? local coordinate column의 네번째 행을 1로 두고 평행이동을 구현하려면 행렬의 네번째 칼럼에 평행이동값(T_{x_i})이 들어가야 할 텐데요. 역행렬 역시 넷째 열 값에 단순히 -를 붙인 형태일 테고.. 이어지는 내용의 카메라 변환에서 좌표열이 아닌 좌표행을 사용하신 걸 보면 따오신 이미지에서 역시 그런 점들이 혼동된 것이 아닌가 합니다.(좌표행을 쓰면 평행이동 행렬의 넷째 행에 이동값이 들어가는 게 맞고, 이 행렬식을 고대로 transpose 시키면 좌표열을 사용한 행렬식이 나오는데 이 때 평행이동행렬의 넷째 열에 이동값이 들어가게 돼죠.)
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
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가 저기서 생략되어있다는걸 표시하지 않았기 때문이라는 건지요? 어차피 여기서 저 변환행렬이 어떻게 유도되는지에 대해서 설명된 건 책도있고 사이트도 있고 많습니다. 하지만 제 목적은 그걸 여기다 강의하고자 쓴 글이 아닙니다. 그냥 수학이라는놈이 게임에서 이런식으로 쓰인다 라고 소개만 할 뿐이고 관심있으신 분들이라면 따로 찾아보시던지 하시면 되죠. 여기가 게임개발 사이트도 아니고 유도과정을 설명할 필요가 있을까요? 그렇게 자세히 쓸 필요가 있는지도 의문입니다. 그럴거면 그냥 책하나를 통째로 올리면 되겠죠? 뭐가 그렇게 불만이신건가요? 대충대충 흘러가듯이 써있어서 그게 불만이신건지요?
15/06/27 14:38
본문에 써 주신 투영변환행렬만 로컬좌표 좌표행 뒤에 붙였을 때의 이야기입니다. 상수로 이뤄진 행렬이니까요. 1/z 붙는 걸 본문에서 누락하셨으니까요. 유도과정을 하나하나 자세히 올리라는 말이 아니라 작성자분이 생략한 부분에 의해 본문 내용에 오류가 생긴다고요. 오류에 대해 댓글을 작성하니 무슨 불만 있냐고요?
뭐 아무튼 이미 서로 무슨말 하는지는 서로 알고 있는 것 같네요. 이만 하지요.
15/06/27 14:40
투영변환행렬만 로컬좌표의 좌표행 뒤에 곱한다뇨?
월드 X 카메라 X 투영행렬을 로컬좌표에 곱하는 것이지 투영행렬만 따로 떼서 곱하지 않습니다. 그리고 말했다시피 그렇게 자세하게 쓸 필요가 없다고 생각했기 때문입니다. 자세히 쓸 필요가 없다고 생각해서 이것저것 생략하고 넘어간게 많으니까 논리적인 오류가 많아보일 수 밖에 없죠. 특히 투영변환 행렬의 z값같은거. 이걸 여기서 왜 써야하는지도 모르겠는게, 저는 그냥 월드, 카메라, 투영 행렬을 차례로 곱한것을 로컬좌표에 곱해서, 저런 변환과정이 차례로 이루어진다는 것만을 보이려고 했을 뿐이지 쓸데없이 z값이 붙어있네, 뭐 스케일링을 위해서 z가 붙어있네 어쩌네 이런걸 괜히 사족으로 달아서 혼동을 주고싶지 않았고, 어차피 게임개발을 목적으로 하는 것이 아닌 이상 z값에 대해서는 그렇게 자세히 아실 필요도 없고 애초에 그런게 목적이 아니었습니다.
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
이를테면 저기 카메라변환 행렬이요.
본문에는 그냥 벡터의 내적연산으로 저런 행렬이 도출된다고 써놨지만 실제로는 벡터의 내적을 통해서 카메라의 좌표축으로 투영하는 것 이외에, 좌표계의 중심을 카메라의 위치가 좌표계의 원점이 되게 하도록 월드좌표를 평행이동 시키는 과정이 하나 더있습니다만, 그런것도 그냥 다 생략해버리고 저렇게 쓴거구요.
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
글 재미있게 잘 읽었습니다 크크 게임하면서 '엥? 그거 마야로 그려서 파일 넣어놓으면 되는거 아니냐?' <-솔직히 이 이상도 이하도 아니었는데 역시
허투로 만드는건 세상에 아무것도 없군요 앞으로 감사하면서 게임을 해야겠네요 크크
|