Imath::M44f computeMeshTransform(const Imath::Box3f& bounds, const Imath::V3i& voxelResolution) { using namespace Imath; M44f meshTransform; // set mesh transform so that the mesh fits within the unit cube. This will // be changed later when we let the user manipulate the mesh transform and // the mesh/volume intersection. V3f voxelMargin = V3f(1.0f) / voxelResolution; // 1 voxel int majorAxis = bounds.majorAxis(); float s = (1.0f - 2.0 * voxelMargin[majorAxis] ) / bounds.size()[majorAxis]; V3f t = -bounds.min + voxelMargin / s; meshTransform.x[0][0] = s ; meshTransform.x[0][1] = 0 ; meshTransform.x[0][2] = 0 ; meshTransform.x[0][3] = t.x * s ; meshTransform.x[1][0] = 0 ; meshTransform.x[1][1] = s ; meshTransform.x[1][2] = 0 ; meshTransform.x[1][3] = t.y * s ; meshTransform.x[2][0] = 0 ; meshTransform.x[2][1] = 0 ; meshTransform.x[2][2] = s ; meshTransform.x[2][3] = t.z * s ; meshTransform.x[3][0] = 0 ; meshTransform.x[3][1] = 0 ; meshTransform.x[3][2] = 0 ; meshTransform.x[3][3] = 1.0f ; return meshTransform; }