playcanvas
Version:
Open-source WebGL/WebGPU 3D engine for the web
141 lines (140 loc) • 4.52 kB
JavaScript
import { BODYTYPE_DYNAMIC, BODYTYPE_KINEMATIC } from "../../components/rigid-body/constants.js";
import { PhysicsBody } from "../physics-body.js";
class AmmoPhysicsBody extends PhysicsBody {
_world;
_type;
_noContactResponse;
constructor(world, nativeBody, type, noContactResponse) {
super();
this._world = world;
this.nativeBody = nativeBody;
this._type = type;
this._noContactResponse = noContactResponse;
}
setFriction(friction) {
this.nativeBody.setFriction(friction);
}
setRollingFriction(friction) {
this.nativeBody.setRollingFriction(friction);
}
setRestitution(restitution) {
this.nativeBody.setRestitution(restitution);
}
setDamping(linear, angular) {
this.nativeBody.setDamping(linear, angular);
}
setLinearFactor(factor) {
const vec = this._world._btVec1;
vec.setValue(factor.x, factor.y, factor.z);
this.nativeBody.setLinearFactor(vec);
}
setAngularFactor(factor) {
const vec = this._world._btVec1;
vec.setValue(factor.x, factor.y, factor.z);
this.nativeBody.setAngularFactor(vec);
}
setLinearVelocity(velocity) {
const vec = this._world._btVec1;
vec.setValue(velocity.x, velocity.y, velocity.z);
this.nativeBody.setLinearVelocity(vec);
}
getLinearVelocity(velocity) {
const vec = this.nativeBody.getLinearVelocity();
velocity.set(vec.x(), vec.y(), vec.z());
}
setAngularVelocity(velocity) {
const vec = this._world._btVec1;
vec.setValue(velocity.x, velocity.y, velocity.z);
this.nativeBody.setAngularVelocity(vec);
}
getAngularVelocity(velocity) {
const vec = this.nativeBody.getAngularVelocity();
velocity.set(vec.x(), vec.y(), vec.z());
}
setMass(mass) {
const vec = this._world._btVec1;
this.nativeBody.getCollisionShape().calculateLocalInertia(mass, vec);
this.nativeBody.setMassProps(mass, vec);
this.nativeBody.updateInertiaTensor();
}
isActive() {
return this.nativeBody.isActive();
}
activate() {
this.nativeBody.activate();
}
setTransform(position, rotation) {
const body = this.nativeBody;
const transform = this._world._btTransform;
const vec = this._world._btVec1;
const quat = this._world._btQuat;
vec.setValue(position.x, position.y, position.z);
quat.setValue(rotation.x, rotation.y, rotation.z, rotation.w);
transform.setOrigin(vec);
transform.setRotation(quat);
body.setWorldTransform(transform);
if (this._type === BODYTYPE_KINEMATIC) {
const motionState = body.getMotionState();
if (motionState) {
motionState.setWorldTransform(transform);
}
} else if (this._type === BODYTYPE_DYNAMIC && !this._noContactResponse && body.setInterpolationWorldTransform) {
body.setInterpolationWorldTransform(transform);
vec.setValue(0, 0, 0);
body.setInterpolationLinearVelocity(vec);
body.setInterpolationAngularVelocity(vec);
}
body.activate();
}
getTransform(position, rotation) {
const motionState = this.nativeBody.getMotionState();
if (motionState) {
const transform = this._world._btTransform;
motionState.getWorldTransform(transform);
const p = transform.getOrigin();
const q = transform.getRotation();
position.set(p.x(), p.y(), p.z());
rotation.set(q.x(), q.y(), q.z(), q.w());
}
}
setKinematicTarget(position, rotation) {
const motionState = this.nativeBody.getMotionState();
if (motionState) {
const transform = this._world._btTransform;
const vec = this._world._btVec1;
const quat = this._world._btQuat;
vec.setValue(position.x, position.y, position.z);
quat.setValue(rotation.x, rotation.y, rotation.z, rotation.w);
transform.setOrigin(vec);
transform.setRotation(quat);
motionState.setWorldTransform(transform);
}
}
applyForce(force, relativePoint) {
const vec1 = this._world._btVec1;
const vec2 = this._world._btVec2;
vec1.setValue(force.x, force.y, force.z);
vec2.setValue(relativePoint.x, relativePoint.y, relativePoint.z);
this.nativeBody.applyForce(vec1, vec2);
}
applyTorque(torque) {
const vec = this._world._btVec1;
vec.setValue(torque.x, torque.y, torque.z);
this.nativeBody.applyTorque(vec);
}
applyImpulse(impulse, relativePoint) {
const vec1 = this._world._btVec1;
const vec2 = this._world._btVec2;
vec1.setValue(impulse.x, impulse.y, impulse.z);
vec2.setValue(relativePoint.x, relativePoint.y, relativePoint.z);
this.nativeBody.applyImpulse(vec1, vec2);
}
applyTorqueImpulse(torque) {
const vec = this._world._btVec1;
vec.setValue(torque.x, torque.y, torque.z);
this.nativeBody.applyTorqueImpulse(vec);
}
}
export {
AmmoPhysicsBody
};