Làm thế nào để làm cho người chơi trượt trơn tru trên địa hình


11

biểu đồ

Tôi đang làm một trò chơi isometric. Khi người chơi cố gắng đi theo đường chéo vào tường, tôi muốn họ lướt nhẹ qua nó, vì vậy bất kỳ phần nào của chuyển động sẽ được sử dụng hợp pháp, và bất cứ thứ gì theo hướng bình thường đều bị vứt đi. Tường có thể là bất kỳ góc nào, không chỉ là dọc hoặc ngang và người chơi có chuyển động 360.

Tôi cảm thấy mình gần như ở đó nhưng tôi không thể đặt mảnh cuối cùng vào vị trí.

Cập nhật: tin tuyệt vời nhé mọi người! Tôi có nó làm việc. Nhưng ... tôi hơi bối rối không biết nên bình thường hóa cái gì và cái gì không. Bình thường chỉ cần là một vector đơn vị, phải không? nhưng sau đó tôi đang trộn nó với đầu vào của tôi để tôi bình thường hóa điều đó - tôi có sai không?

Nhân tiện, tôi cũng thấy rằng tôi cần đẩy người chơi 1 pixel theo hướng bình thường, để họ không bị kẹt vào mọi thứ - hoạt động tốt.

Câu trả lời:


13

Chỉ cần chiếu vectơ chuyển động của bạn lên mặt phẳng bình thường và sau đó trừ kết quả khỏi vectơ chuyển động của bạn.

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

Một cái gì đó như thế nào. Mặc dù trong sơ đồ dễ thương của bạn, đầu vào dường như cách xa tường nên tôi hơi bối rối.


xin lỗi anh ấy phải ở trước một bức tường thẳng đứng ở đó. vẽ khủng khiếp
Iain

1
Tôi hơi bối rối về sản phẩm chấm. Không chấm sản phẩm là vô hướng?
Iain

1
Có, nhưng bạn nhân nó với bình thường (một vectơ) để có được vectơ chuyển động không mong muốn của bạn. Một vectơ (x, y, z) nhân với vô hướng s giúp bạn có vectơ (sx, sy, sz).
Chris Howe

Xong, thay đổi các biến để hy vọng phù hợp với sơ đồ. :)
Chris Howe

@ Tôi thực sự đang cố gắng hiểu cách sử dụng câu trả lời này nhưng dường như tôi không thể nắm bắt được nó. Khi tôi tạo mã chính xác này, tôi nhận được desiredMotionkết quả thực sự kỳ lạ . Bạn đã bao giờ làm việc này?
kiểm tra

1

Mặc dù chỉ cần loại bỏ thành phần chuyển động theo hướng bình thường, nó có thể phù hợp với lối chơi của bạn để xoay vectơ chuyển động thay thế. Ví dụ, trong trò chơi hành động góc nhìn thứ 3, có thể dễ dàng bị treo lên tường và các ranh giới khác, do đó bạn có thể đoán được những gì người chơi dự định.

// 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);
   }
}

Đẹp. Nhưng nếu bạn mở rộng theo một yếu tố mờ nhạt, điều đó sẽ khiến bạn va vào tường và trượt dọc theo nó, hay đó chỉ là một trường hợp điều chỉnh nó?
Chris Howe

Tôi nghĩ rằng bạn tinh chỉnh nó để nhìn ok; chắc chắn nếu nó quá lớn, nó sẽ trông giống như bạn đang nảy nhưng nếu nó đủ tinh tế, nó sẽ giúp bạn không bị treo lên trên những khúc cua nhẹ trên bề mặt.
dash-tom-bang
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.