我正在寻找一种在移动设备中使用传感器的方法(在Cordova应用程序中)来改变物理引擎的行为。 目前正在使用PhysicsJS,但也发现了matter.js作为物理引擎的候选者。
在第一步中,发动机的重力应该改变,因此它不使用设备的y方向,而是"真正的"方向取决于设备的旋转方式。稍后(可选)z方向也可以用来改变物理引擎的世界。
有人可以给我提示和/或示例吗?
环境: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转换为重力?
答案 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