使用传感器来改变物理引擎中的重力

时间:2015-10-26 13:25:23

标签: html5 cordova physics sensor physicsjs

我正在寻找一种在移动设备中使用传感器的方法(在Cordova应用程序中)来改变物理引擎的行为。 目前正在使用PhysicsJS,但也发现了matter.js作为物理引擎的候选者。

在第一步中,发动机的重力应该改变,因此它不使用设备的y方向,而是"真正的"方向取决于设备的旋转方式。稍后(可选)z方向也可以用来改变物理引擎的世界。

有人可以给我提示和/或示例吗?

  • 要读取的传感器(方向,加速度计,陀螺仪,重力,?)。在体面的智能手机/浏览器中是否有集成的HTML5支持,还是添加Cordova插件更好?
  • 应用于物理引擎的更改以反映移动设备的新位置

环境:Cordova,Ionic,HTML5,Android> = Kitkat,iOS> = 7

到目前为止我自己的发现:

我认为它的deviceorientation事件最符合我的要求。一个非常原始的实现(这并不令人满意)是:

var acceleration = Physics.behavior('constant-acceleration')
    .setAcceleration({x: 0, y: GRAVITY * options.gravityFactor});

world.add([acceleration]);

if (window.DeviceOrientationEvent) {
    var deviceOrientationHandler = function (event) {
        world.one('step', function () {
            acceleration.setAcceleration({
                x: (90 / event.gamma) * GRAVITY,
                y: (90 / event.beta) * GRAVITY
            });
        });
    };
    window.addEventListener('deviceorientation',
        deviceOrientationHandler, false);
}

似乎更好的选择是计算设备关于x,y的角度,然后将重力矢量分成x和y部分。也许它更复杂。这对我来说听起来像是很多数学。当然已经有数百或数千人已经这样做了,你能帮助我吗?

所以现在剩下的更具体的问题是:

如何在2D物理引擎中将DeviceOrientationEvent beta和gamma转换为重力?

2 个答案:

答案 0 :(得分:1)

Found a first solution:

if (window.DeviceOrientationEvent) {
    var deviceOrientationHandler = function (event) {

        var pitch = Math.PI * event.beta / 180;
        var roll = Math.PI * event.gamma / 180;

        var acc = {
            x: Math.cos(pitch) * Math.sin(roll) * GRAVITY,
            y: Math.sin(pitch) * GRAVITY
        };

        world.one('step', function () {
            acceleration.setAcceleration(acc);
        });
    };
    window.addEventListener('deviceorientation',
        deviceOrientationHandler, false);
}

It's working quite well on Android, but on iOS when pitching the phone too much, iOS changes orientation to upside-down and then gravity seems to be inverted. Sure there's a solution for this...

答案 1 :(得分:1)

你有没有尝试过这个问题.js移动演示? http://brm.io/matter-js-mobile/

它展示了如何根据移动设备的传感器改变重力。

源代码在这里:
https://github.com/liabru/matter-js/blob/master/demo/js/DemoMobile.js