@kitware/vtk.js
Version:
Visualization Toolkit for the Web
71 lines (68 loc) • 2.82 kB
JavaScript
import { f as distance2BetweenPoints } from '../../../Common/Core/Math/index.js';
import vtkOrientationMarkerWidget from '../../../Interaction/Widgets/OrientationMarkerWidget.js';
import vtkAxesActor from '../../../Rendering/Core/AxesActor.js';
import vtkInteractiveOrientationWidget from '../InteractiveOrientationWidget.js';
function majorAxis(vec3, idxA, idxB) {
const axis = [0, 0, 0];
const idx = Math.abs(vec3[idxA]) > Math.abs(vec3[idxB]) ? idxA : idxB;
const value = vec3[idx] > 0 ? 1 : -1;
axis[idx] = value;
return axis;
}
function createOrientationMarkerWidget(interactor, parentRenderer) {
const axes = vtkAxesActor.newInstance();
const orientationWidget = vtkOrientationMarkerWidget.newInstance({
actor: axes,
interactor,
interactiveRenderer: true,
viewportSize: 0.1,
minPixelSize: 100,
maxPixelSize: 300,
parentRenderer
});
orientationWidget.setEnabled(true);
orientationWidget.setViewportCorner(vtkOrientationMarkerWidget.Corners.BOTTOM_LEFT);
return orientationWidget;
}
function createInteractiveOrientationWidget(bounds) {
const widget = vtkInteractiveOrientationWidget.newInstance();
widget.placeWidget(bounds);
widget.setBounds(bounds.map(v => v * 0.45));
return widget;
}
function createInteractiveOrientationMarkerWidget(widgetManager, interactor, mainRenderer) {
const orientationMarkerWidget = createOrientationMarkerWidget(interactor, mainRenderer);
interactor.getInteractorStyle().setFocusedRenderer(mainRenderer);
widgetManager.setRenderer(orientationMarkerWidget.getRenderer());
const widget = createInteractiveOrientationWidget(orientationMarkerWidget.getActor().getBounds());
return {
interactiveOrientationWidget: widget,
orientationMarkerWidget
};
}
function alignCameraOnViewWidgetOrientationChange(viewWidget, camera, orientationMarkerWidget, widgetManager, render) {
return viewWidget.onOrientationChange(({
up,
direction,
action,
event
}) => {
const focalPoint = camera.getFocalPoint();
const position = camera.getPosition();
const viewUp = camera.getViewUp();
const distance = Math.sqrt(distance2BetweenPoints(position, focalPoint));
camera.setPosition(focalPoint[0] + direction[0] * distance, focalPoint[1] + direction[1] * distance, focalPoint[2] + direction[2] * distance);
if (direction[0]) {
camera.setViewUp(majorAxis(viewUp, 1, 2));
}
if (direction[1]) {
camera.setViewUp(majorAxis(viewUp, 0, 2));
}
if (direction[2]) {
camera.setViewUp(majorAxis(viewUp, 0, 1));
}
orientationMarkerWidget.updateMarkerOrientation();
render();
});
}
export { alignCameraOnViewWidgetOrientationChange, createInteractiveOrientationMarkerWidget, createInteractiveOrientationWidget, createOrientationMarkerWidget, majorAxis };