부모에 영향받지 않고 자식이 원하는 사이즈로 있고 싶다면 어떻게? (부모크기를 일일이 확인하는게 번거로움)
부모의 회전이나 자식의 이동값이 부모로부터의 상대적인 개념은 맞는데,
부모의 크기까지 영향을 받게되면 실제 원하는 위치에 자식을 달아줄 때 너무 불편하다.
그래서 크기 행렬은 부모의 영향을 무시할 수 있게 만들어야 한다.
트랜스폼에 bool 변수로 부모의 스케일 정보를 무시할 수 있는 옵션을 준다.
자식 오브젝트 트렌스폼에서 스케일 영향을 주는걸 해제해놓는다면
누군가의 자식오브젝트가 되더라도 부모의 스케일에 더이상 영향을 받지 않게 된다.
==> 내가 원하는 포지션이나 스케일을 설정하더라도 부모에 영향을 받지 않고 직관적으로 셋팅할 수 있다.
부모의 행렬을 무작정 아무렇게나 누적을 해서 곱하면 안된다.
why? 나는 부모의 크기에 영향을 받지 않고 싶을 수가 있기 때문이다.
행렬에서 어떻게 하면 무시할 수 있을까 ?
월드 행렬이 구성되는 순서 => 크기 x 회전 x 이동
내가 차일드 오브젝트라면, 모든 것은 부모로부터 상대적인 개념이 되어야 하기 때문에
일단 적용시켜서 이동을 시키고 나면 원점이 사실 부모이고..
나의 크기 회전 이동은 부모로부터 이동된 것이다.
여기에 부모 월드행렬을 곱하면 부모로부터 떨어진거랑 다름없으니까 다시
나의 이동에다가 부모의 이동을 더하면 부모 위치에 내가 더한 위치만큼 이동을 하게 된다.
나의 원점으로부터 이동값은 그 원점이 부모였던 것이다.
부모의 이동과 회전이 적용되면서 부모의 회전은 나에게 공전이 되는 거고 (부모 주변을 도는)
부모가 이동을 하면 나도 똑같이 이동을 더해서 내 이동에 부모 이동을 더해서 부모를 따라 가게 된다.
추후에 부모의 상태행렬이 적용되니까 이렇게 다 합쳐진게 월드행렬이라고 한다면
나의 상대적인 이동량이 부모의 상태까지 더해져서 나의 최종 월드 행렬이 나오게 된다.
여기서 부모의 월드행렬을 까보면
부모 오브젝트의 크기, 회전, 이동으로 또 구성이 되어있다.
여기서 부모의 크기 부분이 자식 오브젝트에 영향을 주게 된다.
자식 오브젝트가 이미 커졌고 회전했고 이동도 다 했는데, 또 커지니까
원래 내 제자리에서 커지고 회전하고 이동했더니
부모의 크기가 적용도니까 나의 이동량에도 부모의 크기가 적용이 되버린다.
만약 부모의 크기가 2배였다면, 이미 이동한게 있는데 부모로부터 2배씩 멀어지면서 커지게 된다.
즉, 자식 오브젝트는 자신의 자리에서 회전과 크기만 변동이 있으면 하는데,
부모 행렬을 다 적용하면 자식 오브젝트의 이동값과 부모 행렬의 이동값의 크기가 같이 중복으로 적용이 된다.
부모의 행렬을 곱하기 전에 부모의 크기 행렬의 역행렬을 준비한다.
우선 자식의 크기 X 회전 X 이동으로 자식의 월드행렬을 구성한다.
그다음 부모행렬을 적용시켜야 하니까,
부모의 크기의 역행렬을 구해서 미리 곱해놓는다.
(자식 오브젝트의 크기 x 회전 x 이동) x (부모 오브젝트의 크기)^-1 x (부모 오브젝트의 크기 x 회전 x 이동)
부모 오브젝트의 크기가 서로 상쇄돼서
(자식 오브젝트의 크기 x 회전 x 이동) x (부모 오브젝트의 회전 x 이동) 이 돼서
내 기존 상태들이 부모의 크기 때문에 원래 크기가 더 커져서 배율이 뻥튀기 되거나 이동이 늘어나거나 하는게 사라진다.
격자 만들기
툴에디터로서 제공되는 기능이기 때문에 실제 게임에 출력되면 안된다.
게임에서 실제로 출력된다는 것은 레벨 안에 게임 오브젝트로 속해있으면서
메쉬 랜더 컴포넌트를 갖고 있는 오브젝트라는 의미이다.
그래서 에디터용과 출력용 오브젝트를 나누어서 관리를 해야한다.
격자물체가 그려지려면 결국엔 우리 카메라가 보고 있는 영역을 그 물체가 다 채워야한다.
라인에 걸리는 애들만 그리고 틈은 안그려도 된다. ==>> 비어있는 애들은 Clip or Discard 처리
격자가 물체를 덮을 수도 있다.. 그렇기 때문에 본인의 깊이를 저장하지 않을 것이다.
격자용 쉐이더는 에디터용이기 때문에 에디터 fx 에 구현을 한다.
화면에 다 그려져야 하니까 사각형 메쉬를 사용한다.
그리드오브젝트는 부모오브젝트가 없으니까 본인의 scale이 월드 스케일이 된다.
카메라가 움직이거나 줌인 줌아웃을 해도 격자는 화면 전체를 가득 채워야한다.
어떻게 ?
쉐이더에서 정점 위치를 ndc 좌표 -1 ~ 1 사이에 오게 설정한다.
그럼 레스터라이저가 카메라의 scale 값이 몇이든 ndc 좌표에 꽉차서 들어온다고 판단하기 때문에
카메라가 어디로 움직이든 격자가 꽉차게 나오게 된다.
해상도 정점 중 한 정점의 위치를 구하려면?
본인 위치 * 로컬 좌표 * 해상도
카메라가 월드의 원점을 찍는다는 기준으로 만든 공식이다.
격자무늬 간격을 픽셀 100 이라고 했을 때 어떻게??
100단위에서 +- 1을 추가범위로 잡아준다.
100으로 나눴을 때 나머지 (Rest) 에 + 1을 하고 그 값이 0 ~ 2 사이에 있는지 if문으로 확인한다.
이 안에 안 들어오는건 discard 로 없앤다.