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
:

* LOD 

- Level of detail의 약자로 정밀도를 표현한다.

- 정밀도를 나눠 렌더링연산을 줄여줄 수 있다.

 

* 정적LOD

- 정해진 정밀도에 따라 메쉬를 추가로 가지고있어 거리에 따라 출력 메쉬를 바꿔준다.

- 연산은 적지만 메모리 낭비가 심하다.

 

* 동적LOD

- 거리에따라 메쉬의 정밀도를 갱신해준다.

- 연산이 많지만 메모리 낭비가 심하지 않다.

 

* 거리기반 LOD

- terrain의 quadTree에선 거리기반기법으로 현재 노드와 카메라의 거리를 구한뒤

  인덱스의 top_left에 top_right까지의 길이를 비교해 표현 할 수 있다.

 

* Crack 현상

- 정밀도가 달라지는 구간에서 정점의 위치에때라 연결부위에 균열이 생기는 현상.

- 해결 방안으론 연결 부위에 삼각형을 땜질해 주어 자연스럽게 연결 될 수 있게 해준다.

'programming > etc' 카테고리의 다른 글

절두체 컬링 ( Frustum Culling )  (0) 2024.07.26
쿼드트리 ( QuadTree )  (0) 2024.07.26
OBB 충돌  (0) 2024.07.26
*좌표계*삼각비*내적-정사영  (0) 2024.07.26
카메라  (0) 2024.07.26
Posted by mainep
:

 

* 절두체

- 사각뿔의 머리를 잘라놓은 형태로

근평면, 원평면, 좌평면, 우평면, 상평면, 하평면으로 구성되어있다.

 

* 절두체 컬링

- 대상이 카메라 시야 내에 포함되는지를 판별하여 출력 여부를 결정한다.

- quadTree자료구조로 생성된 지형에 절두체 컬링을 적용시 렌더링되는 삼각형의 수를 줄일 수 있다.

 

* 절두체 생성

1. 근평면, 원평면, 좌평면, 우평면, 상평면, 하평면을 생성한다.

2. 카메라 시야를 기준으로 잡으므로

IDirect3DDevice9의 멤버함수 GetTransform을 이용해 view행렬와 projection행렬을 얻는다.

3.위에 생성한 1.의 각 정점에 view * proj의 역행렬을 곱해준다.

invMat = D3DXMatrixInverse achieve view * proj

transPos = D3DXVec3TransformCoord achieve origV, invMat

( invMat = 카메라의 world행렬이 된다. )

4. 각 평면을 구성하는 transPos정점들을 이용해 D3DXPLANE을 생성한다.

( 본 블로그의 direct3dx->학습->평면방정식 참고 )

http://blog.naver.com/krlaghgn/220711303047

평면방정식

*평면방정식-평면의 법선벡터와 원점간의 거리d를 알고있을때 점P가 평면에 대해 어느 위치에 있는지 판별...

blog.naver.com

 

* D3DXVec3TransformCoord

D3DXVECTOR3와 D3DXMATRIX구조체의 포인터를 인자로 받아

벡터를 1x4 행렬로 변환하여 행렬곱 연산을 마친 후 D3DXVECTOR3로

변환하여 반환한다. 1x4행렬로 변환과정에서 벡터의 w의 값은 1로 고정되며

행렬 위치값의 영향을 받는다.

 

* 절두체 컬링 적용

1. quadTree의 각 노드가 가지고있는 정점들과 절두체컬링을 위해 생성한 D3DXPLANE을

평면방정식의 연산으로 사용하여 절두체 내에 포함되는 여부를 판단하여

포함 여부를 저장한다.

2.지형의 인덱스를 생성할때 cullMode가 적용된 노드라면 자신을 포함해 하위노드도 그려줄 필요가 없으므로

하위노드 탐색과, 인덱스 생성을 건너뛴다.

 

'programming > etc' 카테고리의 다른 글

Level of detail ( LOD )  (0) 2024.07.26
쿼드트리 ( QuadTree )  (0) 2024.07.26
OBB 충돌  (0) 2024.07.26
*좌표계*삼각비*내적-정사영  (0) 2024.07.26
카메라  (0) 2024.07.26
Posted by mainep
: