即使光标位于屏幕边缘也能跟踪鼠标速度

Track mouse speed even when cursor is at edge of screen

我写了一个小 Javascript 应用程序来跟踪和显示鼠标速度的 x 和 y 分量。它从当前位置减去光标的先前位置,并除以时间。很简单的东西。这是完整的工作来源:

<!DOCTYPE html5>
<html>
    <head>
        <meta charset="UTF-8">
        <style>
        * {
            background-color:#000000;
        }

        html {
            width:100%;
            height:100%;
        }

        #readout {
            background-color:#FFFFFF;
            border: 8px solid #34a1ff;
            width: 162px;
            height: 100px;
            position:absolute;
            top:0;
            bottom: 0;
            left: 0;
            right: 0;
            margin: auto;
            padding: 16px;
        }

        .text {
            background-color:#FFFFFF;
        }
        </style>
    </head>
    <body>
        <div id="readout">
            <span id="xLabel" class="text">X: </span>
            <span id="xValue" class="text"></span>
            <br>
            <span id="yLabel" class="text">Y: </span>
            <span id="yValue" class="text"></span>
        </div>
        <script>
        // Where the speed will be displayed
        window.xDisplay = document.getElementById("xValue");
        window.yDisplay = document.getElementById("yValue");

        // Keep track of last time mouse was moved
        window.lastTime = new Date().getTime();
        window.lastDeltaTime = 0;
        window.lastMouseX = 0;
        window.lastMouseY = 0;
        window.lastVX = 0; // for smoothing
        window.lastVY = 0;

        // Listen for mouse move event
        document.addEventListener('mousemove', function(e){ 

            // Get current mouse position
            var currentX = e.clientX || e.pageX;
            var currentY = e.clientY || e.pageY;

            // Get distance travelled from last mouse position
            var deltaX = currentX - lastMouseX;
            var deltaY = currentY - lastMouseY;

            // Update mouse position
            lastMouseX = currentX;
            lastMouseY = currentY;

            // Get current time
            var currentTime = new Date().getTime();

            // Get time elapsed since last mouse event
            var deltaTime = currentTime - lastTime;

            // Update last time
            lastTime = currentTime;

            // Get velocity components
            var xSpeed = deltaX / deltaTime;
            var ySpeed = deltaY / deltaTime;

            // Smooth out velocity
            var xSmooth = (xSpeed*2 + lastVX)/3;
            var ySmooth = (ySpeed*2 + lastVY)/3;

            // Update previous components
            lastVX = xSpeed;
            lastVY = ySpeed;

            // Display velocity
            xDisplay.innerHTML = xSmooth.toFixed(3);
            yDisplay.innerHTML = ySmooth.toFixed(3);

        }, false);

        </script>
    </body>
</html>

这将用于旨在 运行 全屏模式的应用程序中。我遇到的问题是当光标一直停在屏幕的边缘时,用户一直在那个方向移动鼠标。 (示例:光标一直在屏幕的右边缘,但用户一直向右移动鼠标)。

在上述情况下,应用显示速度为零,因为光标位置未更新。但是,我需要一个即使在光标到达边缘后仍能继续显示实际鼠标速度的解决方案(本网站上的 none 个类似问题解决了这个问题)。

这很重要,因为用例将在 WebGL 上下文中,其中鼠标用于控制第一人称视角的旋转。用户需要能够在旋转速度基于鼠标速度(而不是位置!)的情况下根据需要继续旋转他们的视图多次,而这根本无法通过从光标位置计算鼠标速度来实现。

这可能需要一些创意,但我相信可以做到。提前感谢任何解决方案!

找到解决方案,以防以后有人偶然发现这个问题。

Pointer Lock API 正是我所需要的。