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...