javascript - 带有 DeviceOrientationControls 的键盘控制

标签 javascript three.js google-cardboard virtual-reality

我目前正在使用 third.js 创建 VR Web 应用程序。作为相机控制,我使用设备方向控制 used here在 Google Cardboard Three.js 演示中。

我需要做的是向其中添加键盘控件(例如向上箭头前进等)。我在这里摆弄了在两个轴(x 和 z)上移动相机:

if (e.keyCode == '38') {
    camera.position.set(0, 10, camera.position.z+4);

    controls.target.set(
        camera.position.x +4,
        camera.position.y,
        camera.position.z
    );
    effect.render(scene, camera);
...

但是,我想让 Angular 色相对于他们所看的位置移动(例如,您向一个方向看,然后按向上箭头, Angular 色就会按照您看的方向移动)。就像第一人称视角一样。

有人对如何做到这一点有任何想法吗?我尝试过使用 Three.js 中的第一人称控制,但这消除了 VR 游戏所必需的头部跟踪。

任何答案将不胜感激。 (我的源代码实际上只是 Google Cardboard Three.js 演示代码,并添加了检测按键的功能)

最佳答案

我通过不同的方法解决了这个问题。我创建了一个在场景中移动的 object3d。模型和相机是该对象的子对象。

我正在用相机旋转 3d 对象,同时沿相反方向旋转模型。当我旋转相机对象时,它看起来保持方向。当我想移动对象时,只需用相机 translateX 对象并将模型旋转到 0。这就成功了。

在长距离(我有数百万台)上开始变得不稳定。原因是失去了精度。

我通过将对象的位置保持在 0,0,0 并将所有其他对象向相反方向移动来解决这个问题。这使得你的模型仍然在 0,0,0 坐标上,并且旋转正确,并且世界正在移动。

最简单的例子:

你尝试类似的事情

scene.add(character_model);
scene.add(camera);
//camera.rotate ....
character_model.translateX(1);
character_model.rotateX(1);
//etc ...

现在您尝试围绕枢轴(character_model)移动相机,但这是过于复杂的数学。

尝试:

var controls_dimension = new THREE.Object3D();
scene.add(controls_dimension);
controls_dimension.add(character_model);
controls_dimension.add(camera);

//use controls to rotate with this object, not with character_model
controls_dimension.rotateX(2);

// in the same rotate model to opposite direction. You can make 
// illusion of rotating camera, not a model.
character_model.rotateX(2*-1);

/* 
when you want to go in camera direction=controls_dimension=controls_dimension.translateX(1) 
and we moving (you most only animate model rotation to controls_dimension.rotation)
*/

关于javascript - 带有 DeviceOrientationControls 的键盘控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30565738/

相关文章:

math - 在 Three.js 中根据局部向量定位子网格

java - 角色的头已经转了60°,怎么让角色的 body 继续旋转呢?

javascript - 有没有办法在Webview中从JavaScript调用Java?

javascript - 删除对象键和值中的前导和尾随空格

javascript - 使用 Projection 在 Three.js 中将世界坐标转换为屏幕坐标

javascript - 立方体网格未在指定的 div 中绘制

unity3d - unity : VRDevice cardboard not supported in Editor Mode. 请在目标设备上运行

android - 如何修复 HelloCardboard 示例的 NDK 构建错误

javascript - 如何在可编辑的 GridX 中将局部变量作为属性提供给单元格编辑器?

javascript - 如何导入 Typescript 所需的 chrono 库?