[GPG 1 글 4.7] 레이싱 게임에서의 트랙 처리.

GPG 시리즈 관련 질답, 논의 공간.

Moderator: 류광

rapina_

레이싱 게임에서의 트랙 처리.

Post by rapina_ »

카트라이더와 같은 트랙 구조의 레이싱 게임에서 트랙을 제대로 돌았는지와, 역주행과 같은 처리를
어떤식으로 해야될지 생각해봤는데.. 이거다! 할만한 괜찮은 방법이 떠오르질 않네요.

일단, 제가 생각한 방법은.. 트랙을 여러개의 체크 포인트로 분할합니다. 그 다음 출발점을 기준으로
체크 포인트에 순서대로 번호를 부여합니다. 출발점이 0이고, 다음 체크 포인트는 1, 그 다음은 2.. 3
이런식으로요.. 이렇게 하면 체크 포인트를 지났을때 이전에 지나간 체크 포인트를 체크해서
제대로 된 주행인지 체크가 가능하고.. 역주행일 경우에도 체크가 가능할거같습니다만.. 실시간으로
순위 체크가 가능하지 않고.. 체크 포인트를 지났을때만 체크가 가능하다는 단점이 있네요. 체크 포인트를
세밀하게 분할하면 좀더 세밀한 처리가 가능할거같지만. 이 역시도 그렇게만 보일뿐.. 세밀하진 않구요.
거기다 트랙 하나를 추가할떄마다 체크 포인트를 찍는다는건 순전히 생 노가다같구요..

카트라이더를 보면. 실시간으로 내 순위가 갱신이 되던데.. 이런건 어떤 방법으로 한걸까요?

ps. 제목 수정 :oops:
Last edited by rapina_ on 2005-02-22 09:05, edited 1 time in total.
비회원

gpg1권 챕터4.7 참조하세요.

Post by 비회원 »

gpg1권 챕터4.7 참조하세요.
비회원

Re: gpg1권 챕터4.7 참조하세요.

Post by 비회원 »

비회원 wrote:gpg1권 챕터4.7 참조하세요.
제가 알고 싶은거랑은 좀 다른 내용이네요.
seeper
Posts: 1483
Joined: 2003-06-06 23:19
Contact:

Post by seeper »

잘 모르지만 제 생각을 한번 적어보겠습니다.

체크 포인트라는건 결국 구역일 것 같고요.
구역마다 벡터 정보가 있다면 역주행인지 아닌지 쉽게 체크될것 같습니다.
(해당 구역의 벡터 방향과 차의 방향이 어느정도 이상 차이나면 역주행이라고 판단하면 되겠죠.)

그리고 체크 포인트 라인과의 직선 거리만 계산한다면 등수 계산될것 같습니다.
특히 구불구불한 트랙쪽을 잘 처리해주면 될 것 같은 생각이드네요.

그리고 트랙을 추가한다는것 자체가 생노가다 일거라는 생각이듭니다.
복잡하더라도 정보를 추가하는것은 괜찮을것 같네요.
(물론 필요 없는 정보까지 넣을 필요는 없겠지요.)

카트라이더가 실시간 계산이라도 완전 정확한건 아니고
특히 직선 구간이 아닌 경우에 등수가 정확하지 않죠.

결국 너무 정확할 필요는 없다고 생각합니다. 골라인 만 정확히 체크하면 되니까요.
비회원

Post by 비회원 »

역주행 체크는 seeper 님 의견대로 하심 별 문제가 없을듯 하네요.

그리고 완주 체크는 변수 2개(라인통과체크,완주회수)로 해서

반대 방향으로 finish라인을 통과하면 라인통과체크 -1 해주고

정방향으로 finish라인을 통과하면 라인통과체크 +1 해줘서

라인통과체크 값이 1이되면 완주회수+1, 라인통과체크는 0으로 초기화

하는 방식으로 하면 되지 않을까 싶네요..
taiky
Posts: 36
Joined: 2004-01-13 18:50
Location: 독립개발자

제가 참여한 프로젝트에서는..

Post by taiky »

미사일을 발사하면 바로앞 순위를 맞추거나, 1등을 맞추거나...이런 이벤트가 존재해서
실시간 순위가 꼬이면 엉뚱한 사람이 피해를 입는 그런 상황이었습니다.

트랙을 최대한 원형으로 유지하면서...
트랙의 중앙의 한점을 O로 놓고..스타트라인과 현재위치의 사잇각을 이용해서 순위를 판별했습니다.

트랙의 모양이 복잡해지면 쓸수없는방법이긴하지만 해당프로젝트에서는 나름대로 유용하게 사용했습니다.

당시 트랙을 구역별로 만드는 방법을 생각해보기도 했는데..트랙이라는게 3D로 제작되어지는게 아니라서, 별도로 툴에서구역을 정해줬어야하는게 이게 굉장히 번거로울듯싶어서 관둔 기억이 납니다.

역주행은 시계방향이냐..아니냐..로 판단했고, 골라인통과는 역시 골라인통과시 진행방향벡터의 방향으로 판단했습니다.
비회원

Re: 제가 참여한 프로젝트에서는..

