@acransac/vtk.js
Version:
Visualization Toolkit for the Web
119 lines (96 loc) • 4.3 kB
JavaScript
import 'vtk.js/Sources/favicon';
import vtkActor from 'vtk.js/Sources/Rendering/Core/Actor';
import vtkAxesActor from 'vtk.js/Sources/Rendering/Core/AxesActor';
import vtkConeSource from 'vtk.js/Sources/Filters/Sources/ConeSource';
import vtkFullScreenRenderWindow from 'vtk.js/Sources/Rendering/Misc/FullScreenRenderWindow';
import vtkInteractorStyleUnicam from 'vtk.js/Sources/Interaction/Style/InteractorStyleUnicam';
import vtkMapper from 'vtk.js/Sources/Rendering/Core/Mapper';
import vtkMouseCameraTrackballZoomToMouseManipulator from 'vtk.js/Sources/Interaction/Manipulators/MouseCameraTrackballZoomToMouseManipulator';
import vtkOrientationMarkerWidget from 'vtk.js/Sources/Interaction/Widgets/OrientationMarkerWidget';
import controlPanel from './controlPanel.html';
// ----------------------------------------------------------------------------
// Renderer setup
// ----------------------------------------------------------------------------
const fullScreenRenderWindow = vtkFullScreenRenderWindow.newInstance({
background: [0, 0, 0],
});
const renderWindow = fullScreenRenderWindow.getRenderWindow();
const renderer = fullScreenRenderWindow.getRenderer();
fullScreenRenderWindow.addController(controlPanel);
// ----------------------------------------------------------------------------
// Interactor style setup
// ----------------------------------------------------------------------------
const interactorStyle = vtkInteractorStyleUnicam.newInstance();
interactorStyle.setWorldUpVec([0, 1, 0]);
interactorStyle.addMouseManipulator(
vtkMouseCameraTrackballZoomToMouseManipulator.newInstance({
scrollEnabled: true,
})
);
interactorStyle.setRotationFactor(2);
interactorStyle.setFocusSphereColor(1, 0, 0);
interactorStyle.setFocusSphereRadiusFactor(1.2);
renderWindow.getInteractor().setInteractorStyle(interactorStyle);
// ----------------------------------------------------------------------------
// Basic actor setup
// ----------------------------------------------------------------------------
const coneSource = vtkConeSource.newInstance({ height: 1.0 });
const mapper = vtkMapper.newInstance();
mapper.setInputConnection(coneSource.getOutputPort());
const actor = vtkActor.newInstance();
actor.rotateZ(90);
actor.setMapper(mapper);
renderer.addActor(actor);
renderer.resetCamera();
renderWindow.render();
// ----------------------------------------------------------------------------
// Orientation widget setup
// ----------------------------------------------------------------------------
const axes = vtkAxesActor.newInstance({ pickable: false });
const orientationWidget = vtkOrientationMarkerWidget.newInstance({
actor: axes,
interactor: renderWindow.getInteractor(),
});
orientationWidget.setViewportCorner(
vtkOrientationMarkerWidget.Corners.BOTTOM_RIGHT
);
orientationWidget.setMinPixelSize(100);
orientationWidget.setMaxPixelSize(300);
// ----------------------------------------------------------------------------
// UI setup
// ----------------------------------------------------------------------------
function updateWorldUpVec() {
let useWorldUpVec = document.querySelector('.useWorldUpVec').checked;
const coordinateElements = Array.from(
document.querySelector('.coordinates').children
);
coordinateElements.forEach((element) => {
element.disabled = !useWorldUpVec;
});
if (useWorldUpVec) {
const coordinates = coordinateElements.map((item) =>
Number.parseFloat(item.value)
);
const validCoordinates = !coordinates.some(Number.isNaN);
if (validCoordinates) {
interactorStyle.setWorldUpVec(...coordinates);
} else {
useWorldUpVec = false;
}
}
interactorStyle.setUseWorldUpVec(useWorldUpVec);
renderWindow.render();
}
document.querySelector('.useWorldUpVec').oninput = updateWorldUpVec;
document.querySelector('.coordinates').oninput = updateWorldUpVec;
document.querySelector('.useOrientationMarker').oninput = (ev) => {
orientationWidget.setEnabled(ev.target.checked);
};
document.querySelector('.useParallelCamera').oninput = (ev) => {
renderer.getActiveCamera().setParallelProjection(ev.target.checked);
renderWindow.render();
};
renderer
.getActiveCamera()
.onModified(orientationWidget.updateMarkerOrientation);
updateWorldUpVec();