refactor: better physics simulation

This commit is contained in:
cha0s 2021-03-23 06:09:47 -05:00
parent 6be4668da5
commit 4fc201d392
3 changed files with 32 additions and 7 deletions

View File

@ -11,7 +11,7 @@ import CircleShape from '../shape/circle';
import RectangleShape from '../shape/rectangle';
// Translate "real" coordinates to physics coordinates.
const SCALE = 1;
const SCALE = 1 / 12;
export default class Body extends AbstractBody {
@ -106,6 +106,10 @@ export default class Body extends AbstractBody {
return this.filterCategories[group];
}
set friction(friction) {
MatterBody.set(this.matterBody, 'frictionAir', friction);
}
static lookupBody(matterBody) {
return this.bodies
? this.bodies.get(matterBody)

View File

@ -76,8 +76,10 @@ export default class World extends AbstractWorld {
const it = this.entities.entries();
for (let value = it.next(); value.done !== true; value = it.next()) {
const [body] = value.value;
const [x, y] = Vector.scale(body.impulse, stepTime);
MatterBody.translate(body.matterBody, {x, y});
const [x, y] = Vector.scale(body.impulse, stepTime / (1 - body.matterBody.frictionAir));
if (x || y) {
MatterBody.setVelocity(body.matterBody, {x, y});
}
}
Engine.update(this.engine, stepTimeInMs);
// eslint-disable-next-line no-param-reassign

View File

@ -1,9 +1,16 @@
import {Vector} from '@avocado/math';
import {Trait} from '@avocado/traits';
import {StateProperty, Trait} from '@avocado/traits';
import {compose} from '@latus/core';
import BodyView from '../body-view';
export default () => class Physical extends Trait {
const decorate = compose(
StateProperty('friction', {
track: true,
}),
);
export default () => class Physical extends decorate(Trait) {
#body;
@ -15,6 +22,7 @@ export default () => class Physical extends Trait {
const world = this.#world;
if (world) {
const body = world.createBody(this.entity.shape);
body.friction = this.entity.friction;
world.associateBodyWithEntity(body, this.entity);
body.setCollisionForEntity(this.entity);
world.addBody(body);
@ -64,6 +72,12 @@ export default () => class Physical extends Trait {
};
}
static defaultState() {
return {
friction: 0.5,
};
}
static dependencies() {
return [
'Shaped',
@ -86,10 +100,15 @@ export default () => class Physical extends Trait {
this.removeFromWorld();
},
frictionChanged: () => {
if (this.#body) {
this.#body.friction = this.entity.friction;
}
},
positionChanged: () => {
if (this.#body) {
const {position} = this.entity;
this.#body.position = position;
this.#body.position = this.entity.position;
}
},