1. terrain의 indexbuffer를 순회하여 픽킹테스트를 한다.

2. 픽킹된 좌표를 얻어내 정점을 순회 할 인덱스 범위를 구한다.

화면 중앙을 원점(0,0)으로 배치된 지형을 좌상단이 원점이 되도록 기준을 잡으면 각 정점은 행렬의 형태로 정렬된다.

vLeftTop.x = pickPos.x - radius

vLeftTop.z = pickPos.z + radius

StartX = vLeftTop.x + terrain width / 2;

iStartX = max( iStartX, 0 );

 

 

iEndX = iStartX +  radius* 2;

iEndX = min( iEndX, terrain width - 1 );

 

iStartY = terrain height / 2 - vLeftTop.z;

iStartY = max( iStartY, 0 );

 

iEndY = iStartY + radius* 2;

iEndY = min( iEndY, terrain height - 1 );

 

3.만들어낸 범위안의 정점들을 순회하여 픽킹지점부터 정점간의 거리와 반지름의 크기 비교하며 

 정점의 높이를 수정한다.

 

반지름보다 거리가 작은 정점에 한해 연산을 한다.

vertex.y = sin( 90.f - ( 90.f * dist / radius ) )

 

dist / radius 은 0 ~ 1값을 가진다.

헌재 픽킹 지점부터 반지름 한도내까지 거리가 가장 멀면 1, 픽킹지점이면 0

 

이를 sin의 치역값으로 보간하면 픽킹지점부터 반지름끝까지 부드럽게 조절 할 수 있다.

Posted by mainep
: