Tôi phát triển phần mềm chuyển đổi đầu vào chuyển động thành đầu vào chuột nhạy và chính xác, cũng như duy trì một trang web cố gắng giúp các nhà phát triển tự thực hiện các giải pháp tốt như nhau. Tôi thường khuyên bạn nên chống lại ngưỡng di chuyển, mặc dù điều này phụ thuộc vào mức độ đáp ứng và độ chính xác của người chơi muốn, tôi rất vui vì điều đó phù hợp với bạn trong tình huống của bạn. Nhưng ở đây tôi sẽ đưa ra một giải pháp khác:
Tôi sử dụng một cái gì đó gọi là Soft Tiered Smoothing . Ý tưởng là chúng ta chuyển hướng đầu vào thông qua các thuật toán làm mịn khác nhau tùy thuộc vào cường độ hiện tại của vận tốc con quay (trong thực tế, một trong những thuật toán làm mịn đó chỉ là "không làm mịn"). Đó là phần "tầng". Phần "mềm" là chúng ta thực sự có thể phân chia đầu vào trơn tru giữa các thuật toán làm mịn khác nhau tùy thuộc vào cách so sánh với 2 ngưỡng.
Nó bảo vệ sự dịch chuyển một cách chính xác và không thêm bất kỳ độ trễ nào cho các chuyển động nhanh.
Trong thực tế, bạn có hai ngưỡng. Khi cường độ của tốc độ đầu vào nhỏ hơn ngưỡng dưới, chúng tôi đang sử dụng thuật toán làm mịn đơn giản (trung bình trên nhiều khung hình). Khi nó lớn hơn ngưỡng khác, chúng tôi không sử dụng thuật toán làm mịn nào cả. Nhưng trong trường hợp này, chúng ta vẫn chuyển các số không cho thuật toán làm mịn ngưỡng thấp hơn.
Khi vận tốc đầu vào nằm giữa hai ngưỡng, chúng ta chia đầu vào giữa hai thuật toán tương ứng.
Đây là một đoạn trích từ bài viết trên:
GetSoftTieredSmoothedInput(Vec2 input, float threshold1, float threshold2) {
// this will be length(input) for vectors
float inputMagnitude = Abs(input);
float directWeight = (inputMagnitude - threshold1) / (threshold2 - threshold1);
directWeight = clamp(directWeight, 0, 1);
return GetDirectInput(input * directWeight) +
GetSmoothedInput(input * (1.0 - directWeight));
}
GetDirectInput chỉ trả về những gì được cung cấp cho nó, nhưng nó cho thấy rằng một thuật toán làm mịn khác có thể được sử dụng ở đây. GetSmoothedInput có vận tốc và trả về tốc độ được làm mịn.
Với Soft Smoothed Smoothing, không có làm mịn được áp dụng cho các chuyển động rõ ràng có chủ ý (trên ngưỡng lớn hơn), có làm mịn được áp dụng để che đi một lượng nhỏ jitter, điều này cũng sẽ ảnh hưởng đến các chuyển động rất nhỏ, nhưng khi bạn đạt được ngưỡng của mình thì không đúng lắm đáng chú ý. Và có một sự chuyển tiếp rất suôn sẻ giữa hai người (không có điều đó, jitter thực sự có thể được khuếch đại).
Mặc dù các câu trả lời khác đều đúng khi nói rằng rất khó để nhận ra jitter ngay lập tức nhận được đầu vào, nhưng cũng đúng là jitter hầu như luôn luôn có vận tốc rất thấp và độ trễ đầu vào đi kèm làm trơn tru ít được chú ý hơn đối với các đầu vào tốc độ thấp .
Như bài viết đã đề cập, điều này được sử dụng ở một vài nơi trong công cụ nguồn mở JoyShockMapper của tôi , một trình ánh xạ đầu vào biến đầu vào con quay hồi chuyển thành đầu vào chuột. Ngay cả đối với những người sử dụng các công cụ ánh xạ khác như Steam hoặc reWASD, một số sử dụng JoyShockMapper cùng một lúc chỉ để điều khiển con quay hồi chuyển của nó.
Câu trả lời này giả định đầu vào được đưa ra với vận tốc góc (thường thấy với các bộ điều khiển có điều khiển chuyển động), không phải là định hướng tuyệt đối (nghe có vẻ như Razer Hydra đang mang lại cho bạn). Với định hướng tuyệt đối, tôi hy vọng bạn có thể sử dụng sự khác biệt giữa hướng hiện tại và hướng được báo cáo trước đó để có vận tốc, nhưng tôi không biết chắc chắn liệu nó có hoạt động tốt như với các bộ điều khiển tự báo cáo vận tốc góc không .
Một giải pháp làm mịn phổ biến khi bạn xử lý một vị trí / định hướng tuyệt đối thay vì vận tốc là nội suy theo hướng mục tiêu của bạn theo thời gian - điều này được mô tả rất chi tiết trong bài viết này của Gamasutra. Điều này cũng có thể hoạt động với Soft Smoothed Smoothing. Bạn sẽ tính toán cường độ vận tốc bằng cách sử dụng chênh lệch giữa đầu vào này và đầu vào được báo cáo trước đó. Bạn sẽ áp dụng sự khác biệt về hướng giữa khung này và khung cuối cùng nhân với giá trị "directeight" của bạn như được tính trong đoạn trích ở trên. Bước cuối cùng là thêm đầu vào được làm mịn, nhưng do cách làm mịn định hướng nội suy hoạt động, bạn chỉ cần áp dụng thay đổi hướng nội suy như bình thường - hoàn toàn không cần phải xem xét "directeight". Chỉ cần đặt hướng mục tiêu của bạn (đây là hướng bạn đang nội suy với việc làm mịn được mô tả trong bài viết Gamasutra đó) theo bất kỳ hướng nào bạn nhận được từ thiết bị và nội suy hướng của bạn theo hướng đó như được mô tả trong bài viết đó.