picking 시나리오

2D, 3D, 다각형, 픽셀 등 게임의 그래픽 프로그래밍에 관한 포럼입니다.

운영자: 류광

Locked
비회원

picking 시나리오

전체글 글쓴이: 비회원 » 2009-04-07 19:25

아주 복잡한 오브젝트가 많은 경우에 picking 문제가 여러 가지로 문제가 되더군요.
그래서 혹시 이런 방식으로 구현하면 속도나 정확성에서 더욱 빠르지 않을까 하는데
의견을 듣고 싶습니다.


1. 1x1크기의 버퍼를 만듭니다.

2. 모든객체를 ID를 이용해서 위의 버퍼에다 그립니다.
이때 사용되는 카메라의 상태등은 정상적인 랜더링 상태를 유지 합니다.

3. 해당 버퍼의 값을 읽어서 값을 판별합니다.



위와 같은 방식으로 하면 좀더 속도감 있게 구현이 가능하지 않을까 하는데

기본적으로 LockRectangle와 같은 함수가 사용되고, 쉐이더를 사용해서 한번더 그려야 하니
부담이 생길것도 같은데,
실제 구현되면 어떨지 판단이 안서네요.

비회원

전체글 글쓴이: 비회원 » 2009-04-09 02:35

모 게임엔진 샘플에서 세이더로 구현한 샘플이랑 비슷할 거 같은데요.
오브젝트 별로 색상을 다르게 입혀서 텍스쳐에 렌더링한 다음
색상을 읽어 오는 방법이 있더군요.
근데, 속도가 너무 느려서 써 볼 생각도 안해봤다는...

그레이오거
전체글: 322
가입일: 2006-01-18 13:25

홍홍홍

전체글 글쓴이: 그레이오거 » 2009-04-09 10:49

잘 구성된 피킹 시스템의 충돌판정 속도는 극악의 케이스(대륙횡단 피킹 ㅡ,.ㅡ)같은 경우를 제외하고는
피킹을 위한 렌더링 비용(스위칭+그리기+판정)보다 빠릅니다.
정석의 힘을 믿어보세용.

비회원

전체글 글쓴이: 비회원 » 2009-04-09 15:25

fps 게임에서는 계층구조 박스를 캐릭터에 달아서 하나요 ?

비회원

그럼 이렇게 수정되면 어떨까요?

전체글 글쓴이: 비회원 » 2009-04-10 18:20

사실 picking이 아니라 Hover를 구현하다 보니까 이런 발상이 나온건데요.
복잡한 건물이나 아이콘들이 화면에 가득한 상황에서 마우스의 위치에 해당하는
객체를 판별하려니까 아무래도 기존의 방식보다 빠른 방법이 없을까 해서 생각한 겁니다.

직접 구현해 보기 전에 질문을 드리는건 아직 아래의 2번에 해당하는 ViewFrustum을 만들거나
하는게 서툰 3D 초보다 보니까 의견을 먼저 구하게 되었습니다.


의견주신것을 가지고 고민해 봤는데 이렇게 수정되면 어떨까요?


1. 1x1크기의 버퍼를 만듭니다.

2. 마우스 위치를 중심으로 아주 작은 ViewFrustum을 만듭니다.

3. 해당 ViewFrustum에 포함되는 객체만 ID를 이용해서 그립니다.

4. 해당 버퍼의 값을 읽어서 값을 판별합니다.


이렇게 해도 여전히 속도에 문제가 있을까요?

아주 작은 영역이니 그리는 시간은 얼마 걸리지 않을것 같기도 한데요??

비회원

전체글 글쓴이: 비회원 » 2009-04-10 20:16

Hover라는게 마우스 커서 이동시에 반응하는 거 말씀하시는 거라면...

저희는... 그냥 개별 3D 오브젝트와 2D GUI 컨트롤(버튼)을 연결해서
GUI 컨트롤의 좌표를 매번 업데이트 하는 방식으로 해결했는데요.

컨트롤이 마우스 커서에 반응하는 것은 그냥 2D GUI 시스템에서
기존 방식 그대로 알아서 처리하고요.

zupet
전체글: 2764
가입일: 2003-05-13 03:34
사는 곳: NCSOFT LE팀

전체글 글쓴이: zupet » 2009-04-10 23:41

안녕하세요. 매크로 없는 메비~랍니다.

http://dexgame.com/zbxe/?mid=download&d ... le=&cpage=

자료실에 올려놓은 KdTree 샘플 코드로 지난 프로젝트에서 각종 Ray-Object 테스트용으로 쓰던 녀석입니다.

이 샘플에 사용된 bunny 는 69451 triangle 로서 7만 폴리건짜리 메쉬이고 이 메쉬에 대해 SSE를 사용할 경우 초당 5백만번, 일반 코드를 사용할 경우 2백만번정도 picking 을 할 수 있습니다. 저는 이것을 좀더 활용해서 AABB 기준으로 만들어진 월드의 모든 물체들을 KdTree 에 넣고 각각 AABB 에 따른 Sub-KdTree 를 따로 만들어서 월드에 대고 Picking Test 를 했습니다. KdTree를 통해 부하가 거의 없는 상태로 캐릭터가 실제 모델링용 폴리건 위를 뛰어다니고 충돌 체크를 할 수 있었습니다.

KdTree 가 만능은 아닌게 빌드하는데 시간이 좀 걸리고(개선 가능) Static 하지 않을 경우 매번 Tree 를 다시 만들어야 하므로 움직이는 객체들에는 적합하지 않다는 것이죠. 그래서 맵툴에서 배치한 객체들 같이 움직이지 않을 녀석들은 월드 KdTree를 만들어서 넣고 캐릭터, 몬스터 같은 경우 좀 간단한 공간소팅(바닥 Cell 기반이라던지 Octree 던지)를 써서 처리하면 동적으로 움직이는 물체들도 같이 처리할 수 있습니다.

Locked

접속 중인 사용자

이 포럼을 보고 있는 사용자: 회원 0 명, 손님 3 명