问题:
我一直在与Threejs一起制作第一人称迷宫游戏。我最近包含了DeviceOrientationControls以开始向VR移动,但我之前用于移动相机的系统与相机分开。相机不再使用箭头键移动。
<小时/> 的更新:
Alex Fallenstedt找到了我想要的完美example。
但是,我有一些问题;
资源:
How to control camera both with keyboard and mouse - three.js
Detecting arrow key presses in JavaScript
How to move camera along a simple path
How to control camera movement with up,down,left,right keys on the keyboard
<小时/> 的比较:
以下是它的表现(使用工作控件) http://orenda.ga/stackoverflow/Nonvr.mp4
以下是它现在的行为(使用Orientation) http://orenda.ga/stackoverflow/VR.mp4
注意: 我没有包括我的剧本,因为我认为这个问题不需要。如果您需要,请询问,我会在此处插入。
答案 0 :(得分:0)
回答你的两个问题:
1)脚本如何让相机移动?
让我们将脚本分解为基础。 The script begins by adding a bit of state to determine if the user is moving forward.。当用户与W,A,S,D交互时,该状态改变。 We add event listeners that will change this state when a user presses a key or lifts up from a key.。现在,每个渲染的帧,我们都可以在特定的方向上添加SingleThreadModel
,具体取决于按下的键的状态。 This happens here。我们现在有一个速度的概念。您应该在velocity
中控制记录速度值,并在移动时检查它的变化情况。
那么这个animate()
变量如何实际移动相机?好吧,这个脚本is also using an additional script called PointerLockControls
。您可以看到velocity
here的完整脚本。请注意PointerLockControls&#39;唯一的参数是相机。为了移动相机,我们需要在PointerLockControls
中使用一些漂亮的功能,例如getObject
.。这将返回您传递到PointerLockControls(也称为相机)的THREE.js对象。
一旦我们可以获得相机,我们就可以通过我们之前创建的PointerLockControls
velocity
翻译其x,y和z值来移动相机。in our animate function.。您可以在Object3D
documentation.
2)我如何简化和/或将其应用到我的工作中?
这可能是将第一人称控件实现到相机的最简单方法。我与之前共享的脚本示例中的其他所有内容都用于检查。就像用户在threeJS对象中一样,允许他们跳转。或者添加concept of mass and gravity以便在用户跳转后始终将用户拉下来。 One thing that you might find very useful is to check if the pointer is in the browser's window!。举个例子,将其分解为最简单的组件,然后从那里构建。
这是一个代码示例,向您展示如何平滑地向前移动摄像机,没有指针锁控制,从line 53
https://codepen.io/Fallenstedt/pen/QvKBQo开始