Viewer
大约 5 分钟
Viewer
三维视图对象是三维应用的入口对象,挂载了渲染管理器、相机控制器、场景管理器及常用方法。
// 实例化一个viewer
const viewer = new VT.Viewer(option);
属性成员
option
初始化配置参数如下:
{
    // 挂载HTMLElement对象
    "container": "",
    // 调试开关
    "debugger": {
        "enable": false,
        "showFPS": false,
        "showMilliseconds": false,
        "showMemory": false
    },
    // 默认视点
    "view": {
        "center": [
            0,
            0,
            0
        ],
        "far": 100000,
        "near": 0.05,
        "position": [
            6.2791192837739676,
            4.285399942474187,
            5.194127521520281
        ],
        "fov": 45,
        "aspect": null,
        "isOrtho": false
    },
    // 交互配置
    "interact": {
        // 是否允许交互
        "enabled": true,
        "mouseButtonLeft": "rotate",
        "mouseButtonRight": "pan",
        "mouseButtonWheel": "dolly",
        "mouseButtonMiddle": "pan",
        "dollySpeed": 0.5,
        "truckSpeed": 2
    },
    // 渲染器参数
    "renderer": {
        // 强制渲染
        "forceRender": true,
        // FPS帧率
        "fps": 60,
        // 像素比例
        "devicePixelRatio": 1,
        // 后处理
        "postEffect": {
            "enable": false,
            "bloom": {
                "enable": false,
                "strength": 0.14,
                "radius": 0.4,
                "threshold": 0.7
            },
            "SSAO": {
                "enable": false,
                "kernelRadius": 0.2,
                "kernelSize": 12
            },
            "colorCorrection": {
                "enable": false,
                "exposure": 0,
                "brightness": 0,
                "contrast": 1,
                "saturation": 1,
                "gamma": 0.6
            },
            "FXAA": {
                "enable": true
            },
            "outline": {
                "enable": true,
                "edgeStrength": 2,
                "edgeGlow": 1,
                "edgeThickness": 0.5,
                "pulsePeriod": 0,
                "visibleEdgeColor": "#ed2a2a",
                "hiddenEdgeColor": "#190a05"
            }
        }
    },
}
sceneManager
场景管理器,详见scenemanager
- 类型:
{SceneManager} 
scene
当前场景
- 类型:
{VT.Scene} 
rendererManager
渲染器管理器,详见rendererManager
- 类型:
{RendererManager} 
isMobileDevice
是否为移动端设备,不可修改
- 类型:
{Boolean} 
size
渲染器窗口大小
- 类型:
{Object}{x, y} 
fullscreen
是否为全屏,可修改
- 类型:
{Boolean} 
// 设置全屏
viewer.fullscreen = true;
spriteComputeParameter
标注计算参数,自动计算,不可修改
- 类型:
{Number} 
方法
resize
调整渲染器容器窗口大小,一般在挂载的容器节点container发生大小或位置变化时调用,触发resize事件。
- 类型:
Function - 参数:无
 - 返回:无
 
// 监听页面resize事件
window.addEventListener("resize", () => {
    viewer.resize();
});
addControl
添加UI控件,主要用于UI控件
- addControl(control, position)
 - 类型:
Function - 参数: 
- control 
{VT.Control}控件对象 - position 
{String}位置 POSITION 
 - control 
 - 返回:
VT.Control 
// 创建指北针
const compassControl = new VT.CompassControl();
// 添加指北针控件
viewer.addControl(compassControl, "bottomleft");
removeControl
删除UI控件,主要用于UI控件
- removeControl(control)
 - 类型:
Function - 参数: 
- control 
{VT.Control}控件对象 
 - control 
 - 返回:
VT.Control 
setFullscreen
设置是否全屏
- setFullscreen(value)
 - 类型:
Function - 参数: 
- value 
{Boolean}是否全屏 
 - value 
 - 返回:无
 
// 监听全屏事件
viewer.addEventListener("fullscreen", () => {
    // 代码执行
});
// 设置全屏
viewer.setFullscreen(true);
// 监听全屏退出事件
viewer.addEventListener("exitFullscreen", () => {
    // 代码执行
});
// 退出全屏
viewer.setFullscreen(false);
setView
设置当前视点和相机状态
- setView(view, enableTransition)
 - 类型:
Function - 参数: 
- view 
{Object}视点参数 - enableTransition 
{Boolean}是否开启过渡动画 
 - view 
 - 返回:无
 
const view = {
    "center": [
        0,
        0,
        0
    ],
    "far": 100000,
    "near": 0.05,
    "position": [
        6.2791192837739676,
        4.285399942474187,
        5.194127521520281
    ],
    "fov": 45,
    "aspect": null,
    "isOrtho": false
};
viewer.setView(view, true);
getView
获取当前视点和相机状态
- getView(requestAspect)
 - 类型:
Function - 参数: 
- requestAspect 
{Boolean}是否保存当前窗口比例,默认不保存 
 - requestAspect 
 - 返回:
{Object} 
const view = viewer.getView();
将返回:
{
    "center": [
        0,
        0,
        0
    ],
    "far": 100000,
    "near": 0.05,
    "position": [
        6.2791192837739676,
        4.285399942474187,
        5.194127521520281
    ],
    "fov": 45,
    "aspect": null,
    "isOrtho": false
}
getAspect
获取当前渲染器窗口的比例
- getAspect()
 - 类型:
