성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[tree soap] 아차! f는 기억이 나는데, m은 ㅜㅜ 감사합니다!!! ^...
[정성태] 'm'은 decimal 타입의 숫자에 붙는 접미사입니다. ...
[정성태] https://lxr.sourceforge.io/ http...
[정성태] VT sequences to "CONOUT$" vs. STD_O...
[정성태] NetCoreDbg is a managed code debugg...
[정성태] Evaluating tail call elimination in...
[정성태] What’s new in System.Text.Json in ....
[정성태] What's new in .NET 9: Cryptography ...
[정성태] 아... 제시해 주신 "https://akrzemi1.wordp...
[정성태] 다시 질문을 정리할 필요가 있을 것 같습니다. 제가 본문에...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Unity - World matrix(unity_ObjectToWorld)로부터 TRS(이동/회전/크기) 행렬을 복원하는 방법</h1> <p> 지난 글에서,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Unity - shader의 World matrix(unity_ObjectToWorld)를 수작업으로 구성 ; <a target='tab' href='http://www.sysnet.pe.kr/2/0/11633'>http://www.sysnet.pe.kr/2/0/11633</a> </pre> <br /> unity_ObjectToWorld 행렬을 직접 구성해 봤습니다.<br /> <br /> 월드 행렬은 T(Translate), R(Rotation), S(Scale) 연산으로 이뤄지는데요, 지난 글에서는 unity_ObjectToWorld로부터 Translate 값들만 복원하는 법을 설명했습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > moveMatrix[0] = float4(1, 0, 0, unity_ObjectToWorld._m03); moveMatrix[1] = float4(0, 1, 0, unity_ObjectToWorld._m13); moveMatrix[2] = float4(0, 0, 1, unity_ObjectToWorld._m23); moveMatrix[3] = float4(0, 0, 0, unity_ObjectToWorld._m33); </pre> <br /> 그럼, 혹시 회전과 크기 연산에 대해서도 가져올 수 있지 않을까요? 다시 말해, Unity 에디터의 Inspector 창에서 설정한 Transform 설정들을 그대로 활용해 unity_ObjectToWorld를 다시 재구성해 보는 것입니다.<br /> <br /> 다행히, 이에 대해 아래의 글에서 공식을 설명하고 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Given this transformation matrix, how do I decompose it into translation, rotation and scale matrices? ; <a target='tab' href='https://math.stackexchange.com/questions/237369/given-this-transformation-matrix-how-do-i-decompose-it-into-translation-rotati'>https://math.stackexchange.com/questions/237369/given-this-transformation-matrix-how-do-i-decompose-it-into-translation-rotati</a> </pre> <br /> 덧글에 따라 Scale의 경우 다음과 같이 복원할 수 있고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > float4x4 scaleMatrix; // Scale 행렬 vector sx = vector(unity_ObjectToWorld._m00, unity_ObjectToWorld._m10, unity_ObjectToWorld._m20, 0); vector sy = vector(unity_ObjectToWorld._m01, unity_ObjectToWorld._m11, unity_ObjectToWorld._m21, 0); vector sz = vector(unity_ObjectToWorld._m02, unity_ObjectToWorld._m12, unity_ObjectToWorld._m22, 0); float scaleX = length(sx); float scaleY = length(sy); float scaleZ = length(sz); scaleMatrix[0] = float4(scaleX, 0, 0, 0); scaleMatrix[1] = float4(0, scaleY, 0, 0); scaleMatrix[2] = float4(0, 0, scaleZ, 0); scaleMatrix[3] = float4(0, 0, 0, 1); </pre> <br /> Rotation은 이렇게 복원할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > float4x4 rotationMatrix; rotationMatrix[0] = float4(unity_ObjectToWorld._m00 / scaleX, unity_ObjectToWorld._m01 / scaleY, unity_ObjectToWorld._m02 / scaleZ, 0); rotationMatrix[1] = float4(unity_ObjectToWorld._m10 / scaleX, unity_ObjectToWorld._m11 / scaleY, unity_ObjectToWorld._m12 / scaleZ, 0); rotationMatrix[2] = float4(unity_ObjectToWorld._m20 / scaleX, unity_ObjectToWorld._m21 / scaleY, unity_ObjectToWorld._m22 / scaleZ, 0); rotationMatrix[3] = float4(0, 0, 0, 1); </pre> <br /> 그래서 최종적으로 다음과 같은 유형으로 unity_ObjectToWorld를 분해 후 재구성할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > v2f vert (appdata v) { v2f o; float4 pos = v.vertex; float4x4 scaleMatrix; vector sx = vector(unity_ObjectToWorld._m00, unity_ObjectToWorld._m10, unity_ObjectToWorld._m20, 0); vector sy = vector(unity_ObjectToWorld._m01, unity_ObjectToWorld._m11, unity_ObjectToWorld._m21, 0); vector sz = vector(unity_ObjectToWorld._m02, unity_ObjectToWorld._m12, unity_ObjectToWorld._m22, 0); float scaleX = length(sx); float scaleY = length(sy); float scaleZ = length(sz); scaleMatrix[0] = float4(scaleX, 0, 0, 0); scaleMatrix[1] = float4(0, scaleY, 0, 0); scaleMatrix[2] = float4(0, 0, scaleZ, 0); scaleMatrix[3] = float4(0, 0, 0, 1); float4x4 rotationMatrix; rotationMatrix[0] = float4(unity_ObjectToWorld._m00 / scaleX, unity_ObjectToWorld._m01 / scaleY, unity_ObjectToWorld._m02 / scaleZ, 0); rotationMatrix[1] = float4(unity_ObjectToWorld._m10 / scaleX, unity_ObjectToWorld._m11 / scaleY, unity_ObjectToWorld._m12 / scaleZ, 0); rotationMatrix[2] = float4(unity_ObjectToWorld._m20 / scaleX, unity_ObjectToWorld._m21 / scaleY, unity_ObjectToWorld._m22 / scaleZ, 0); rotationMatrix[3] = float4(0, 0, 0, 1); float4x4 moveMatrix; moveMatrix[0] = float4(1, 0, 0, unity_ObjectToWorld._m03); moveMatrix[1] = float4(0, 1, 0, unity_ObjectToWorld._m13); moveMatrix[2] = float4(0, 0, 1, unity_ObjectToWorld._m23); moveMatrix[3] = float4(0, 0, 0, unity_ObjectToWorld._m33); float4x4 transformMatrix = mul(mul(moveMatrix, rotationMatrix), scaleMatrix); pos = mul(transformMatrix, pos); pos = mul(UNITY_MATRIX_V, pos); pos = mul(UNITY_MATRIX_P, pos); o.vertex = pos; o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; } </pre> <br /> 이렇게 shader를 구성하고 Unity 에디터의 Transform 영역에서 Position, Rotation, Scale 값을 변경하면 그대로 값이 반영되는 것을 확인할 수 있습니다. (물론, 부동 소수점 연산의 특성상 미세한 오차는 있습니다.)<br /> <br /> (<a target='tab' href='http://www.sysnet.pe.kr/bbs/DownloadAttachment.aspx?fid=1326&boardid=331301885'>첨부 파일은 이 글의 shader를 포함</a>합니다.)<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
5553
(왼쪽의 숫자를 입력해야 합니다.)