Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
first commit
  • Loading branch information
charlieschwabacher committed Feb 19, 2012
0 parents commit 9cb410f
Show file tree
Hide file tree
Showing 604 changed files with 171,971 additions and 0 deletions.
8 changes: 8 additions & 0 deletions README
@@ -0,0 +1,8 @@
A physics simulation of bipedal walking robots. Still *very much* a work in progress.
Uses:
JigLibJS2 port of the JigLib physics engine by bartdeboer: https://github.com/bartdeboer/JigLibJS2
THREE.js by mr.doob for visualization with webgl: https://github.com/mrdoob/three.js/

run the test server with:
npm install
coffee server.coffee
104 changes: 104 additions & 0 deletions index.html
@@ -0,0 +1,104 @@
<!DOCTYPE html>
<html>
<head>
<title>Walking</title>
<link rel="stylesheet" type="text/css" href="/style.css" />
<script src="/jquery.min.js" type="text/javascript"></script>

<!-- Three.js -->
<script src="/three.min.js" type="text/javascript"></script>
<script src="/requestAnimationFrame.js" type="text/javascript"></script>

<!-- JigLibJS2 -->
<script src="/JigLibJS2/geom/glMatrix.js"></script>
<script src="/JigLibJS2/jiglib.js"></script>
<script src="/JigLibJS2/geom/Vector3d.js"></script>
<script src="/JigLibJS2/geom/Matrix3d.js"></script>
<script type="text/javascript" src="/JigLibJS2/math/JMatrix3D.js"></script>
<script type="text/javascript" src="/JigLibJS2/math/JMath3D.js"></script>
<script type="text/javascript" src="/JigLibJS2/math/JNumber3D.js"></script>
<script type="text/javascript" src="/JigLibJS2/cof/JConfig.js"></script>
<script type="text/javascript" src="/JigLibJS2/data/CollOutData.js"></script>
<script type="text/javascript" src="/JigLibJS2/data/ContactData.js"></script>
<script type="text/javascript" src="/JigLibJS2/data/PlaneData.js"></script>
<script type="text/javascript" src="/JigLibJS2/data/EdgeData.js"></script>
<script type="text/javascript" src="/JigLibJS2/data/TerrainData.js"></script>
<script type="text/javascript" src="/JigLibJS2/data/OctreeCell.js"></script>
<script type="text/javascript" src="/JigLibJS2/data/CollOutBodyData.js"></script>
<script type="text/javascript" src="/JigLibJS2/data/TriangleVertexIndices.js"></script>
<script type="text/javascript" src="/JigLibJS2/data/SpanData.js"></script>
<script type="text/javascript" src="/JigLibJS2/physics/MaterialProperties.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollPointInfo.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollisionInfo.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollDetectInfo.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollDetectFunctor.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollDetectBoxTerrain.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollDetectSphereMesh.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollDetectCapsuleBox.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollDetectSphereCapsule.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollDetectCapsuleTerrain.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollDetectSphereBox.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollDetectSphereTerrain.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollDetectBoxBox.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollDetectBoxMesh.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollDetectBoxPlane.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollDetectCapsuleCapsule.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollDetectSphereSphere.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollDetectSpherePlane.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollDetectCapsulePlane.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollisionSystemAbstract.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollisionSystemGridEntry.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollisionSystemGrid.js"></script>
<script type="text/javascript" src="/JigLibJS2/collision/CollisionSystemBrute.js"></script>
<script type="text/javascript" src="/JigLibJS2/geometry/JIndexedTriangle.js"></script>
<script type="text/javascript" src="/JigLibJS2/geometry/JOctree.js"></script>
<script type="text/javascript" src="/JigLibJS2/geometry/JRay.js"></script>
<script type="text/javascript" src="/JigLibJS2/geometry/JAABox.js"></script>
<script type="text/javascript" src="/JigLibJS2/geometry/JTriangle.js"></script>
<script type="text/javascript" src="/JigLibJS2/geometry/JSegment.js"></script>
<script type="text/javascript" src="/JigLibJS2/events/JCollisionEvent.js"></script>
<script type="text/javascript" src="/JigLibJS2/physics/CachedImpulse.js"></script>
<script type="text/javascript" src="/JigLibJS2/physics/BodyPair.js"></script>
<script type="text/javascript" src="/JigLibJS2/physics/PhysicsSystem.js"></script>
<script type="text/javascript" src="/JigLibJS2/physics/PhysicsController.js"></script>
<script type="text/javascript" src="/JigLibJS2/physics/constraint/JConstraint.js"></script>
<script type="text/javascript" src="/JigLibJS2/physics/constraint/JConstraintMaxDistance.js"></script>
<script type="text/javascript" src="/JigLibJS2/physics/constraint/JConstraintWorldPoint.js"></script>
<script type="text/javascript" src="/JigLibJS2/physics/constraint/JConstraintPoint.js"></script>
<script type="text/javascript" src="/JigLibJS2/physics/HingeJoint.js"></script>
<script type="text/javascript" src="/JigLibJS2/physics/BodyPair.js"></script>
<script type="text/javascript" src="/JigLibJS2/physics/PhysicsState.js"></script>
<script type="text/javascript" src="/JigLibJS2/physics/RigidBody.js"></script>
<script type="text/javascript" src="/JigLibJS2/geometry/JSphere.js"></script>
<script type="text/javascript" src="/JigLibJS2/geometry/JTriangleMesh.js"></script>
<script type="text/javascript" src="/JigLibJS2/geometry/JPlane.js"></script>
<script type="text/javascript" src="/JigLibJS2/geometry/JTerrain.js"></script>
<script type="text/javascript" src="/JigLibJS2/geometry/JBox.js"></script>
<script type="text/javascript" src="/JigLibJS2/geometry/JCapsule.js"></script>
<script type="text/javascript" src="/JigLibJS2/debug/Stats.js"></script>

