ETC

Volume Rendering - React

leonhong 2021. 12. 5. 19:28

리소스로 가지고 있는 vti 파일을 출력하는 예제입니다.

 

먼저 public 폴더에 vti 파일을 넣습니다. 그리고 그 파일에 접근할때는 process.env.PUBLIC_URL+'/LIDC2.vti' 로 접근하면 됩니다.

 

실제 코드는 아래와 같습니다.

더보기
import './App.css'
import { useRef, useEffect } from 'react';
 
// Load the rendering pieces we want to use (for both WebGL and WebGPU)
import '@kitware/vtk.js/Rendering/Profiles/Volume';
 
// Force DataAccessHelper to have access to various data source
import '@kitware/vtk.js/IO/Core/DataAccessHelper/HtmlDataAccessHelper';
import '@kitware/vtk.js/IO/Core/DataAccessHelper/HttpDataAccessHelper';
import '@kitware/vtk.js/IO/Core/DataAccessHelper/JSZipDataAccessHelper';
 
import vtkColorTransferFunction     from '@kitware/vtk.js/Rendering/Core/ColorTransferFunction';
import vtkPiecewiseFunction         from '@kitware/vtk.js/Common/DataModel/PiecewiseFunction';
import vtkVolume                    from '@kitware/vtk.js/Rendering/Core/Volume';
import vtkVolumeMapper              from '@kitware/vtk.js/Rendering/Core/VolumeMapper';
import vtkRenderer                  from '@kitware/vtk.js/Rendering/Core/Renderer';
import vtkRenderWindow              from '@kitware/vtk.js/Rendering/Core/RenderWindow';
import vtkOpenGLRenderWindow        from '@kitware/vtk.js/Rendering/OpenGL/RenderWindow';
import xmlImageDataReader           from '@kitware/vtk.js/IO/XML/XMLImageDataReader';
import vtkRenderWindowInteractor    from '@kitware/vtk.js/Rendering/Core/RenderWindowInteractor';
import vtkInteractorStyleTrackballCamera from '@kitware/vtk.js/Interaction/Style/InteractorStyleTrackballCamera';
 
import robot from './logo.svg'
 
function App() {
  const vtkContainerRef = useRef(null);
  const context = useRef(null);
 
  useEffect(() => {
 
    if (!context.current) {
     
      const actor = vtkVolume.newInstance();
      const mapper = vtkVolumeMapper.newInstance();
     
      const renderWindow = vtkRenderWindow.newInstance();
      const renderer = vtkRenderer.newInstance({ background: [0.2, 0.3, 0.4] });
      const openglRenderWindow = vtkOpenGLRenderWindow.newInstance();
     
      const interactor = vtkRenderWindowInteractor.newInstance();
      const interStyle = vtkInteractorStyleTrackballCamera.newInstance();
     
      const xmlReader = xmlImageDataReader.newInstance();
 
      renderWindow.addRenderer(renderer);      
      renderWindow.addView(openglRenderWindow);
 
      vtkContainerRef.current.style.width = '300px';
      vtkContainerRef.current.style.height = '300px';
      openglRenderWindow.setContainer(vtkContainerRef.current);
      openglRenderWindow.setSize(300, 300);
 
      interactor.setView(openglRenderWindow);
      interactor.initialize();
      interactor.bindEvents(vtkContainerRef.current);
      interactor.setInteractorStyle(interStyle);
 
      mapper.setSampleDistance(0.7);
      actor.setMapper(mapper);
 
      // create color and opacity transfer functions
      const ctfun = vtkColorTransferFunction.newInstance();
      ctfun.addRGBPoint(-2000.0, 0.4, 0.2, 0.0);
      ctfun.addRGBPoint(7000.0, 1.0, 1.0, 1.0);
      const ofun = vtkPiecewiseFunction.newInstance();
      ofun.addPoint(-2000.0, 0.1);
      ofun.addPoint(1200.0, 0.5);
      ofun.addPoint(7000.0, 0.8);
      actor.getProperty().setRGBTransferFunction(0, ctfun);
      actor.getProperty().setScalarOpacity(0, ofun);
      actor.getProperty().setScalarOpacityUnitDistance(0, 4.5);
      actor.getProperty().setInterpolationTypeToLinear();
      actor.getProperty().setUseGradientOpacity(0, true);
      actor.getProperty().setGradientOpacityMinimumValue(0, 15);
      actor.getProperty().setGradientOpacityMinimumOpacity(0, 0.0);
      actor.getProperty().setGradientOpacityMaximumValue(0, 100);
      actor.getProperty().setGradientOpacityMaximumOpacity(0, 1.0);
      actor.getProperty().setShade(true);
      actor.getProperty().setAmbient(0.2);
      actor.getProperty().setDiffuse(0.7);
      actor.getProperty().setSpecular(0.3);
      actor.getProperty().setSpecularPower(8.0);
 
      mapper.setInputConnection(xmlReader.getOutputPort());
 
      xmlReader.setUrl(process.env.PUBLIC_URL+'/LIDC2.vti').then(() => {
        xmlReader.loadData().then(() =>{
          renderer.addVolume(actor);
          renderer.resetCamera();
          renderer.getActiveCamera().zoom(1.5);
          renderer.getActiveCamera().elevation(70);
          renderer.updateLightsGeometryToFollowCamera();
          renderWindow.render();
        });
      });
    }
  }, [vtkContainerRef]);
 
  return (
    <div>      
      <div className="mainView" ref={vtkContainerRef}></div>
      <a href={robot} download="robot.txt">download</a>
    </div>
  );
}

 

export default App;

'ETC' 카테고리의 다른 글

수학 관련 용어  (0) 2023.04.26
vtkRenderWindow를 div에 연결하기 - Vue  (0) 2022.05.24
BCI 관련 자료들  (0) 2021.12.20
Simple Volume Rendering App - React  (0) 2021.12.11
React를 이용한 VTK.js 개발하기  (0) 2021.12.05