【问题标题】:Use sensors to change gravity in physics engine使用传感器改变物理引擎中的重力
【发布时间】:2023-03-08 21:31:02
【问题描述】:

我正在寻找一种方法来使用移动设备中的传感器(在 Cordova 应用中)来改变物理引擎的行为。 目前正在使用 PhysicsJS,但也发现了 matte.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 转换为重力?

【问题讨论】:

    标签: html cordova physics sensors physicsjs


    【解决方案1】:

    您尝试过matter.js 移动演示吗?
    http://brm.io/matter-js-mobile/

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

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

    【讨论】:

    • Thnx,它可以帮助我将 beta/gamma 转换为其他方向(90、-90、-180)。虽然看起来重力的处理方式与 PhysicsJS 中的处理方式不同。
    • 谢谢@liabru!好像github上的源代码不见了。我现在在哪里可以找到这个特定的代码源?
    【解决方案2】:

    找到第一个解决方案:

    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);
    }
    

    它在 Android 上运行良好,但在 iOS 上,当手机倾斜太多时,iOS 将方向改变为倒置,然后重力似乎反转了。当然有解决方案...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 2011-12-24
      • 2012-09-16
      • 1970-01-01
      相关资源
      最近更新 更多