<!-- Simulation -->
<script src="/legs.js" type="text/javascript"></script>
<script src="/simulation.js" type="text/javascript"></script>

</head>
<body>
<div id="menu">
<a id="pushLeft">push left</a>
<a id="pushRight">push right</a>
<a id="pushForward">push forward</a>
<a id="pushBack">push back</a>
<a id="pushUp">push up</a>
<a id="reset">reset</a>
<select id="pushBody">
<option value="hip" selected>hip</option>
<option value="leftFoot">left foot</option>
<option value="leftCrus">left crus</option>
<option value="leftThigh">left thigh</option>
<option value="rightFoot">right foot</option>
<option value="rightCrus">right crus</option>
<option value="rightThigh">right thigh</option>
</select>
</div>
</body>
</html>
110 changes: 110 additions & 0 deletions legs.coffee
@@ -0,0 +1,110 @@
window.Robot = {}

#A rigid box
class Box
constructor: (@system, @scene, length, width, height, density = 1, color = 0x666666) ->
geometry = new THREE.CubeGeometry length, width, height
material = new THREE.MeshLambertMaterial color: color
@mesh = new THREE.Mesh geometry, material
@mesh.matrixAutoUpdate = false
@mesh.overdraw = true
scene.add @mesh

body = new jiglib.JBox null, length, height, width
body.set_mass body.getVolume() * density
system.addBody body
@mesh.rigidBody = body

setPosition: (x, y, z) ->
@mesh.position = new THREE.Vector3 x, y, z
@mesh.updateMatrix()
@mesh.rigidBody.moveTo(new Vector3D x, y, z)
this

setRotation: (x, y, z) ->
@mesh.rotation = new THREE.Vector3 x, y, z
@mesh.updateMatrix()

matrix3D = new Matrix3D()
matrix3D.appendRotation x, Vector3D.X_AXIS
matrix3D.appendRotation y, Vector3D.Y_AXIS
matrix3D.appendRotation z, Vector3D.Z_AXIS
@mesh.rigidBody.setOrientation matrix3D
this

#A single axis joint
class Joint
sidewaysSlack: 0.001
damping: 0.0
###
box0 and box1 are the two boxes being joined
hingeAxis is the axis of rotation of the hinge
hingePosRel0 is the offset of the hinge from the center of box0
hingeFwdAngle and hingeBckAngle are the angles of rotation of the joint
###
constructor: (box0, box1, hingeAxis, hingePosRel0, hingeHalfWidth, hingeFwdAngle, hingeBckAngle) ->
@joint = new jiglib.HingeJoint(box0.mesh.rigidBody, box1.mesh.rigidBody, hingeAxis, hingePosRel0, hingeHalfWidth, hingeFwdAngle, hingeBckAngle, @sidewaysSlack, @damping)

angle: ->
body0State = @joint._body0.get_currentState()
body1State = @joint._body1.get_currentState()
hingePosition = body0State.position.add(body0State.orientation.transformVector(@joint._hingePosRel0))

"""
<p>body0 position: (#{body0State.position.x.toFixed(3)}, #{body0State.position.y.toFixed(3)}, #{body0State.position.z.toFixed(3)})</p>
<p>body1 position: (#{body1State.position.x.toFixed(3)}, #{body1State.position.y.toFixed(3)}, #{body1State.position.z.toFixed(3)})</p>
<p>hingePosition: (#{hingePosition.x.toFixed(3)}, #{hingePosition.y.toFixed(3)}, #{hingePosition.z.toFixed(3)})</p>
"""

class Robot.Legs
constructor: (@system, @scene) ->
@components = {}
@joints = {}

@initialize()

remove: ->
component.remove() for compenent in @components
joint.remove() for joint in @joints

addComponent: (name, component) ->
@components[name] = component
component

addJoint: (name, joint) ->
@joints[name] = joint
joint

