Cognite REVEAL 3D Web Viewer
Visualize Cognite's 3D models in a web browser with WebGL.
Note: The component will by default send anonymous usage statistics. This is used to improve the 3D viewer. You can opt out from this in the Cognite3DViewer constructor.
Table of Contents
Prerequisites
You need to install the Cognite SDK which needs to be authenticated before loading the 3D viewer.
Install
Install the package with yarn:
yarn add @cognite/3d-viewer
or npm:
npm install @cognite/3d-viewer
Cognite Data Fusion
To be able to use this 3D viewer you need to have access to Cognite Data Fusion. You can upload 3D models using Cognite 3D ingestor, or by looking at Cognite's API documentation. You can then use this viewer to visualize the 3D model in any web-based application on desktop or mobile devices.
Usage
import { Cognite3DViewer, THREE, TWEEN } from '@cognite/3d-viewer';
const viewer = new Cognite3DViewer();
const vector = new THREE.Vector3();
Requirements
To be able to use this package you need the following polyfills:
Sample code
const viewer = new Cognite3DViewer();
document.body.appendChild(viewer.domElement);
const options = {
modelId,
revisionId,
};
viewer.addModel(options).then(function(model) {
viewer.fitCameraToModel(model, 0);
});
Note: You may need additional styling to the wrapper div container to make it fit your use-case.
By default, the wrapper will have this style:
{
width: 100vw;
height: 100vh;
}
The internal canvas will be styled to fill this wrapper.
Add progress listeners
function onProgress(progress) {
console.log(progress);
}
function onComplete() {
console.log('Model loaded');
}
const options = {
modelId,
revisionId,
onProgress,
onComplete,
};
viewer.addModel(options)...
Make the viewer clickable
viewer.on('click', function(event) {
const { offsetX, offsetY } = event;
const intersection = viewer.getIntersectionFromPixel(offsetX, offsetY);
if (intersection !== null) {
const { nodeId, point, model } = intersection;
console.log('User clicked at world coordinate', point);
model.selectNode(nodeId);
const boundingBox = model.getBoundingBox(nodeId);
viewer.fitCameraToBoundingBox(boundingBox, 2000);
} else {
model.deselectAllNodes();
}
});
Load saved camera position from the API
Assume you have the revision object from Cognite Data Fusion which you can get from this endpoint.
Here is a code snippet to use the saved camera position:
const { target, position } = revision.camera;
if (Array.isArray(target) && Array.isArray(position)) {
const positionVector = new THREE.Vector3(...position);
const targetVector = new THREE.Vector3(...target);
positionVector.applyMatrix4(model.matrix);
targetVector.applyMatrix4(model.matrix);
viewer.setCameraPosition(positionVector);
viewer.setCameraTarget(targetVector);
} else {
viewer.fitCameraToModel(model, 0);
}
API Reference
Table of Contents
Cognite3DViewer
Cognite3DViewer
is the root class of a Cognite 3D viewer. It controls all aspects of the 3D viewer.
Parameters
options
Object (optional, default {}
)
options.domElement
Element? -- An existing DOM element that we will render into. This corresponds to the domElement property below.options.noBackground
boolean? -- Transparent background or not (optional, default false
)options.logMetrics
boolean -- Send anonymous usage statistics. (optional, default true
)options.highlightColor
boolean -- Highlight color of the selected objects (optional, default THREE.Color(0,0,1)
)options.viewCube
string? -- If defined then show a view cube and snap location of the view cube to this value. One of: 'topleft', 'topright', 'bottomleft', 'bottomright'.
Examples
const viewer = new Cognite3DViewer({
noBackground: true,
});
dispose
Dispose of WebGL resources. Can be used to free up memory when the viewer is no longer in use.
Examples
viewer.dispose();
domElement
The DOM element the viewer will insert its rendering canvas into.
The DOM element can be specified in the options when the viewer is created.
If not specified, the DOM element will be created automatically.
The DOM element cannot be changed after the viewer has been created.
isBrowserSupported
Check if the viewer supports the current browser
Examples
if (!Cognite3DViewer.isBrowserSupported()) {
}
on
Add event listener to the viewer
call off to remove an event listener
Parameters
type
string -- Event type ('click' or 'cameraChange')func
function (event:PointerEvent) -- The callback function
Examples
const onClick = event => { ... };
viewer.on('click', onClick);
viewer.on('cameraChange', (position, target) => {
console.log('Camera changed: ', position, target);
});
off
Remove event listener from the viewer
call on to add an event listener
Parameters
type
string -- Event type ('click' or 'cameraChange')func
function -- The callback function used in on
Examples
viewer.off('click', onClick);
addModel
Add a new 3D model to the viewer. Call fitCameraToModel to focus camera on the model after it has loaded.
Parameters
options
Object (optional, default {}
)
options.modelId
number -- The model's idoptions.revisionId
number -- The model's revision idoptions.geometryFilter
{ boundingBox?: THREE.Box3 } -- Filter out geometries. We currently only support bounding box filter, i.e. load only geometries inside the given bounding box.options.onProgress
function (progress: Object)? -- Callback for progress eventsoptions.onComplete
function? -- Callback when the model is fully loaded
Examples
const options = {
modelId: 'COGNITE_3D_MODEL_ID',
revisionId: 'COGNITE_3D_REVISION_ID',
};
viewer.addModel(options).then(model => {
viewer.fitCameraToModel(model, 0);
});
const boundingBox = new THREE.Box3(
new THREE.Vector3(0, 0, 0),
new THREE.Vector3(10, 10, 10)
);
const options = {
modelId: 'COGNITE_3D_MODEL_ID',
revisionId: 'COGNITE_3D_REVISION_ID',
geometryFilter: { boundingBox }
};
viewer.addModel(options).then(model => {
boundingBox.applyMatrix4(model.matrix);
viewer.fitCameraToBoundingBox(boundingBox);
});
Returns Promise<Cognite3DModel>
addObject3D
Add a THREE.Object3D to the viewer
Parameters
object
THREE.Object3D -- A three.js object
Examples
const sphere = new THREE.Mesh(new THREE.SphereBufferGeometry(), new THREE.MeshBasicMaterial());
viewer.addObject3D(sphere);
removeObject3D
Remove a THREE.Object3D from the viewer
Parameters
object
THREE.Object3D -- A three.js object
Examples
const sphere = new THREE.Mesh(new THREE.SphereBufferGeometry(), new THREE.MeshBasicMaterial());
viewer.addObject3D(sphere);
viewer.removeObject3D(sphere);
setSlicingPlanes
Sets per-pixel slicing planes. Pixels behind any of the planes will be sliced away.
Parameters
slicingPlanes
THREE.Plane[] -- The planes to use for slicing
Examples
const plane = new THREE.Plane(new THREE.Vector3(1, 0, 0), 0);
viewer.setSlicingPlanes([plane]);
const plane = new THREE.Plane(new THREE.Vector3(-1, 0, 0), 20);
viewer.setSlicingPlanes([plane]);
const xPlane = new THREE.Plane(new THREE.Vector3(1, 0, 0), 0);
const yPlane = new THREE.Plane(new THREE.Vector3(0, -1, 0), 0);
viewer.setSlicingPlanes([xPlane, yPlane]);
const plane = new THREE.Plane(new THREE.Vector3(1.5, 20, -19), 20);
viewer.setSlicingPlanes([plane]);
viewer.setSlicingPlanes([]);
getCameraPosition
Returns camera's position
Examples
const position = viewer.getCameraPosition();
Returns THREE.Vector3 Position in world space
getCameraTarget
Returns camera's target
Examples
const target = viewer.getCameraTarget();
Returns THREE.Vector3 Target in world space
setCameraPosition
Set camera's position
Parameters
position
THREE.Vector3 -- Position in world space
Examples
const position = viewer.getCameraPosition();
const target = viewer.getCameraTarget();
viewer.setCameraPosition(position);
viewer.setCameraTarget(target);
setCameraTarget
Set camera's target
Parameters
target
THREE.Vector3 -- Target in world space
Examples
const position = viewer.getCameraPosition();
const target = viewer.getCameraTarget();
viewer.setCameraPosition(position);
viewer.setCameraTarget(target);
fitCameraToBoundingBox
- See: getBoundingBox
Move camera to a place where the content of a bounding box is visible to the camera.
Parameters
box
THREE.Box3 -- The bounding box in world spaceduration
number? -- The duration of the animation moving the camera. Set this to 0 (zero) to disable animation.radiusFactor
number? -- The ratio of the distance from camera to center of box and radius of the box (optional, default 4
)
Examples
viewer.fitCameraToBoundingBox(boundingBox, 500);
viewer.fitCameraToBoundingBox(boundingBox, 0);
viewer.fitCameraToBoundingBox(boundingBox, 500, 2);
const nodeId = 1234;
const boundingBox = model.getBoundingBox(nodeId);
viewer.fitCameraToBoundingBox(boundingBox, 1000);
disableKeyboardNavigation
Disables camera navigation with the keyboard.
Examples
inputElement.addEventListener('focus', () => {
viewer.disableKeyboardNavigation();
});
enableKeyboardNavigation
Enables camera navigation with the keyboard.
Examples
inputElement.addEventListener('blur', () => {
viewer.enableKeyboardNavigation();
});
fitCameraToModel
Move camera to a place where the 3D model is visible. It uses the bounding box of the 3D model and calls fitCameraToBoundingBox
Examples
viewer.fitCameraToModel(model);
viewer.fitCameraToModel(model, 500);
viewer.fitCameraToModel(model, 0);
Parameters
worldToScreen
Convert a point in world space to its coordinates in the canvas. This can be used to place HTML objects near 3D objects on top of the 3D viewer.
Parameters
point
THREE.Vector3 -- World space coordinate.normalize
bool? -- Optional. If true, coordinates are normalized into [0,1]. If false, the values are in the range [0, <canvas_size>). (optional, default false
)
Examples
const boundingBoxCenter = new THREE.Vector3();
model.getBoundingBox(nodeId).getCenter(boundingBoxCenter);
const screenCoordinates = viewer.worldToScreen(boundingBoxCenter);
const boundingBoxCenter = new THREE.Vector3();
model.getBoundingBox(nodeId).getCenter(boundingBoxCenter);
const screenCoordinates = viewer.worldToScreen(boundingBoxCenter, true);
const boundingBoxCenter = new THREE.Vector3();
model.getBoundingBox(nodeId).getCenter(boundingBoxCenter);
const screenCoordinates = viewer.worldToScreen(boundingBoxCenter);
if (screenCoordinates == null) {
} else {
}
Returns (THREE.Vector2 | null) -- Returns 2D coordinates if the point is visible on screen, or null
if object is outside screen.
getIntersectionFromPixel
Raycasting model(s) for finding where the ray intersects with the model.
Parameters
x
number -- X coordinate in pixels (relative to the domElement)y
number -- Y coordinate in pixels (relative to the domElement)cognite3DModel
Cognite3DModel? -- If specified then only give results for this model
Examples
const intersection = viewer.getIntersectionFromPixel(50, 100);
if (intersection)
console.log('You hit model ', intersection.model, ' at the node with id ', intersection.nodeId, ' at this exact point ', intersection.point);
Returns (Intersection | null) -- If there was an intersection then return the intersection object - otherwise it returns null if there was no intersections.
getScreenshot
Take screenshot from the current camera position.
Examples
const url = await viewer.getScreenshot();
const image = document.createElement('img');
image.src = url;
document.body.appendChild(url);
const url = await viewer.getScreenshot(1920, 1080);
Parameters
width
number? -- Width of the final image. Default is current canvas size.height
number? -- Height of the final image. Default is current canvas size.
Returns Promise<string> A Blob URL to the image ('image/png')
Intersection
Type: object
Properties
model
Cognite3DModel -- The node idnodeId
number -- The nodeId of the first intersected nodepoint
THREE.Vector3 -- The 3D position of the intersection point in the world coordinate system
Cognite3DModel
Extends THREE.Object3D
Cognite3DModel
is the class representing a Cognite 3D model and its state
modelId
The id of the model in Cognite Data Fusion
revisionId
The id of the model revision in Cognite Data Fusion
getSubtreeNodeIds
Get all node ids in a subtree where the root node has id 'nodeId'
Parameters
nodeId
number -- The ID of the root nodesubtreeSize
number? -- If you already know the subtreeSize, this will avoid an extra API call
Returns [number] List of nodeIds in the subtree
getBoundingBox
Get bounding box of a node
Parameters
nodeId
number -- The node's idbox
THREE.Box3? -- Optional target. Specify this to increase performance if the box can be reused.
Examples
const box = model.getBoundingBox(nodeId);
const reusableBox = new THREE.Box3();
const box = model.getBoundingBox(nodeId, reusableBox);
Returns THREE.Box3
getNodeColor
Return the color on a node.
Parameters
nodeId
number -- The node's id
Returns {r: number, g: number, b: number} (r, g, b in the range [0, 255])
setNodeColor
Set the color on a node.
Parameters
nodeId
number -- The node's idr
number -- The red color value (0-255)g
number -- The green color value (0-255)b
number -- The blue color value (0-255)
resetNodeColor
Reset a node's color to its original color.
Parameters
nodeId
number -- The node's id
selectNode
Mark a node as selected. Only visible nodes can be selected.
Parameters
nodeId
number -- The node's id
deselectNode
Mark a node as deselected.
Parameters
nodeId
number -- The node's id
deselectAllNodes
Mark all selected nodes as deselected.
showNode
Show a node.
Parameters
nodeId
number -- The node's id
showAllNodes
Show all nodes.
hideAllNodes
Hide all nodes.
Parameters
ghost
bool -- Hide with ghost effect (optional, default false
)
hideNode
Hide a node.
Parameters
nodeId
number -- The node's idghost
bool -- Hide with ghost effect (optional, default false
)
Support
For support contact mailto:support-3d@cognite.com