physics crap

beta.r3js.org
polygonboutique 2016-10-04 15:32:12 +02:00
parent 104f7d66bd
commit b8be655261
1 changed files with 186 additions and 26 deletions

View File

@ -1180,36 +1180,40 @@ GameLib.D3.Physics.World = function(
* Physics Rigid Body Superset
* @param id
* @param name
* @param position
* @param rotation
* @param scale
* @param shapes GameLib.D3.Physics.Shape[]
* @constructor
*/
GameLib.D3.Physics.RigidBody = function(
id,
name,
position,
rotation,
scale,
shapes
name
) {
this.position = new this.Vector3(0,0,0);
this.bodyObject = null;
};
/**
* Physics Rigid Body Vehicle Superset
* @constructor
*/
GameLib.D3.Physics.RigidBody.Vehicle = function() {
GameLib.D3.Physics.Vehicle = function(
) {
this.vehicleObject = null;
};
/**
* Physics Shape Superset
* @constructor
*/
GameLib.D3.Physics.Shape = function() {};
GameLib.D3.Physics.Shape = function(
shapeObject, // Physics engine specific
shapeType
) {
this.shapeObject = shapeObject;
this.shapeType = shapeType;
this.scale = new GameLib.D3.Vector3(1, 1, 1);
};
GameLib.D3.Physics.Shape.TYPE_SPHERE = 1;
GameLib.D3.Physics.Shape.TYPE_BOX = 2;
GameLib.D3.Physics.Shape.TYPE_TRIMESH = 3;
/**
* Physics Convex Hull Shape Superset
@ -1708,11 +1712,11 @@ GameLib.D3.prototype.fixWindingOrder = function(faces, orientationEdge) {
*/
if (
(triangleEdge.triangle.v0 == triangleEdge.edge.x &&
triangleEdge.triangle.v1 == triangleEdge.edge.y) ||
triangleEdge.triangle.v1 == triangleEdge.edge.y) ||
(triangleEdge.triangle.v1 == triangleEdge.edge.x &&
triangleEdge.triangle.v2 == triangleEdge.edge.y) ||
triangleEdge.triangle.v2 == triangleEdge.edge.y) ||
(triangleEdge.triangle.v2 == triangleEdge.edge.x &&
triangleEdge.triangle.v0 == triangleEdge.edge.y)
triangleEdge.triangle.v0 == triangleEdge.edge.y)
) {
var backupV = triangleEdge.triangle.v1;
triangleEdge.triangle.v1 = triangleEdge.triangle.v2;
@ -2400,7 +2404,7 @@ GameLib.D3.prototype.loadScene = function(gameLibScene, onLoaded, computeNormals
for (var m = 0; m < gameLibScene.meshes.length; m++) {
var mesh = gameLibScene.meshes[m];
console.log("loading mesh " + mesh.name);
var geometry = new this.THREE.Geometry();
@ -2544,7 +2548,7 @@ GameLib.D3.prototype.loadScene = function(gameLibScene, onLoaded, computeNormals
var result = this.Q.all(threeMaterialLoaders).then(
function(gl3d, mesh, geometry) {
return function(materials) {
console.log("loaded all materials maps (" + materials.length + ")");
/**
@ -2647,19 +2651,173 @@ GameLib.D3.prototype.loadScene = function(gameLibScene, onLoaded, computeNormals
// Physics
// ---------------
GameLib.D3.Physics.World.prototype.AddRigidBody = function(
body
GameLib.D3.Physics.Shape.prototype.Update = function(
physicsWorld
) {
if(physicsWorld.engineType === GameLib.D3.Physics.Engine.TYPE_CANNON) {
if(this.shapeType === GameLib.D3.Physics.Shape.TYPE_TRIMESH) {
this.shapeObject.setScale(new CANNON.Vec3(this.scale.x, this.scale.y, this.scale.z));
this.shapeObject.scale.x = this.scale.x;
this.shapeObject.scale.y = this.scale.y;
this.shapeObject.scale.z = this.scale.z;
this.shapeObject.updateAABB();
this.shapeObject.updateNormals();
this.shapeObject.updateEdges();
this.shapeObject.updateBoundingSphereRadius();
this.shapeObject.updateTree();
}
}
};
GameLib.D3.Physics.World.prototype.AddShape = function(
shape, // d3.physics.shape
rigidBody
) {
shape.shape = shape;
if(this.engineType === GameLib.D3.Physics.Engine.TYPE_CANNON) {
rigidBody.bodyObject.addShape(shape.shapeObject);
}
};
GameLib.D3.Physics.World.prototype.CreateRigidVehicle = function(
chassisBody // Physics.RigidBody
) {
var rigidVehicle = new GameLib.D3.Physics.Vehicle();
if(this.engineType == GameLib.D3.Physics.Engine.TYPE_CANNON) {
var vehicle = new CANNON.RigidVehicle({
chassisBody: chassisBody.bodyObject
});
rigidVehicle.vehicleObject = vehicle;
return rigidVehicle;
}
};
GameLib.D3.Physics.World.prototype.AddWheel = function(
vehicle,
rigidBody,
position,
axis,
direction
) {
if(this.engineType == GameLib.D3.Physics.Engine.TYPE_CANNON) {
this.worldObject.addBody(body);
vehicle.vehicleObject.addWheel({
body: rigidBody.bodyObject,
position: new CANNON.Vec3(position.x, position.y, position.z),
axis: new CANNON.Vec3(axis.x, axis.y, axis.z),
direction: new CANNON.Vec3(direction.x, direction.y, direction.z)
});
}
};
GameLib.D3.Physics.Vehicle.prototype.GetWheelInfo = function(
) {
return this.vehicleObject.wheelBodies;
};
GameLib.D3.Physics.World.prototype.CreateRigidBody = function(
mass,
friction,
position,
quaternion,
velocity,
angularVelocity,
linearDamping,
angularDamping,
allowSleep,
sleepSpeedLimit,
sleepTimeLimit,
collisionFilterGroup,
collisionFilterMask,
fixedRotation,
shape
) {
var rigidBody = new GameLib.D3.Physics.RigidBody(0, "null");
position = position || new GameLib.D3.Vector3();
velocity = velocity || new GameLib.D3.Vector3();
angularVelocity = angularVelocity || new GameLib.D3.Vector3();
quaternion = quaternion || new GameLib.D3.Vector4(0, 0, 0, 1);
mass = typeof mass == "undefined" ? 0 : mass;
friction = typeof friction == "undefined" ? 5 : friction;
linearDamping = typeof linearDamping == "undefined" ? 0.01 : linearDamping;
angularDamping = typeof angularDamping == "undefined" ? 0.01 : angularDamping;
allowSleep = typeof allowSleep == "undefined" ? true : allowSleep;
sleepSpeedLimit = typeof sleepSpeedLimit == "undefined" ? 0.1 : sleepSpeedLimit;
sleepTimeLimit = typeof sleepTimeLimit == "undefined" ? 1.0 : sleepTimeLimit;
collisionFilterGroup = typeof collisionFilterGroup == "undefined" ? 1 : collisionFilterGroup;
collisionFilterMask = typeof collisionFilterMask == "undefined" ? 1 : collisionFilterMask;
fixedRotation = typeof fixedRotation == "undefined" ? false : fixedRotation;
shape = typeof shape == "undefined" ? null : shape;
// Create the bodyObject
if(this.engineType == GameLib.D3.Physics.Engine.TYPE_CANNON) {
rigidBody.bodyObject = new CANNON.Body(
{
mass: mass,
friction: friction,
position: new CANNON.Vec3(position.x, position.y, position.z),
velocity: new CANNON.Vec3(velocity.x, velocity.y, velocity.z),
quaternion: new CANNON.Quaternion(quaternion.x, quaternion.y, quaternion.z, quaternion.w),
angularVelocity: new CANNON.Vec3(angularVelocity.x, angularVelocity.y, angularVelocity.z),
linearDamping: linearDamping,
angularDamping: angularDamping,
allowSleep: allowSleep,
sleepSpeedLimit: sleepSpeedLimit,
sleepTimeLimit: sleepTimeLimit,
collisionFilterGroup: collisionFilterGroup,
collisionFilterMask: collisionFilterMask,
fixedRotation: fixedRotation,
shape: shape
}
);
return rigidBody;
}
};
GameLib.D3.Physics.World.prototype.CreateTriMeshShape = function(
vertices, // flat list of floats
indices // float list of floats
) {
if(this.engineType == GameLib.D3.Physics.Engine.TYPE_CANNON) {
return new GameLib.D3.Physics.Shape(new CANNON.Trimesh(vertices, indices), GameLib.D3.Physics.Shape.TYPE_TRIMESH);
}
};
GameLib.D3.Physics.World.prototype.CreateSphereShape = function (
radius
) {
if(this.engineType == GameLib.D3.Physics.Engine.TYPE_CANNON) {
return new GameLib.D3.Physics.Shape(new CANNON.Sphere(radius), GameLib.D3.Physics.Shape.TYPE_SPHERE);
}
};
GameLib.D3.Physics.World.prototype.CreateBoxShape = function(
halfExtensions // vec3
) {
if(this.engineType == GameLib.D3.Physics.Engine.TYPE_CANNON) {
return new GameLib.D3.Physics.Shape(new CANNON.Box(new CANNON.Vec3(halfExtensions.x, halfExtensions.y, halfExtensions.z)), GameLib.D3.Physics.Shape.TYPE_BOX);
}
};
GameLib.D3.Physics.World.prototype.AddRigidBody = function(
rigidBody // Physics.RigidBody
) {
if(this.engineType === GameLib.D3.Physics.Engine.TYPE_CANNON) {
this.worldObject.addBody(rigidBody.bodyObject);
}
};
GameLib.D3.Physics.World.prototype.AddVehicle = function(
vehicle
vehicle // note: this is the cannon vehicle...
) {
if(this.engineType == GameLib.D3.Physics.Engine.TYPE_CANNON) {
vehicle.addToWorld(this.worldObject);
vehicle.vehicleObject.addToWorld(this.worldObject);
}
};
@ -2672,7 +2830,7 @@ GameLib.D3.Physics.World.prototype.Step = function(
};
GameLib.D3.Physics.World.prototype.GetIndexedVertices = function(
triangleMeshShape
triangleMeshShape
) {
if(this.engine.engineType == GameLib.D3.Physics.Engine.TYPE_CANNON) {
@ -2951,8 +3109,10 @@ GameLib.D3.Game.prototype.ProcessPhysics = function (
var body = pair.physicsBody;
if(mesh) {
mesh.position.copy(body.position);
mesh.quaternion.copy(body.quaternion);
if(physicsWorld.engineType === GameLib.D3.Physics.Engine.TYPE_CANNON) {
mesh.position.copy(body.bodyObject.position);
mesh.quaternion.copy(body.bodyObject.quaternion);
}
}
}
}