Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/421.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Javascript中处理相机样式的鼠标移动(支持连续鼠标移动)_Javascript_Mouse_Handler_Webgl - Fatal编程技术网

在Javascript中处理相机样式的鼠标移动(支持连续鼠标移动)

在Javascript中处理相机样式的鼠标移动(支持连续鼠标移动),javascript,mouse,handler,webgl,Javascript,Mouse,Handler,Webgl,想法:我正在创建一个简单的WebGL脚本(使用mrdoob's Wonder three.js),允许用户在对象世界中控制相机。相机应该模拟传统的第一人称射击相机(例如,参考团队堡垒2)。也就是说,摄影机仅在鼠标移动时移动 问题:在Javascript中,检测鼠标移动的唯一方法是光标本身是否移动。相比之下,FPS游戏并不显示光标——它们只是根据鼠标本身的移动来确定相机的移动。所以,你可以在鼠标垫上任意方向移动鼠标,它总是可以工作的 但在浏览器上,由于相机的移动是基于光标的,所以只能移动到目前为止

想法:我正在创建一个简单的WebGL脚本(使用mrdoob's Wonder three.js),允许用户在对象世界中控制相机。相机应该模拟传统的第一人称射击相机(例如,参考团队堡垒2)。也就是说,摄影机仅在鼠标移动时移动

问题:在Javascript中,检测鼠标移动的唯一方法是光标本身是否移动。相比之下,FPS游戏并不显示光标——它们只是根据鼠标本身的移动来确定相机的移动。所以,你可以在鼠标垫上任意方向移动鼠标,它总是可以工作的

但在浏览器上,由于相机的移动是基于光标的,所以只能移动到目前为止。当光标到达屏幕边缘时,用户无法朝该方向看得更远(例如,将鼠标移到屏幕左边缘,就不能再向左看了)

解决方案:我想到了两种解决方案,但我都不知道如何实施。或者

  • 移动鼠标后,javascript会将其重置到屏幕中央。这样,在每次鼠标移动后,玩家可以再次自由地向任何方向移动。问题是,根据我所做的研究,Javascript无法控制用户鼠标的位置(这是可以理解的,因为它在恶意网站上是一个无与伦比的麻烦)

  • 或者,鼠标“环绕”屏幕。这意味着,当用户到达屏幕的一个边缘时,鼠标将继续移动到屏幕的另一侧。(参见:)然而,这似乎也不是javascript的固有功能,而是第三方程序可以解决的问题


  • 那么,这个问题有意义吗?如果是这样的话,我有没有办法实现上述解决方案,或者我还缺少另一个解决方案?

    你说得对。基于标准的网络技术不会让你随心所欲地抓取鼠标

    这就是说:您可能能够制作(或找到)一个特殊的SWF,它可以收集鼠标移动数据并将其传递给javascript。它不会约束光标移动,尽管在鼠标捕捉处于活动状态时可以使用CSS隐藏光标。但是,即使光标已经到达屏幕的左边缘,它也可以继续触发“鼠标左移”事件


    任何这样的SWF都可能无法在光标位于视口之外(即浏览器chrome上)时捕获移动。

    鉴于在HTML5/Javascript中显然不可能这样做,那么这种变体如何:将鼠标位置(而不是鼠标移动)视为表示转动速率

    因此,如果鼠标位于中心左侧超过某个阈值,相机将向左旋转;鼠标越左,相机转动得越快。要停止转动,玩家将鼠标移回中心


    对我来说,这是一个恼人的用户界面,至少一开始是这样,但也许玩家会习惯它。因为我们没有任何完美的解决方案,所以可能值得一试。您可以通过允许箭头键在许多FPSE中的工作方式来缓解此问题,按下箭头键时旋转相机。

    全球社区目前正在起草规范以解决此问题。你说的是“鼠标锁定”。我已经在这个标准的第一阶段做了一些工作,以帮助确定需要什么。请为这些问题投票,并订阅指定的邮件列表,以便我们所有人尽快更正此问题

    • 铬虫:
    • Firefox错误:
    • W3C邮件列表:
    • 提案草案:
    然而,仍然有一种方法可以实现您的目标(这是我发现的另一种方法):控制鼠标的本地插件


    (我也在制作一款FPS游戏,但由于这一限制,目前不会发布)

    对于仍有兴趣实现这一点的任何人来说,它现在有些可用

    使用:

    document.addEventListener('pointerlockchange', changeCallback, false);
    

    参见示例

    Urgh。虽然这可能会起作用,但我觉得将SWF覆盖到WebGL脚本会很慢,而且很难实现。不过,我很感谢你的反馈。SWF不一定是一个覆盖层。与嵌入不可见(或1x1px)SWF以播放音频资源的方式类似,该SWF可能仅通过在页面上提供鼠标移动数据,而不管鼠标是否在SWF上。不过,你需要问一些Flash的人这个问题。有趣的问题。永远不要低估F11,即全屏观看。:-)@zourtney Full screen无法解决此问题,因为:1)鼠标在屏幕边界处被封住;2) 使用多监视器设置,鼠标可以离开浏览器区域。检查我的回答。@Chiguireitor,是的,我意识到单靠全屏是不够的,因为你提到的原因。我不知道这有一个草案规范。谢谢你今天教我一些东西。你的答案得到了我的支持:-)我想我们都同意,随着网络技术越来越普及,这种要求只会越来越流行。我很欣赏这个答案,尽管我认为你是对的。这个用户界面可能会令人沮丧。我可能只是用箭头键。我不知道有一个实际的术语。谢谢你的信息!我一定会参与的。是的!这里还描述了API: