본문 바로가기
Shader

빌보드(Billboard)를 만들어 봅시다 2부. 이제 진짜 만들어 봅시다

by 대마왕J 2024. 7. 28.

에고에고. 사전설명으로 글 하나를 써버렸네요. 
어쩔 수 없지. 

그럼 이번엔 다시 또 이어서 해 봅시다. 

'월드' 에서 '뷰' 행렬로 바꾸는건 이동을 생각 안하면 회전뿐이고, 
심지어 물체가 뷰.. 즉 카메라 방향의 '반대편' 으로 회전하는 것을 말하는 것이다! 라는게 지난 글의 요약이었는데요 

뭐 좋아요. 

그럼.

이번에는

진짜 해보죠

빌보드를 만들어 봅시다 

여기 일단 월드 좌표계에서 놀고 있는 박스가 있단 말예요

이젠 우린 알죠 . '우리는 뷰 좌표계에서 저 놈을 기울어진것처럼 바라보고 있지만, 저 놈은 월드 좌표계 기준에서 보면 똑바로 있는거다' 

후후 좋아요. 그럼 셰이더 그래프를 열고.. 
아래처럼 해 줍시다. world position을 받아올 거예요. 그리고 쓸데없는 split과 combine을 거치죠? 저건 RGB만 되어 있는 Posiotion을  RGBA로 만들어 주려고 그러는 거예요. float4 가 필요해서요.  

그 다음에 이걸 꺼내줍니다. 

변환행렬 'InverseView' 

오오??? 

변환행렬은 아까 뭐 좌표 변환해주는 행렬인거고.. 
view 행렬(카메라 좌표계, 카메라 공간)을 곱해주면 .. 물체가 카메라의 반대편으로 회전한다고 했잖아요? 
그럼...view 행렬의 반대인 Inverse View 행렬은 뭐 하는 거겠어요? 

물체를 카메라 방향으로 회전시켜주는 행렬이 되어버린 거예요 

좋아요 이걸 행렬곱 해 줍시다 
이렇게 하면 물체가 '카메라 방향으로 돌게' 행렬연산이 되는 겁니다. 

흠.. 근데 그냥 쓸 수가 없네요. 
왜냐면.. Inverse View 행렬을 곱했기 때문인데요. 이러면 현재 좌표계는 world 좌표계가 되어요. 월드 -> 뷰 였던걸 뷰 -> 월드 로 만든게 되니까요 
근데 셰이더 그래프에서는 ... 오브젝트 스페이스를 원한단 말이죠? 그래서 한 번 더 행렬연산이 필요하겠네요. 

그럴때 쓸만한 변환 노드가 있죠 
 absoluteWorld에서 Object로 변환해 주는 Transform 노드! 

그럼 이렇게 되고 

적용하면 

와!!! 빌보드 처럼 움직입니다 . 나만 봐라봐요!!

물론 그림자는 빌보드 처리가 안되어서 저렇게 나오고 있는거지만, 그림자야 꺼버리면 되고, 무엇보다 빌보드가 되고 있다는 증거이기도 하니까요. 

그럼 끝??? 

 

이렇게 하면 안됩니다 

그런데 치명적 문제가 있어요. 월드 -> 뷰 행렬을 역으로 했다는데가 문제인데요. 
무슨 문제냐면 

회전이 먹어 ㅋㅋㅋㅋㅋㅋㅋㅋㅋ 

생각해 보니 그렇죠. 월드에 이놈이 회전을 안하면 괜찮은데, 아예 월드에서부터 기울어져 있으면 기울어져 있는채로 빌보드 될거아녀... 

즉 물체의 월드 회전을 막을 수가 없다는 문제가 됩니다. 이걸 해결하려면 회전을 또 역으로 하고 난리를 치고 가정이 무너지고 사회가 무너지고 ... 

안해. 

 

좋은 방법이 있습니다. 

흠 좋아요. 진정하고. 

그럼 해결책은 뭘까요? 월드 좌표계에서 시작하니까, 월드에 이 녀석이 정확히 Z 를 바라보고 가만히 있을거는 보장이 없다는 거잖아요? 

그럼 해결책은 단순합니다. local 좌표계에서 시작하는 거예요 !!!!! 
생각해 보세요 local좌표계는 자기가 중심이라서, 월드에서 회전해도 여전히 자기 축은 그대로라 회전 안한거랑 똑같거든요!!!

즉 해결책은 간단합니다. 

월드에서 시작하지 말고 로컬(오브젝트) 좌표계에서 시작하게 하면 끝이예요!!! 
이러면 월드에서 회전을 하건 말건 무슨 상관입니까??? ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

아아 이제 완벽합니다. 저 성가신 그림자야 꺼버리면 될테고. 빌보드는 완성되었어요. 

다 된겁니까? 

아뇨 다 되진 않았어요 ㅋㅋㅋ 지금은 진짜 원형만 만든것 뿐. 
지금은 진짜 회전만 했기 때문에. 이동과 스케일은 적용이 안된다는 문제가 있습니다. 

이건 다음 시간에. 

반응형

댓글