지형에 부드럽게 플레이어를 밀어 넣는 방법


11

도표

아이소 메트릭 게임을 만들고 있습니다. 플레이어가 대각선으로 벽을 걸 으려고 할 때 벽을 가로 질러 부드럽게 미끄러지기를 원하므로 움직임의 모든 부분이 합법적이며 법선 방향의 모든 것을 버립니다. 벽은 수직 또는 수평뿐만 아니라 모든 각도가 될 수 있으며 플레이어는 360도 동작합니다.

나는 거의 거기에있는 것처럼 느껴지지만 마지막 조각을 제자리에 넣을 수는 없습니다.

업데이트 : 좋은 소식이 있습니다! 작동하고 있습니다. 그러나 ... 나는 정상화 해야하는 것과 그렇지 않은 것을 약간 혼란 스럽습니다. 법선은 단지 단위 벡터 여야합니다. 그러나 나는 그것을 내 입력과 섞어서 정규화하고 있습니다-내가 틀렸습니까?

그건 그렇고, 나는 플레이어를 법선 방향으로 1 픽셀 밀어야 물건에 붙어 있지 않도록 잘 작동한다는 것을 알았습니다.

답변:


13

모션 벡터를 평면 법선에 투영 한 다음 결과를 모션 벡터에서 빼십시오.

Vector undesiredMotion = normal * (dotProduct(input, normal));
Vector desiredMotion = input - undesiredMotion;

어쨌든 그런 것. 당신의 사랑스러운 다이어그램에서 입력이 벽에서 떨어져있는 것처럼 보이기 때문에 약간 혼란 스럽습니다.


미안 그는 거기에 수직 벽 앞에 있어야합니다. 끔찍한 그림
Iain

1
나는 도트 제품에 대해 약간 혼란 스럽습니다. 내적은 스칼라가 아닌가?
Iain

1
예,하지만 원치 않는 움직임의 벡터를 얻기 위해 법선에 법선 (벡터)을 곱합니다. 스칼라 s를 곱한 벡터 (x, y, z)는 벡터 (sx, sy, sz)를 얻습니다.
Chris Howe

완료, 다이어그램과 일치하도록 변수를 변경했습니다. :)
Chris Howe

@Iain 나는이 답변을 사용하는 방법을 이해하려고 노력하고 있지만 그것을 이해할 수없는 것 같습니다. 이 정확한 코드를 만들면 정말 이상한 desiredMotion결과가 나타납니다. 이 작업을 해 본 적이 있습니까?
테스트

1

법선 방향으로 모션의 구성 요소를 제거하는 것이 똑 바르지 만 모션 플레이를 회전시키는 대신 게임 플레이에 적합 할 수 있습니다. 예를 들어, 3 인칭 액션 게임에서는 벽과 다른 경계에 약간 매달리기 쉬울 수 있으므로 플레이어가 의도 한 바를 추측 할 수 있습니다.

// assume that 'normal' is unit length
Vector GetDesired(Vector input, Vector normal) {
   // tune this to get where you stop when you're running into the wall,
   // vs. bouncing off of it
   static float k_runningIntoWallThreshold = cos(DEG2RAD(45));

   // tune this to "fudge" the "push away" from the wall
   static float k_bounceFudge = 1.1f;

   // normalize input, but keep track of original size
   float inputLength = input.GetLength();
   input.Scale(1.0f / inputLength);

   float dot = DotProduct(input, normal);

   if (dot < 0)
   {
      // we're not running into the wall
      return input;
   }
   else if (dot < k_runningIntoWallThreshold)
   {
      Vector intoWall = normal.Scale(dot);
      intoWall.Scale(k_bounceFudge);

      Vector alongWall = (input - intoWall).Normalize();
      alongWall.Scale(inputLength);

      return alongWall;
   }
   else
   {
      // we ran "straight into the wall"
      return Vector(0, 0, 0);
   }
}

좋은. 그러나 퍼지 팩터로 스케일을 조정하면 벽을 따라 미끄러지거나 미끄러지 듯 움직입니까?
Chris Howe

내 생각은 당신이 그것을 좋아 보이도록 조정한다는 것입니다. 확실히 너무 크면 튀는 것처럼 보이지만 미묘한 경우 표면의 약간의 구부러짐에 매달리지 않도록 할 것입니다.
dash-tom-bang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.