Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

포인트 텔레포트의 좌표 보정 (point_teleport.sp) #7

Open
1 task
Nopied opened this issue Jul 19, 2022 · 1 comment
Open
1 task

포인트 텔레포트의 좌표 보정 (point_teleport.sp) #7

Nopied opened this issue Jul 19, 2022 · 1 comment
Assignees
Labels
enhancement New feature or request help wanted Extra attention is needed memo

Comments

@Nopied
Copy link
Member

Nopied commented Jul 19, 2022

목표: 텔레포트 도착 지점에서 가능한 플레이어가 끼지 않을 자리를 확인합니다.
이것저것 확인해보았으나 트레이스를 남발하거나 맵 데이터를 꺼내서 연산하는 것은 부하가 큰 것으로 확인되어 처음에 생각했던 방법처럼 트레이스를 활용하되 횟수를 최소한으로 낮추는 것이 목표입니다.

그리고 이번에 좌표 선정은 텔레포트를 사용하는 플레이어의 판단에 맡기는 형태로 구상하였습니다.

BB: Bounding Box

  • 좌표 연산 할 때, 충돌에 쓰이는 엡실론 값인 0.0135를 합해야 할 수도 있습니다.

n + 2차 (작성 중)

전제: 최초 트레이스의 충돌 확인 작업에서 벽 안에 들어간 트레이스를 밖으로 빼낸 다음에도 충돌이 확인된 경우
이는 아랫면에 조준한 것 중에 옆면이 BB에 충돌하지 않는 것에 한해 충돌 없음이 보장됩니다.

  • 기본적으로 이 트레이스 길이를 BB의 넓이 만큼 전진시킬 것.
  1. 최초 트레이스의 바닥면 normal 값을 기준으로 해당 축의 정면과 양옆면 BB 길이를 각각 합한 좌표를 트레이스하여 결과 좌표에서 벽에서 삐져나온 좌표만큼 뒤로 뺍니다.
    이때 선 중 하나라도 AllSolid, StartSolid로 판정되었다면 보정 실패로 간주, 마지막으로 넘어갑니다.
  • 연산 순서: (정면 -> 정면 + 양옆면 -> 양옆면), 한 면을 위한 연산에 5번의 선형 트레이스 사용
  • normal 값은 오직 정면의 각도를 알아내는 것에 사용합니다. (x, y 중 절댓값이 가장 큰 것, 보통은 차이가 명확하게 갈리지만 울퉁불퉁한 벽이라면 사정이 좀 다를 수 있습니다..)
  1. 이후 z축(높이)를 BB의 정면을 합한 상태에서
    시야 각도가 양수라면 아래에서 위, 위에서 아래로
    반대로 음수라면, 첫번째는 보정했다고 간주하고 아래에서 위만 확인합니다.
  • StartSolid로 판정되었다면 보정하지 않고 무시합니다.
  • 경우에 따라 벽 안쪽부터 트레이스 될 수 있지만 벽 안쪽에서 시작된 트레이스는 그 벽 안에서는 충돌 판정 되지 않고 다음 벽에서 충돌 판정이 이뤄집니다.
  • 만약 처음 트레이스에서 보정이 이뤄진 상태에서 그 다음 트레이스에서 충돌되었다면 해당 벽 안에서 플레이어가 설 수 있는 높이가 없으므로 보정이 실패했다는 걸로 간주하여 마지막으로 넘어갑니다.
  • 시야 범위는 예외로 적용되는 지형이 있어서 확인이 필요합니다.
  1. BB의 윗면을 1번처럼 확인합니다.
    이때 선 중 하나라도 AllSolid, StartSolid로 판정되었다면 보정 실패로 간주, 마지막으로 넘어갑니다.

마지막. 보정 실패 여부를 파악하기 위해 Hull로 최종 좌표를 확인하고 그래도 충돌되었다면 해당 좌표에서 시야 각도에 따라 일정 거리만큼 뒤로 이동한 후에 다시 1로 돌아갑니다. (부하 최소화를 위해 이 작업은 3번까지만 합니다.)

문제 될 요소:

  • 벽이 복잡하게 되어있는 경우: 울퉁불퉁 또는 뾰족한 벽의 경우에 대비해서 마지막 단계에 뒤로 이동한다는 것을 추가했지만 플레이에 자연스럽지 않을 수 있다 생각하고 있습니다.

일단 이번까지만 지금까지의 보정을 따라서 적어볼 생각인데 이번에도 플레이에 문제가 많을 것 같다고 생각되면 아예 좌표 지정 방식이나 컨셉을 타협해 볼 생각입니다.

@Nopied Nopied added enhancement New feature or request help wanted Extra attention is needed labels Jul 19, 2022
@Nopied Nopied self-assigned this Jul 19, 2022
@Nopied Nopied added the memo label Jul 19, 2022
@Nopied
Copy link
Member Author

Nopied commented Aug 6, 2022

20220806

기존에 위치를 직접 조준해서 지정하던 방식에서 조준한 위치와 각도에 맞춰 투사체를 던지고 일정 시간이 지나거나 벽에 닿으면 해당 위치에 포탈이 생기는 것으로 변경되었습니다.

이 방식을 적용하였음에도 플레이어가 여전히 낄 수 있고 앉아서 들어가는 지형에 대한 대응이 어려워 결국 좌표 보정이 여전히 필요하다는 것으로 확인했는데 이번엔 위치를 지정하는 방식이 바뀌어서 그거에 맞춰 새로 구상하였습니다.

  • 좌표 보정 자체는 투사체가 가장 최근에 있던 지점에만 이뤄집니다.

즉, 대부분의 경우라면 벽에 충돌되거나 허공에서 수명이 다 되어 위치가 지정된 경우에 그 지점에만 좌표 보정을 수행합니다.
최초 좌표의 보정 연산이 되지 않은 경우, 그 이후 좌표에 대해서 단순 충돌 확인만 수행합니다.

  • 투사체의 위치를 기준으로 BB에 딱 맞춰 좌표 보정 연산을 진행합니다.
  • 로켓의 각도 정보는 파이로가 반사했다면 변경되어야 함

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request help wanted Extra attention is needed memo
Projects
None yet
Development

No branches or pull requests

1 participant