如何相对于透视图在ThreeJS中移动相机?

时间:2017-04-24 18:17:27

标签: javascript camera three.js google-cardboard

问题:

我一直在与Threejs一起制作第一人称迷宫游戏。我最近包含了DeviceOrientationControls以开始向VR移动,但我之前用于移动相机的系统与相机分开。相机不再使用箭头键移动。

  • 如何在使用DeviceOrientationControls更新相机时再次使用箭头键移动相机?
  • 如果可能,我如何相对于相机的视角自动向前移动?

<小时/> 的更新

  

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

注意: 我没有包括我的剧本,因为我认为这个问题不需要。如果您需要,请询问,我会在此处插入。

1 个答案:

答案 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开始