_setMVMatrix() {
        if(this._updateMVMatrix) {
            // compose our world transformation matrix from custom origin
            this._matrices.world.matrix = this._matrices.world.matrix.composeFromOrigin(this._translation, this.quaternion, this.scale, this._boundingRect.world.transformOrigin);

            // we need to scale our planes, from a square to a right sized rectangle
            // we're doing this after our transformation matrix because this scale transformation always have the same origin
            this._matrices.world.matrix.scale({
                x: this._boundingRect.world.width,
                y: this._boundingRect.world.height,
                z: 1
            });


            // our model view matrix is our world matrix multiplied with our camera view matrix
            // in our case we're just subtracting the camera Z position to our world matrix
            this._matrices.modelView.matrix.copy(this._matrices.world.matrix);
            this._matrices.modelView.matrix.elements[14] -= this.camera.position.z;

            // our modelViewProjection matrix, useful for bounding box calculations and frustum culling
            // this is the result of our projection matrix multiplied by our modelView matrix
            this._matrices.modelViewProjection.matrix = this._matrices.projection.matrix.multiply(this._matrices.modelView.matrix);

            // check if we should draw the plane but only if everything has been initialized
            if(!this.alwaysDraw) {
                this._shouldDrawCheck();
            }

            // update our matrix uniform
            this.renderer.useProgram(this._program);
            this.gl.uniformMatrix4fv(this._matrices.modelView.location, false, this._matrices.modelView.matrix.elements);
        }

        // reset our flag
        this._updateMVMatrix = false;
    }
This will set our model view matrix
     used internally at each draw call if needed
     It will calculate our matrix based on its plane translation, rotation and scale
*