diff --git a/src/Physics/Plugins/babylon.cannonJSPlugin.ts b/src/Physics/Plugins/babylon.cannonJSPlugin.ts index 436c58d812f..505a0fe9fe9 100644 --- a/src/Physics/Plugins/babylon.cannonJSPlugin.ts +++ b/src/Physics/Plugins/babylon.cannonJSPlugin.ts @@ -293,7 +293,20 @@ oldQuaternion && object.rotationQuaternion && object.rotationQuaternion.copyFrom(oldQuaternion); break; case PhysicsImpostor.HeightmapImpostor: + let oldPosition2 = object.position.clone(); + let oldRotation2 = object.rotation && object.rotation.clone(); + let oldQuaternion2 = object.rotationQuaternion && object.rotationQuaternion.clone(); + object.position.copyFromFloats(0, 0, 0); + object.rotation && object.rotation.copyFromFloats(0, 0, 0); + object.rotationQuaternion && object.rotationQuaternion.copyFrom(impostor.getParentsRotation()); + object.rotationQuaternion && object.parent && object.rotationQuaternion.conjugateInPlace(); + object.rotationQuaternion && object.rotationQuaternion.multiplyInPlace(this._minus90X); + returnValue = this._createHeightmap(object); + object.position.copyFrom(oldPosition2); + oldRotation2 && object.rotation && object.rotation.copyFrom(oldRotation2); + oldQuaternion2 && object.rotationQuaternion && object.rotationQuaternion.copyFrom(oldQuaternion2); + object.computeWorldMatrix(true); break; case PhysicsImpostor.ParticleImpostor: returnValue = new this.BJSCANNON.Particle(); @@ -305,21 +318,29 @@ private _createHeightmap(object: IPhysicsEnabledObject, pointDepth?: number) { var pos = (object.getVerticesData(VertexBuffer.PositionKind)); + let transform = object.computeWorldMatrix(true); + // convert rawVerts to object space + var temp = new Array(); + var index: number; + for (index = 0; index < pos.length; index += 3) { + Vector3.TransformCoordinates(Vector3.FromArray(pos, index), transform).toArray(temp, index); + } + pos = temp; var matrix = new Array>(); //For now pointDepth will not be used and will be automatically calculated. //Future reference - try and find the best place to add a reference to the pointDepth variable. var arraySize = pointDepth || ~~(Math.sqrt(pos.length / 3) - 1); let boundingInfo = (object.getBoundingInfo()); - var dim = Math.min(boundingInfo.boundingBox.extendSizeWorld.x, boundingInfo.boundingBox.extendSizeWorld.z); - var minY = boundingInfo.boundingBox.extendSizeWorld.y; + var dim = Math.min(boundingInfo.boundingBox.extendSizeWorld.x, boundingInfo.boundingBox.extendSizeWorld.y); + var minY = boundingInfo.boundingBox.extendSizeWorld.z; var elementSize = dim * 2 / arraySize; for (var i = 0; i < pos.length; i = i + 3) { var x = Math.round((pos[i + 0]) / elementSize + arraySize / 2); - var z = Math.round(((pos[i + 2]) / elementSize - arraySize / 2) * -1); - var y = pos[i + 1] + minY; + var z = Math.round(((pos[i + 1]) / elementSize - arraySize / 2) * -1); + var y = -pos[i + 2] + minY; if (!matrix[x]) { matrix[x] = []; }