odejs
Version:
3D physics engine
312 lines (263 loc) • 9.99 kB
HTML
<html>
<head>
<script src="https://preview.babylonjs.com/babylon.js"></script>
<script src="https://preview.babylonjs.com/materialsLibrary/babylonjs.materials.min.js"></script>
<!--script src="https://preview.babylonjs.com/postProcessesLibrary/babylonjs.postProcess.min.js"></script-->
<script src="https://preview.babylonjs.com/loaders/babylonjs.loaders.min.js"></script>
<script src="../lib/libode.js"></script>
<title>ODE.js - Jeep</title>
<style>
html, body {
overflow: hidden;
width : 100%;
height : 100%;
margin : 0;
padding : 0;
}
#renderCanvas {
width : 100%;
height : 100%;
touch-action: none;
}
#github {
position: absolute;
top : 0px;
right: 0px;
z-index: 100;
}
.help {
font-family: Monospace;
color: #fff;
font-size: 2em;
position: absolute;
width: 100%;
bottom : 30px;
left: 0px;
text-align: center;
z-index: 100;
}
</style>
</head>
<body>
<canvas id="renderCanvas"></canvas>
<a id="github" href="https://github.com/Ricku34/ODE.js"><img src="assets/forkme.png"/></A>
<span class="help">Use spacebar to apply upward force & use arrows keys for pilote the jeep</span>
<script>
var KeyboardManager = (function ()
{
var input =
{
Keys:
{
Space: "32",
Up : "38",
Down : "40",
Left : "37",
Right: "39"
}
};
document.addEventListener('keydown',
function( evt )
{
//console.log(evt.keyCode);
input.Keys[evt.keyCode]=true;
}, false);
document.addEventListener('keyup',
function( evt )
{
input.Keys[evt.keyCode]=false;
}, false);
return input;
})()
window.addEventListener('DOMContentLoaded', function(){
ODE.readyPromise.then(function() {
var SIZE = 50;
var world = new ODE.World();
var space = new ODE.Space.Hash();
var contactgroup = new ODE.Joint.Group(10000);
var mass = new ODE.Mass();
world.setGravity (0,-5,0);
space.createPlane(0,1,0,0);
space.createPlane(1,0,0,-SIZE/2);
space.createPlane(-1,0,0,-SIZE/2);
space.createPlane(0,0,1,-SIZE/2);
space.createPlane(0,0,-1,-SIZE/2);
var Jeep = null;
// get the canvas DOM element
var canvas = document.getElementById('renderCanvas');
// load the 3D engine
var engine = new BABYLON.Engine(canvas, true);
// createScene function that creates and return the scene
var createScene = function(){
// create a basic BJS Scene object
var scene = new BABYLON.Scene(engine);
var loader = new BABYLON.AssetsManager(scene);
// create a FreeCamera, and set its position to (x:0, y:5, z:-10)
var camera = new BABYLON.FollowCamera("FollowCam", new BABYLON.Vector3(0, 3, -5), scene);
camera.radius = 3; // how far from the object to follow
camera.heightOffset = 2; // how high above the object to place the camera
camera.rotationOffset = 0; // the viewing angle
camera.cameraAcceleration = 0.05 // how fast to move
camera.maxCameraSpeed = 20 // speed limit
// target the camera to scene origin
// camera.setTarget(BABYLON.Vector3.Zero());
// attach the camera to the canvas
//camera.attachControl(canvas, false);
// create a basic light, aiming 0,1,0 - meaning, to the sky
var light = new BABYLON.HemisphericLight('light1', new BABYLON.Vector3(0,1,0), scene);
// create a built-in "ground" shape; its constructor takes the same 5 params as the sphere's one
var ground = BABYLON.Mesh.CreateGround('ground1',SIZE, SIZE, 8, scene);
ground.material = new BABYLON.StandardMaterial("groundMat", scene);
// ground.material.diffuseColor = new BABYLON.Color3(0,1,0);
ground.material.diffuseTexture = new BABYLON.Texture('assets/pinmarb2.png', scene);
ground.material.diffuseTexture.uScale = SIZE;
ground.material.diffuseTexture.vScale = SIZE;
var jeepTask = loader.addMeshTask("jeep", "", "assets/", "jeepnw.obj");
var wheelTask = loader.addMeshTask("wheel", "", "assets/", "wheel.obj");
loader.onFinish = function() {
mass.setBox(1, 0.909, 0.435, 1.694);
mass.adjust(50);
var mainBody = world.createBody();
mainBody.setMass(mass);
mainBody.setPosition(0,0.322062,0);
var mainGeom = space.createBox(0.909, 0.435, 1.694);
mainGeom.setBody(mainBody);
var mainMesh =new BABYLON.Mesh("MainJeep", scene);
jeepTask.loadedMeshes.forEach(function(mesh)
{
mesh.position.y = 0.428237 - 0.322062;
mesh.parent = mainMesh;
});
camera.lockedTarget = mainMesh;
Jeep = {
Cabin : { Body : mainBody, /*Geom : mainGeom,*/ Mesh : mainMesh },
Wheels : [
{ Mesh : wheelTask.loadedMeshes[0] },
{ Mesh : wheelTask.loadedMeshes[0].createInstance("rrw") },
{ Mesh : wheelTask.loadedMeshes[0].createInstance("flw") },
{ Mesh : wheelTask.loadedMeshes[0].createInstance("rlw") }
]
};
mass.setSphere(1, 0.174);
mass.adjust(10);
Jeep.Wheels.forEach(function(w)
{
w.Body = world.createBody();
w.Body.setMass(mass);
w.Geom = space.createSphere(0.174);
w.Geom.setBody(w.Body);
});
Jeep.Wheels[0].Body.setPosition(-0.443070,0.175475,0.579531);
Jeep.Wheels[1].Body.setPosition(-0.443070,0.175475,-0.478612);
Jeep.Wheels[2].Body.setPosition(0.443070,0.175475,0.579531);
Jeep.Wheels[3].Body.setPosition(0.443070,0.175475,-0.478612);
// wheel joints
for(var i = 0; i < 4; ++i)
{
Jeep.Wheels[i].Joint = world.createHinge2Joint();
Jeep.Wheels[i].Joint.attach(Jeep.Cabin.Body,Jeep.Wheels[i].Body);
var wPos = Jeep.Wheels[i].Body.getPosition();
Jeep.Wheels[i].Joint.setAnchor( wPos[0], wPos[1], wPos[2]);
Jeep.Wheels[i].Joint.setAxis1( 0, 1, 0);
Jeep.Wheels[i].Joint.setAxis2( (i >=2) ? -1 : 1, 0, 0);
Jeep.Wheels[i].Joint.setParam( ODE.Joint.Parameters.LoStop, - Math.PI / 6);
Jeep.Wheels[i].Joint.setParam( ODE.Joint.Parameters.HiStop, Math.PI / 6);
Jeep.Wheels[i].Joint.setParam( ODE.Joint.Parameters.FMax, 50);
Jeep.Wheels[i].Joint.setParam( ODE.Joint.Parameters.Vel2, 0);
Jeep.Wheels[i].Joint.setParam( ODE.Joint.Parameters.FMax2, 80);
Jeep.Wheels[i].Joint.setParam( ODE.Joint.Parameters.SuspensionERP, 0.25);
Jeep.Wheels[i].Joint.setParam( ODE.Joint.Parameters.SuspensionCFM, 0.004);
}
Jeep.Update = function(velocity, steering)
{
var wheelVelocity = 12 * Math.PI * velocity;// * 1.20;
for(var i = 0; i < 4; ++i)
{
var desiredPosition = steering * (((i%2)==0) ? -1 : 1);
var actualPosition = this.Wheels[i].Joint.getAngle1();
var steeringVelocity = (desiredPosition - actualPosition) * 5 ;
this.Wheels[i].Joint.setParam( ODE.Joint.Parameters.Vel, steeringVelocity);
this.Wheels[i].Joint.setParam( ODE.Joint.Parameters.Vel2, (i >=2)? -wheelVelocity : wheelVelocity);
}
}
//mainBody.setPosition(0,2,0);
engine.runRenderLoop(function ()
{
space.collide(function(g1,g2)
{
var b1 = g1.getBody();
var b2 = g2.getBody();
if (b1 && b2 && ODE.Body.areConnected (b1,b2))
return;
ODE.Geom.collide(g1,g2,8,function(contact)
{
contact.surface.mode = ODE.Contact.Mode.Bounce;
contact.surface.mu = 250;
contact.surface.bounce = 0.3;
contact.surface.bounce_vel = 0.05;
var c = world.createContactJoint(contactgroup,contact);
c.attach(b1,b2);
});
})
var v=0,s=0;
if(KeyboardManager.Keys[KeyboardManager.Keys.Up])
{
v=1;
}
else if(KeyboardManager.Keys[KeyboardManager.Keys.Down])
{
v=-1;
}
if(KeyboardManager.Keys[KeyboardManager.Keys.Right])
{
s=-1;
}
else if(KeyboardManager.Keys[KeyboardManager.Keys.Left])
{
s=1;
}
//var rot = Jeep.Cabin.Body.getRotation().getArray()
if(/*Math.abs(rot[4])< 0.01 && Math.abs(rot[6])< 0.01 && rot[5] < -0.5 && */KeyboardManager.Keys[KeyboardManager.Keys.Space])
{
Jeep.Cabin.Body.addForce(0, 800, 0);
Jeep.Cabin.Body.addRelTorque(0, 0, 70);
}
Jeep.Update(v,s);
world.step(0.05);
contactgroup.empty();
var p = Jeep.Cabin.Body.getPosition();
Jeep.Cabin.Mesh.position.x = p[0];
Jeep.Cabin.Mesh.position.y = p[1];
Jeep.Cabin.Mesh.position.z = p[2];
var q = Jeep.Cabin.Body.getQuaternion().getArray();
Jeep.Cabin.Mesh.rotationQuaternion = new BABYLON.Quaternion(q[1],q[2],q[3],q[0]);
Jeep.Wheels.forEach(function(w)
{
var p = w.Body.getPosition();
w.Mesh.position.x = p[0];
w.Mesh.position.y = p[1];
w.Mesh.position.z = p[2];
var q = w.Body.getQuaternion().getArray();
w.Mesh.rotationQuaternion = new BABYLON.Quaternion(q[1],q[2],q[3],q[0]);
});
//scene.createDefaultCameraOrLight(true, true, true);
//scene.createDefaultEnvironment();
scene.render();
});
};
loader.load();
// return the created scene
return scene;
}
// call the createScene function
var scene = createScene();
// the canvas/window resize event handler
window.addEventListener('resize', function(){
engine.resize();
});
});
});
</script>
</body>
</html>