相对于透视而言,如何在ThreeJS中移动相机?
题:
我一直在与Threejs合作开展第一人称迷宫游戏。 我最近包括DeviceOrientationControls开始将其移动到VR,但我以前的移动相机的系统与相机分开。 相机不再使用箭头键移动。
更新 :
Alex Fallenstedt找到了我想要的完美例子。
但是,我有一些问题;
资源 :
如何用键盘和鼠标控制摄像头 - three.js
检测JavaScript中的箭头键按下
如何沿着简单的路径移动相机
如何用键盘上的上,下,左,右键控制摄像机的移动
比较 :
以下是它的工作原理(带有工作控件)http://orenda.ga/stackoverflow/Nonvr.mp4
以下是它现在的行为(与方向)http://orenda.ga/stackoverflow/VR.mp4
注意:我没有包含我的脚本,因为我认为这个问题不需要。 如果你需要它,请问,我会在这里插入它。
为了回答你两个问题:
1)剧本如何使相机移动?
让我们按照它的基本原则打破剧本。 该脚本首先添加一些状态以确定用户是否正在向前移动。当用户与W,A,S,D交互时,此状态会改变。 我们添加事件侦听器,当用户按下按键或从按键抬起时会改变此状态。现在,渲染的每一帧都可以在特定方向上添加velocity
,具体取决于按下哪些按键的状态。 这发生在这里。 我们现在有一个速度的概念。 您应该在animate()
控制速度值的记录并检查它在移动时的变化。
那么这个velocity
变量如何实际移动相机? 那么这个脚本还使用了一个名为PointerLockControls
脚本。 您可以在这里看到PointerLockControls
的完整脚本。 注意PointerLockControls的唯一参数是一个摄像头。 为了移动相机,我们需要用一些漂亮的功能PointerLockControls
喜欢getObject
..这将返回three.js所反对,你传递给PointerLockControls(又名相机)。
一旦我们可以获得相机,我们就可以通过将它的x,y和z值转换为我们之前在我们的动画函数中创建的velocity
来移动相机。您可以在Object3D
文档中通过这些方法阅读更多关于翻译对象的知识。
2)我如何简化和/或将其实施到我的工作中?
这可能是实现摄像头的第一人称控制的最简单方法。 我之前与您分享的脚本示例中的其他内容都是用于检查的。 就像用户在3JS对象中一样,让他们跳转。 或者增加质量和重力的概念,以便在用户跳起之后始终将用户拉下来。 你可能会发现非常有用的一件事是检查指针是否在浏览器窗口中! 以此为例,将其分解为最简单的组件,然后从中构建。
下面是一个codepen示例 ,向您展示如何平稳移动摄像头,无需使用指针锁控制,从line 53
开始https://codepen.io/Fallenstedt/pen/QvKBQo
上一篇: How can I move the camera in ThreeJS relative to perspective?