我正在寻找一种在移动设备中(在 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 转换为重力?