function parse (value, defaultVec) {
  var coordinate;
  var vec;

  if (value && value instanceof Object) {
    if (defaultVec) {
      value.x = value.x === undefined ? defaultVec.x : value.x;
      value.y = value.y === undefined ? defaultVec.y : value.y;
      value.z = value.z === undefined ? defaultVec.z : value.z;
      value.w = value.w === undefined ? defaultVec.w : value.w;
    }
    return vecParseFloat(value);
  }

  if (value === null || value === undefined) {
    return typeof defaultVec === 'object' ? extend({}, defaultVec) : defaultVec;
  }

  coordinate = value.trim().replace(/\s+/g, ' ').split(' ');
  vec = {};
  vec.x = coordinate[0] || defaultVec && defaultVec.x;
  vec.y = coordinate[1] || defaultVec && defaultVec.y;
  vec.z = coordinate[2] || defaultVec && defaultVec.z;
  vec.w = coordinate[3] || defaultVec && defaultVec.w;
  return vecParseFloat(vec);
}
Parses coordinates from an "x y z" string.
Example: "3 10 -5" to {x: 3, y: 10, z: -5}.

@param {string} val - An "x y z" string.
@param {string} defaults - fallback value.
@returns {object} An object with keys [x, y, z].