Function - 参数:无
 - 返回:
{Number} 
pick
获取鼠标事件的拾取结果
- pick(event)
 - 类型:
Function - 参数: 
- event 
{Object}事件,必须包含clientX、clientY坐标:{clientX, clientY} 
 - event 
 - 返回:
{Object}- picked 
{Object}拾取对象- picked 
{THREE.Object3D}拾取的物体,过滤了一些不必要的物体,如不可见的、锁定的 - raycasterPicked 
{THREE.Object3D}经过射线拾取的物体,未过滤 - raycasterSceneHelpersPicked 
{THREE.Object3D}辅助场景拾取结果 
 - picked 
 - position 
{Array}拾取的三维坐标 
 - picked 
 
const picked = viewer.pick({clientX: 155, clientY: 50});
coordScreenToWorldWithPick
使用pick方式将屏幕坐标转三维坐标
- coordScreenToWorldWithPick(x, y, height, filter)
 - 类型:
Function - 参数: 
- x 
Number屏幕的X坐标 - y 
Number屏幕的Y坐标 - height 
Number可选,拾取高度无效时的高度 - filter 
Function可选,对象过滤方法,参数为pick结果 
 - x 
 - 返回:
{Array}三维坐标 
// 过滤方法
function filter({picked, raycasterPicked, raycasterSceneHelpersPicked}) {
    // 代码
}
const position = viewer.coordScreenToWorldWithPick(155, 50, 0.1, filter);
coordScreenToWorld
屏幕坐标转三维坐标
- coordScreenToWorld(x, y, height)
 - 类型:
Function - 参数: 
- x 
Number屏幕的X坐标 - y 
Number屏幕的Y坐标 - height 
Number可选,拾取高度无效时的高度 
 - x 
 - 返回:
{Array}三维坐标 
const position = viewer.coordScreenToWorld(155, 50);
coordWorldToScreen
屏幕坐标转三维坐标
- coordWorldToScreen(x, y, z)
 - 类型:
Function - 参数: 
- x 
Number三维x坐标 - y 
Number三维y坐标 - z 
Number三维z坐标 
 - x 
 - 返回:
{Object}二维坐标{x, y} 
const position = viewer.coordWorldToScreen(1.55, 2.5, 4.3);
getPixelLength
求两个三维坐标的屏幕像素距离
- getPixelLength(vertexA, vertexB)
 - 类型:
Function - 参数: 
- vertexA 
THREE.Vector3|Array三维坐标A - vertexB 
THREE.Vector3|Array三维坐标B 
 - vertexA 
 - 返回:
{Number} 
const distance = viewer.getPixelLength([0, 0, 0], [0, 1.5, 0]);
getSize
获取窗口大小
- getSize()
 - 类型:
Function - 参数:无
 - 返回:
{Object}二维坐标{x, y} 
trigger
主动触发事件,模拟或远控事件
- trigger(eventType, event)
 - 类型:
Function - 参数: 
- eventType 
String事件类型,支持 click, mousedown, mouseover, dblclick, contexmenu - event 
Object事件 
 - eventType 
 - 返回:无
 
viewer.trigger("click", {clientX: 155, clientY: 50});
captureScreenshot
保存当前场景为图片,截图,可返回base64编码或下载文件
- captureScreenshot(option)
 - 类型:
Function - 参数: 
- option 
Object截图参数,以下均为可选- filename 
{String}文件名称 - mime 
{String}图片类型,默认image/jpeg,可选 image/png - quality 
{Number}质量,默认 0.8 - saveAsFile 
{Boolean}是否另存为,默认false - width 
{Integer}图片宽度 - height 
{Integer}图片高度 
 - filename 
 
 - option 
 - 返回:
{String|undefined}返回base64编码或下载文件 
// 获取场景截图 base64 编码
viewer.captureScreenshot({
    quality: 0.5,
    width: 320,
    height: 240
});
// 下载场景图片
viewer.captureScreenshot({
    filename: "scene.jpg",
    mime: "image/jpeg",
    quality: 1.0,
    saveAsFile: true,
});
setCursor
设置鼠标样式
- setCursor(cursor)
 - 类型:
Function - 参数: 
- cursor 
String鼠标样式 
 - cursor 
 - 返回:无
 
initExplodeModel
初始化展开效果模型,在调用explodeModel展开模型方法前,必须要先调用本方法。
- initExplodeModel(modelObject)
 - 类型:
Function - 参数: 
- modelObject 
VT.Model模型 
 - modelObject 
 - 返回:无
 
explodeModel
展开模型,模型构件爆炸效果
- explodeModel(modelObject, scalar)
 - 类型:
Function - 参数: 
- modelObject 
VT.Model模型 - scalar 
Number比例 
 - modelObject 
 - 返回:无
 
// 添加模型
const model = new VT.Model({
    modelType: "gltf",
    src: "./resources/models/1.gltf"
});
viewer.scene.add(model);
// 初始化模型展开
viewer.initExplodeModel(model);
// 展开模型
viewer.explodeModel(model, 2.0);
destroy
销毁实例
- destroy()
 - 类型:
Function - 参数:无
 - 返回:无