updateMatrices() {
    let threeObj = this.threeObject
    let parent3DFacade = this._parentObject3DFacade
    let needsWorldMatrixUpdate
    if (this._matrixChanged) {
      threeObj.matrix.compose(threeObj.position, threeObj.quaternion, threeObj.scale)
      this._matrixChanged = false
      needsWorldMatrixUpdate = true
    } else {
      needsWorldMatrixUpdate = parent3DFacade && parent3DFacade._worldMatrixVersion > this._worldMatrixVersion
    }
    if (needsWorldMatrixUpdate) {
      if (parent3DFacade) {
        threeObj.matrixWorld.multiplyMatrices(parent3DFacade.threeObject.matrixWorld, threeObj.matrix)
      } else {
        threeObj.matrixWorld.copy(threeObj.matrix)
      }

      // If the threeObject has children that were manually added (not managed by facades), we'll need to update them too
      // TODO can we determine this state without a full loop that will likely return nothing?
      let threeKids = threeObj.children
      for (let i = 0, len = threeKids.length; i < len; i++) {
        if (!threeKids[i].$facade) {
          threeKids[i].updateMatrixWorld(true)
        }
      }

      this.markWorldMatrixDirty()
    }
  }
Update the underlying threeObject's `matrix` and `matrixWorld` to the current state if necessary.
This bypasses the `updateMatrix` and `updateMatrixWorld` methods of the threejs objects with a more
efficient approach that doesn't require traversing the entire tree prior to every render. This is possible
since we control the update lifecycle; as long as this is called from the `afterUpdate` lifecycle
method or later, it can be safely assumed that the world matrices of all ancestors have already been
similarly updated so the result should always be accurate.