Post by 비회원 »

taiky wrote:미사일을 발사하면 바로앞 순위를 맞추거나, 1등을 맞추거나...이런 이벤트가 존재해서
실시간 순위가 꼬이면 엉뚱한 사람이 피해를 입는 그런 상황이었습니다.

트랙을 최대한 원형으로 유지하면서...
트랙의 중앙의 한점을 O로 놓고..스타트라인과 현재위치의 사잇각을 이용해서 순위를 판별했습니다.

트랙의 모양이 복잡해지면 쓸수없는방법이긴하지만 해당프로젝트에서는 나름대로 유용하게 사용했습니다.

당시 트랙을 구역별로 만드는 방법을 생각해보기도 했는데..트랙이라는게 3D로 제작되어지는게 아니라서, 별도로 툴에서구역을 정해줬어야하는게 이게 굉장히 번거로울듯싶어서 관둔 기억이 납니다.

역주행은 시계방향이냐..아니냐..로 판단했고, 골라인통과는 역시 골라인통과시 진행방향벡터의 방향으로 판단했습니다.
붉은미르
Posts: 36
Joined: 2001-08-08 09:00
Contact:

몇년전에 레이싱 게임을 만든 기억이...^^;

Post by 붉은미르 »

그때에 여러가지 방법을 많이 생각을 했습니다.

CheckPoint를 원으로 만들어서 그곳을 지나가면, 다음번 CheckPoint가 도착점이 되게 하고, 순위는 CheckPoint에서 떨어진 거리를 기준으로 하는 방법.

트랙바마다 일정한 영역을 가능하면서, 직사각형으르 만들어서, 그 영역의 시작점에서 떨어진 거리를 가지고 순위를 매기는 방법.


선택한 방법은, 앞에서 "seeper"께서 이야기한 방법과 거의 같은 방법으로 처리하였습니다.

1. 트랙에서 휘어지거나 구버러지는 곳 중에서 적절히 선택해서 CheckPoint를 설정을 하였습니다.
2. CheckPoint는 선이나 점이 아니고, 벡터로 하였습니다. 그림을 그리면, 좀더 나은데...^^;

Code: Select all

          --------------------- |------------------------
                                |
           트랙              <--|                             <--- 주행방향                                        
                        벡터    |
          ----------------------|------------------------
                                |
                            체크 포인트
3. CheckPoint를 지나갈때마다 현재 CheckPoint를 갱신을 해줍니다.
길게 설명하면, 자동차가 (현재CheckPoint+1)의 앞쪽(+)쪽에 있으면, "현재 CheckPoint = 현재 CheckPoint + 1"로 한다. ^^;

* CheckPoint+2을 CheckPoint+1보다 먼저 지나가도 별 문제없습니다. 즉, 현재 CheckPoint에서 CheckPoint+1을 지나지 않고, CheckPoint+2에 왔다고 해도 CheckPoint+1를 지나는 순간 CheckPoint는 CheckPoint+1, CheckPoint+2로 증가합니다.

4. 순위는 CheckPoint에서 떨어진 거리로 하면 별 문제가 없습니다.(적용한 방법) 좀더 정확하게 할려고 하면, 직선에 수선으로 내린 값을 가지고 하면 될걸 같습니다.(적용하지 않은 방법)

5. 역주형은 "체크포인터의 벡터"와 "자동차의 진행 방향"을 벡터 Dot( 아니면 Cross(곱?))을 해서, 양의 값으면 정상주형, 음의 값이면 역주형으로 판단하면 됩니다.

* 체크포인터가 Vector라서 CheckPoint의 앞/뒤쪽의 판단은 트랙의 어디에 있어서도 알수 있습니다.


게임업계를 반 이상 떠난 붉은미르

ps. 재미난 게임을 재미있게 만드세요.
전에 제가 게임을 개발했을 때에 잘 적용되었습니다. 프로그래밍은 다른 분이 다른 유능하신 분이 하셨습니다.
비회원

예전에 T모 레이싱게임에서는...

Post by 비회원 »

트랙만 따로 메쉬로 뽑아서 트랙메쉬란 걸 만들었습니다. 트랙메쉬는 일정 간격으로 미리 그어진 거리정보를 포함하고 있었지요.

그래서 트랙메쉬가 하나 지나쳐갈 때마다 카운트를 하나씩 늘리거나 줄였고 그렇게 해서 차간 거리를 계산하거나 주행 랩수를 계산했습니다.

개략적인 설명이고, 정확한 구현은 제가 한 것이 아니기 때문에 이정도만 말씀드릴 수 있겠네요. ^^;
yunhozzz
Posts: 94
Joined: 2005-01-28 03:04
Contact:

Post by yunhozzz »

그 트랙 메쉬랑 비슷 한 역활을 하는 걸 체크 포인트 만으로 만들수 있습니다. 그 전 포인트에서 이번 포인트로의 벡터를 노말값으로 하는 평면을 만들고 그 평면을 통과 했는지를 체크 하는 식으로 처리 하면 됩니다.

그 포인트 사이에서의 순위 체크는 위에 나와있는 gpg내용을 보고 하시면 되구요.
Post Reply