Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import '@kitware/vtk.js/favicon';

// Load the rendering pieces we want to use (for both WebGL and WebGPU)
import '@kitware/vtk.js/Rendering/Profiles/Geometry';

import vtkActor from '@kitware/vtk.js/Rendering/Core/Actor';
import vtkCubeSource from '@kitware/vtk.js/Filters/Sources/CubeSource';
import vtkFullScreenRenderWindow from '@kitware/vtk.js/Rendering/Misc/FullScreenRenderWindow';
import vtkInteractorStyleTrackballActor from '@kitware/vtk.js/Interaction/Style/InteractorStyleTrackballActor';
import vtkMapper from '@kitware/vtk.js/Rendering/Core/Mapper';

import GUI from 'lil-gui';

// ----------------------------------------------------------------------------
// Example code
// ----------------------------------------------------------------------------

const fullScreenRenderer = vtkFullScreenRenderWindow.newInstance();
const renderer = fullScreenRenderer.getRenderer();
const renderWindow = fullScreenRenderer.getRenderWindow();
const interactor = fullScreenRenderer.getInteractor();

const cubeSource = vtkCubeSource.newInstance({
xLength: 1.2,
yLength: 0.8,
zLength: 0.6,
});
const mapper = vtkMapper.newInstance();
mapper.setInputConnection(cubeSource.getOutputPort());

const actor = vtkActor.newInstance();
actor.setMapper(mapper);
renderer.addActor(actor);

renderer.resetCamera();
renderWindow.render();

interactor.setInteractorStyle(vtkInteractorStyleTrackballActor.newInstance());
const style = interactor.getInteractorStyle();
const gui = new GUI();
const params = {
motionFactor: style.getMotionFactor(),
left: 'rotate picked actor',
shiftLeft: 'pan picked actor',
ctrlLeft: 'spin picked actor',
middle: 'pan picked actor',
ctrlMiddle: 'dolly picked actor',
right: 'uniform scale picked actor',
};

gui.add(params, 'motionFactor', 1, 30, 1).onChange((value) => {
style.setMotionFactor(Number(value));
renderWindow.render();
});
gui.add(params, 'left').name('Left').disable();
gui.add(params, 'shiftLeft').name('Shift + Left').disable();
gui.add(params, 'ctrlLeft').name('Ctrl + Left').disable();
gui.add(params, 'middle').name('Middle').disable();
gui.add(params, 'ctrlMiddle').name('Ctrl + Middle').disable();
gui.add(params, 'right').name('Right').disable();
175 changes: 175 additions & 0 deletions Sources/Interaction/Style/InteractorStyleTrackballActor/index.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,175 @@
import vtkInteractorStyle from '../../../Rendering/Core/InteractorStyle';
import vtkCellPicker from '../../../Rendering/Core/CellPicker';
import vtkProp3D from '../../../Rendering/Core/Prop3D';
import vtkRenderer from '../../../Rendering/Core/Renderer';
import { Nullable } from '../../../types';
import { IRenderWindowInteractorEvent } from '../../../Rendering/Core/RenderWindowInteractor';

export interface IInteractorStyleTrackballActorInitialValues {
motionFactor?: number;
interactionProp?: Nullable<vtkProp3D>;
interactionPicker?: Nullable<vtkCellPicker>;
}

export interface vtkInteractorStyleTrackballActor extends vtkInteractorStyle {
/**
* Find the picked actor and pick position.
* @param {vtkRenderer} renderer
* @param position
*/
findPickedActor(
renderer: vtkRenderer,
position: { x: number; y: number }
): void;

/**
* Handle mouse move event.
* @param {IRenderWindowInteractorEvent} callData
*/
handleMouseMove(callData: IRenderWindowInteractorEvent): void;

/**
* Handle left mouse button press event.
* @param {IRenderWindowInteractorEvent} callData
*/
handleLeftButtonPress(callData: IRenderWindowInteractorEvent): void;

/**
* Handle left mouse button release event.
* @param {IRenderWindowInteractorEvent} callData
*/
handleLeftButtonRelease(callData: IRenderWindowInteractorEvent): void;

/**
* Handle middle mouse button press event.
* @param {IRenderWindowInteractorEvent} callData
*/
handleMiddleButtonPress(callData: IRenderWindowInteractorEvent): void;

/**
* Handle middle mouse button release event.
* @param {IRenderWindowInteractorEvent} callData
*/
handleMiddleButtonRelease(callData: IRenderWindowInteractorEvent): void;

/**
* Handle right mouse button press event.
* @param {IRenderWindowInteractorEvent} callData
*/
handleRightButtonPress(callData: IRenderWindowInteractorEvent): void;

/**
* Handle right mouse button release event.
* @param {IRenderWindowInteractorEvent} callData
*/
handleRightButtonRelease(callData: IRenderWindowInteractorEvent): void;

/**
* Handle mouse rotate event.
* @param {vtkRenderer} renderer
* @param position
*/
handleMouseRotate(
renderer: vtkRenderer,
position: { x: number; y: number }
): void;

/**
* Handle mouse spin event.
* @param {vtkRenderer} renderer
* @param position
*/
handleMouseSpin(
renderer: vtkRenderer,
position: { x: number; y: number }
): void;

/**
* Handle mouse pan event.
* @param {vtkRenderer} renderer
* @param position
*/
handleMousePan(
renderer: vtkRenderer,
position: { x: number; y: number }
): void;

/**
* Handle mouse dolly event.
* @param {vtkRenderer} renderer
* @param position
*/
handleMouseDolly(
renderer: vtkRenderer,
position: { x: number; y: number }
): void;

/**
* Handle mouse uniform scale event.
* @param {vtkRenderer} renderer
* @param position
*/
handleMouseUniformScale(
renderer: vtkRenderer,
position: { x: number; y: number }
): void;

/**
* Start uniform scale interaction.
*/
startUniformScale(): void;

/**
* End uniform scale interaction.
*/
endUniformScale(): void;

/**
* Get the interaction picker.
*/
getInteractionPicker(): Nullable<vtkCellPicker>;

/**
* Get the interaction prop.
*/
getInteractionProp(): Nullable<vtkProp3D>;

/**
* Set the interaction prop.
* @param {vtkProp3D | null} prop
*/
setInteractionProp(prop: Nullable<vtkProp3D>): boolean;

/**
* Get the motion factor.
*/
getMotionFactor(): number;

/**
* Set the motion factor.
* @param {Number} factor
*/
setMotionFactor(factor: number): boolean;
}

export function newInstance(
initialValues?: IInteractorStyleTrackballActorInitialValues
): vtkInteractorStyleTrackballActor;

export function extend(
publicAPI: object,
model: object,
initialValues?: IInteractorStyleTrackballActorInitialValues
): void;

/**
* vtkInteractorStyleTrackballActor allows the user to interact with (rotate, pan, etc.) objects in the scene independent of each other.
* In trackball interaction, the magnitude of the mouse motion is proportional to the actor motion associated with a particular mouse binding.
* For example, small left-button motions cause small changes in the rotation of the actor around its center point.
*/
export const vtkInteractorStyleTrackballActor: {
newInstance: typeof newInstance;
extend: typeof extend;
};

export default vtkInteractorStyleTrackballActor;
Loading
Loading