Game Dev/WarSimulation

Hexagon Grid Material 제작

AKer 2017. 6. 25. 09:51
반응형

DebugDrawLine의 압박을 이기지 못하고 드디어 Hexagon Grid의 Material을 만들었다. 



우선 Hexagon Grid는 다음 링크를 참고하여 만들었고 내 프로젝트에서 사용하는 Hexagon 모양은 Pointy Topped 이다.

http://www.redblobgames.com/grids/hexagons/


Hexagon의 선분을 그리기 위해 Radius(=r), LineThickness(=thickness)를 외부에서 전달한다.


  1. 우선 UE Material에서 현재 그려지는 Pixel의 WorldPosition(=wp)를 얻는다.

  2. 해당 WorldPosition의 Hexagon Grid의 중심점 c를 계산한다.

  3. (r - LineThickness)를 r2라고 한다.

  4. c를 중심으로 r2를 크기로 갖는 Hexagon 영역에 wp가 들어있는지 체크한다.

  5. 들어있지 않다면 선분 영역에 있는 것이므로 색을 칠한다.


위에 있는 4번의 Hexagon 영역에 점이 포함되는지 여부는 아래 링크를 참고했다.

http://www.playchilla.com/how-to-check-if-a-point-is-inside-a-hexagon


  1. 테스트 할 점을 q2라 한다.

    • 아래 그림에서는 2사분면이 모두 +인 사분면이고
      이곳에서 계산을 진행하기 때문에 q2라고 이름 지은듯

  2. 사각형 내에 점 q2가 있다면 true

    • 아래 그림에서 붉은색 부분

  3. Hexagon 중앙 c와 q2의 차이를 구하고 절대값을 취한다.

    • Regular Hexagon이 X, Y축에 대칭인 점을 이용

  4. 모든 값이 양인 사분면에서 q2가 외곽선 바깥인지 테스트한다.

    • 아래 그림에서는 q2가 p2p3 선분 바깥인지 테스트



이렇게 해서 UE Material을 만들면 기본적으로는 제대로 동작하는데 동적으로 Landscape를 변경하고자 한다면 Material Parameter를 사용해야 한다. (Grid의 Radius는 로직에 의해서 바뀔 수 있는데 그 때마다 Material을 변경해줄 수는 없기 때문에)


그런데 Landscape의 경우에는 Material을 동적으로 업데이트 해주기 위해서는 Material Parameter Collection을 사용해야 한다. Material Parameter Collection을 이용해 Radius, LineThickness를 전달해줘서 드디어 끝!

https://answers.unrealengine.com/questions/354352/c-how-to-put-a-dynamic-material-instance-on-a-land.html



반응형