initialize: ->
#left leg
leftFoot = @addComponent("leftFoot", new Box @system, @scene, 4, 10, 2, 1, 0x001166).setPosition -10, 2, 1
leftCrus = @addComponent("leftCrus", new Box @system, @scene, 2, 4, 20, 1, 0x999999).setPosition -7, 0, 11
leftThigh = @addComponent("leftThigh", new Box @system, @scene, 2, 4, 20, 1, 0x0066CC).setPosition -9, 0, 29
leftHipAdapter = @addComponent("leftHipAdapter", new Box @system, @scene, 4, 4, 4, 1, 0x001166).setPosition -6, 0, 37
#right leg
rightFoot = @addComponent("rightFoot", new Box @system, @scene, 4, 10, 2, 1, 0x001166).setPosition 10, 2, 1
rightCrus = @addComponent("rightCrus", new Box @system, @scene, 2, 4, 20, 1, 0x999999).setPosition 7, 0, 11
rightThigh = @addComponent("rightThigh", new Box @system, @scene, 2, 4, 20, 1, 0x0066CC).setPosition 9, 0, 29
rightHipAdapter = @addComponent("rightHipAdapter", new Box @system, @scene, 4, 4, 4, 1, 0x001166).setPosition 6, 0, 37
#body
hip = @addComponent("hip", new Box @system, @scene, 8, 6, 8, 4, 0x999999).setPosition 0, 0, 43

#joints
@addJoint "leftAnkle", new Joint(leftFoot, leftCrus, Vector3D.X_AXIS, new Vector3D(2, -2, 1), 2, 90, 30)
@addJoint "rightAnkle", new Joint(rightFoot, rightCrus, Vector3D.X_AXIS, new Vector3D(-2, -2, 1), 2, 90, 30)
@addJoint "leftKnee", new Joint(leftCrus, leftThigh, Vector3D.X_AXIS, new Vector3D(-1, 0, 9), 2, 120, 0)
@addJoint "rightKnee", new Joint(rightCrus, rightThigh, Vector3D.X_AXIS, new Vector3D(1, 0, 9), 2, 90, 0)
@addJoint "leftHipFlexor", new Joint(leftThigh, leftHipAdapter, Vector3D.X_AXIS, new Vector3D(1, 0, 9), 2, 0, 90)
@addJoint "rightHipFlexor", new Joint(rightThigh, rightHipAdapter, Vector3D.X_AXIS, new Vector3D(-1, 0, 9), 2, 0, 90)
@addJoint "leftHipAbductor1", new Joint(leftHipAdapter, hip, Vector3D.Y_AXIS, new Vector3D(2, 2, 2), 1, 180, 0)
@addJoint "leftHipAbductor2", new Joint(leftHipAdapter, hip, Vector3D.Y_AXIS, new Vector3D(2, -2, 2), 1, 180, 0)
@addJoint "rightHipAbductor1", new Joint(rightHipAdapter, hip, Vector3D.Y_AXIS, new Vector3D(-2, 2, 2), 2, 180, 180)
@addJoint "rightHipAbductor2", new Joint(rightHipAdapter, hip, Vector3D.Y_AXIS, new Vector3D(-2, -2, 2), 2, 180, 180)

getState: ->
@joints.leftKnee.angle()

applyTorques: (torques) ->

push: (body, x, y, z) ->
@components[body].mesh.rigidBody.addBodyForce new Vector3D(x, y, z), new Vector3D(0,0,0)
11 changes: 11 additions & 0 deletions package.json
@@ -0,0 +1,11 @@
{
'name':'walking',
'description':'A physics simulation of bipedal walking robots using THREE.js for visualization. Still *very much* a work in progress.',
'author':'Charlie Schwabacher <charlieschwabacher@gmail.com>',
'version':'0.0.1',
'dependencies': {
'express':'>= 2.5.2',
'coffee-script':'>= 1.1.3'
},
'engine':'node 0.6.5'
}
Binary file added public/.DS_Store
Binary file not shown.
10 changes: 10 additions & 0 deletions public/JigLibJS2/README
@@ -0,0 +1,10 @@
Following the principles of JigLibJS this is a new Javascript port of JiglibFlash (which is a port of c++ JigLib). The code is generated automatically from the AS3 code so all functionality should work exactly like the AS3 version.

JigLibJS2: http://www.brokstuk.com/jiglibjs2/

Other links:

JiglibFlash: http://www.jiglibflash.com/
Original c++ JigLib: http://www.rowlhouse.co.uk/jiglib/
Original JigLibJS port: https://github.com/supereggbert/JigLibJS
glmatrix: http://code.google.com/p/glmatrix/
28 changes: 28 additions & 0 deletions public/JigLibJS2/cof/JConfig.js
@@ -0,0 +1,28 @@

(function(jiglib) {


var JConfig = function()
{
}

JConfig.solverType = "ACCUMULATED"; // String
JConfig.rotationType = "DEGREES"; // String
JConfig.doShockStep = false; // Boolean
JConfig.allowedPenetration = 0.01; // Number
JConfig.collToll = 0.05; // Number
JConfig.velThreshold = 0.5; // Number
JConfig.angVelThreshold = 0.5; // Number
JConfig.posThreshold = 0.2; // Number
JConfig.orientThreshold = 0.2; // Number
JConfig.deactivationTime = 0.5; // Number
JConfig.numPenetrationRelaxationTimesteps = 10; // Number
JConfig.numCollisionIterations = 1; // Number
JConfig.numContactIterations = 2; // Number
JConfig.numConstraintIterations = 2; // Number


jiglib.JConfig = JConfig;

})(jiglib);

0 comments on commit 9cb410f

Please sign in to comment.