BabylonJS - setAbsolutePosition

http://www.html5gamedevs.com/topic/3083-spaces-world-parent-pivot-local

by gwenaelhagenmuller

HTML

<script src="https://rawgithub.com/BabylonJS/Babylon.js/v1.8.5/babylon.1.8.5.js"></script>
<button id="setAbsolutePosition0">model.setAbsolutePosition(0,0,0)</button>
<button id="setAbsolutePosition1">model.setAbsolutePosition(parent.absolutePosition)</button>
<button id="setAbsolutePosition2">model.setAbsolutePosition(grandParent.absolutePosition)</button>
<div id="rootDiv">
  <canvas id="renderCanvas"></canvas>
  <canvas id="canvas_2D"></canvas>
</div>

CSS

html, body, div, canvas {
    width: 100%;
    height: 100%;
    padding: 0;
    margin: 0;
    overflow: hidden;
}

button { height: 20px }

#canvas_2D {
    position: absolute;   
    top: 20px;
    pointer-events: none;
}

JavaScript

document.getElementById("setAbsolutePosition0").onclick = function() {
    model.setAbsolutePosition(BABYLON.Vector3.Zero());
};

document.getElementById("setAbsolutePosition1").onclick = function() {
    var parentAbsolutePosition = parent.getAbsolutePosition();
    model.setAbsolutePosition(parentAbsolutePosition.x, parentAbsolutePosition.y, parentAbsolutePosition.z);
};

document.getElementById("setAbsolutePosition2").onclick = function() {
    model.setAbsolutePosition(grandParent.getAbsolutePosition());
};

BABYLON.Mesh.prototype.setAbsolutePosition = function (absolutePosition) {
    if (!absolutePosition) {
        return;
    }
    
    var absolutePositionX;
    var absolutePositionY;
    var absolutePositionZ;
    
    if (absolutePosition.x === undefined) {
        if (arguments.length < 3) {
            return;
        }
        absolutePositionX = arguments[0];
        absolutePositionY = arguments[1];
        absolutePositionZ = arguments[2];
    }
    else {
        absolutePositionX = absolutePosition.x;
        absolutePositionY = absolutePosition.y;
        absolutePositionZ = absolutePosition.z;
    }
    
    // worldMatrix = pivotMatrix * scalingMatrix * rotationMatrix * translateMatrix * parentWorldMatrix
    // => translateMatrix = invertRotationMatrix * invertScalingMatrix * invertPivotMatrix * worldMatrix * invertParentWorldMatrix
    
    // get this matrice before the other ones since
    // that will update them if they have to be updated
    
    var worldMatrix = this.getWorldMatrix().clone();
    
    worldMatrix.m[12] = absolutePositionX;
    worldMatrix.m[13] = absolutePositionY;
    worldMatrix.m[14] = absolutePositionZ;
    
    var invertRotationMatrix = this._localRotation.clone();
    invertRotationMatrix.invert();
    
    var invertScalingMatrix = this._localScaling.clone();
    invertScalingMatrix.invert();
    
    var invertPivotMatrix = this._pivotMatrix.clone();
    invertPivotMatrix.invert();
    
    var...