Я перехожу пример из ami.js https://github.com/FNNDSC/ami/blob/dev/examples/viewers_quadview/viewers_quadview.js, чтобы визуализировать 2D-срез 3D-модели кости, наложенной в виде маски сегментации на 2D-изображение соответствующего КТ-сканирования.
Единственное отличие состоит в том, что я изменил его для чтения сетки 3D-модели из файла STL вместо freesurfer.
Проблема заключается в том, что он визуализирует артефакты маски сегментации из предыдущих срезов поверх текущего CTсканирования.Вместо рендеринга маски, соответствующей текущему КТ-сканированию.
Чтобы визуализировать срезы 3D-модели в виде маски 2D-сегментации при 2D-сканировании CT, в примере создается плоскость, соответствующая 2D-срезу, с помощью CTсканирования.
function updateClipPlane(refObj, clipPlane) {
const stackHelper = refObj.stackHelper;
const camera = refObj.camera;
let vertices = stackHelper.slice.geometry.vertices;
let p1 = new THREE.Vector3(vertices[0].x, vertices[0].y, vertices[0].z)
.applyMatrix4(stackHelper._stack.ijk2LPS);
let p2 = new THREE.Vector3(vertices[1].x, vertices[1].y, vertices[1].z)
.applyMatrix4(stackHelper._stack.ijk2LPS);
let p3 = new THREE.Vector3(vertices[2].x, vertices[2].y, vertices[2].z)
.applyMatrix4(stackHelper._stack.ijk2LPS);
clipPlane.setFromCoplanarPoints(p1, p2, p3);
let cameraDirection = new THREE.Vector3(1, 1, 1);
cameraDirection.applyQuaternion(camera.quaternion);
if (cameraDirection.dot(clipPlane.normal) > 0) {
clipPlane.negate();
}
}
и применяет его к трехмерной сетке в качестве плоскости отсечения во время рендеринга
function render() {
... some code ...
// render r2 view
r2.renderer.clear();
r2.renderer.render(r2.scene, r2.camera);
// mesh
r2.renderer.clearDepth();
data.forEach(function(object, key) {
object.materialFront.clippingPlanes = [clipPlane2];
object.materialBack.clippingPlanes = [clipPlane2];
});
r2.renderer.render(sceneClip, r2.camera);
... some code...
}
jsfiddle, которая иллюстрирует проблему здесь http://jsfiddle.net/crfs6ugq/226/