Viewer API Getting Started
In this section we will explore adding a simple 3d viewer on an HTML
page, adding required plugins, loading a 3d asset with all scene settings.
Checkout the Introduction and Installation pages before starting.
Create a canvas
First add a HTML Canvas element on the page.
<canvas id="my-canvas"></canvas>
The canvas can be styled independently with
css
orjs
to set thewidth
and theheight
.
Import the Library
In a typescript or javascript file, the viewer can be imported directly.
import {ViewerApp} from "webgi";
See the Installation page for more details.
Create the viewer.
ViewerApp
can be initialised with just the canvas.
async function intialize3D(){
const viewer = new ViewerApp({
canvas: document.getElementById('main-canvas') as HTMLCanvasElement,
})
// add plugins and load a model. More below.
}
If it is not required to handle the creation of the canvas. the viewer can be instanced by passing the container, a canvas will be created that fills the container completely. For example to create a full screen viewer, pass the body
as the container:
const viewer = new ViewerApp({
container: document.body,
})
Some optional options are available that control the base rendering pipeline.
const viewer = new ViewerApp({
canvas,
useRgbm: true, // Use HDR RGBM Pipeline. false will use HDR Half float pipeline
useGBufferDepth: true, // Uses depth prepass for faster rendering, has z-fighting in some cases.
isAntialiased: false, // Uses multi-sample render target. (only for extreme cases)
})
Add plugins
ViewerApp
comes with a library of plugins to interact with the 3D scene, add new features and functionality. Check the Plugins page for more.
We can start by adding the AssetManagerPlugin
to load our 3d model.
The AssetManagerPlugin manages download, management, caching, parsing, loading and adding of assets to the scene. Extensions can be added for loading different file types and also to export textures, materials and GLTF models. Check the Asset Management page for more
First import the plugin.
// All plugins can be imported from `webgi`
import {
ViewerApp,
AssetManagerPlugin, TonemapPlugin, // ...others
} from "webgi";
Then add to the viewer.
const manager = new AssetManagerPlugin();
await viewer.addPlugin(manager);
or simply
const manager = await viewer.addPlugin(AssetManagerPlugin);
More plugins can be added to enhance the quality and add features.
await viewer.addPlugin(TonemapPlugin);
await viewer.addPlugin(PickingPlugin);
await viewer.addPlugin(GroundPlugin);
await viewer.addPlugin(DiamondPlugin);
After adding all the plugins call:
viewer.renderer.refreshPipeline()
refreshPipeline
sets up the render and post processing pipeline based on what plugins are added. It must be called once after adding the plugins.
Load 3D Assets
We can use the manager
to load 3d models, environment maps, materials and images.
To load a hosted glb
file from a URL
const options = {autoScale: false}
const assets = await manager.addFromPath("https://demo-assets.pixotronics.com/pixo/gltf/cube.glb", options)
This downloads the file and adds it to the scene.
Note that the
addFromPath
function returns an array, this is because it's possible to load a zip or any other container file which can contain multiple assets. There are several function signature in the asset manager for different cases.
Many options are available to control how assets are imported, processed and added to the scene. Check the page on Asset Management or the AssetImporter docs for more.
All models are automatically scaled and centered, it's possible to disable this by passing in the necessary options.
For simple use-cases, the recommended way is to use our sandbox editor to export a compressed glb
file. This adds the background, environment map and all the plugin, scene settings which are automatically loaded at this step.
For other cases it's possible to load an HDR environment map with the manager and setting it to the current scene.
const envMap = await manager.importer!.importSinglePath<ITexture&Texture>("https://demo-assets.pixotronics.com/pixo/hdr/p360-01.hdr")
viewer.scene.environment = envMap || null;
Summary
This is the complete code which will display a simple cube in the canvas with a custom environment map.
It can also be found in the webgi-sample
repository along with other samples.
import {
ViewerApp,
AssetManagerPlugin, TonemapPlugin
} from "webgi"
async function intialize3D(){
// Create a viewer for the canvas
const viewer = new ViewerApp({
canvas: document.getElementById('main-canvas') as HTMLCanvasElement,
})
// Add plugins
const manager = await viewer.addPlugin(AssetManagerPlugin)
await viewer.addPlugin(TonemapPlugin)
viewer.renderer.refreshPipeline()
// Load the assets at once.
await Promise.all([
viewer.scene.setEnvironment(await manager.importer!.importSingle({path:'https://demo-assets.pixotronics.com/pixo/hdr/p360-01.hdr'}))
manager.addAsset({path:'https://demo-assets.pixotronics.com/pixo/gltf/cube.glb'})
])
}
Next steps
The next tutorial covers the basics of the plugin system in webgi
and provides an intro to some core plugins that are used to get photorealistic rendering.