         .sub(handMesh.positionRaw)
         .add(handMesh.position)
 
+    # Mesh scale set by comparing leap first bone length to mesh first bone length
+    handMesh.scaleFromHand = (leapHand) ->
+
+      handMesh.leapScale = (new THREE.Vector3).subVectors(
+          (new THREE.Vector3).fromArray(leapHand.fingers[2].pipPosition)
+          (new THREE.Vector3).fromArray(leapHand.fingers[2].mcpPosition)
+        ).length() / handMesh.fingers[2].children[0].position.length() / scope.scale
+
     handMesh
 
   getMesh = (leapHand)->


  {
    frame: (frame)->
      scope.stats.begin() if scope.stats
      for leapHand in frame.hands
        # this works around a subtle bug where non-extended fingers would appear after extended ones
        leapHand.fingers = _sortBy(leapHand.fingers, (finger)-> finger.id)
        handMesh = leapHand.data('riggedHand.mesh')
        palm = handMesh.children[0]

        palm.positionLeap.fromArray(leapHand.palmPosition)
        # wrist -> mcp -> pip -> dip -> tip

  @use('versionCheck', {requiredProtocolVersion: 6})

  scope.offset ||= new THREE.Vector3(0,-10,0)
  scope.scale ||= 100
  # this allow the hand to move disproportionately to its size.
  scope.positionScale ||= 1
  scope.initScene = initScene
