UNPKG

@thingjs/xplugin-core

Version:

xplugin核心组件包,完成插件生命周期配置实现

1,874 lines (1,670 loc) 118 kB
/** * 构造物体控制轴 * @param {THING.BaseObject} object 物体 * @param {String} mode? 控制轴模式("translate"/"rotate"/"scale"). * @param {Object} params 参数列表 * @param {Function} params.changeStart? 控制轴开始修改物体位置信息 * @param {Function} params.change? 控制轴修改物体位置信息中 * @param {Function} params.changeEnd? 控制轴结束修改物体位置信息 */ declare class AxisTransformControl { constructor(object: BaseObject, mode?: string, params: { "changeStart?": ()=>any; "change?": ()=>any; "changeEnd?": ()=>any; }); } /** * @namespace */ declare namespace THING { /** * @class App * ThingJS库入口对象,提供加载场景、搜索、事件绑定、摄像机控制等 * @memberof THING * @example * var app = new THING.App({ container: "div3d" }); */ class App { constructor(options: { url: string; complete: ()=>any; success: ()=>any; error: ()=>any; progress: ()=>any; background: number; skyBox: string; env: string | any[]; }); /** * 摄像机 * @type {THING.CameraController} */ camera: CameraController; /** * 创建物体 * @param {String} type 物体类型 * @param {String} name 物体名称 * @param {String} url 物体模型链接 * @param {Array<Number>} position 物体生成位置 * @param {Function} complete 物体生成后的回调 * @return {THING.BaseObject|THING.Marker|THING.WebView|THING.UIAnchor} * @example * // type:'Thing' * var truck = app.create({ * type: 'Thing', * name: 'truck', * url: 'https://speech.uinnova.com/static/models/truck/', * position: [-5, 0, 0], * complete: function() { * console.log('truck created!'); * } * }); * // type:'UI'; * var ui = app.create({ * type: 'UI', * el: element, // 界面的dom元素 * parent: parent, // 界面的父节点(位置跟随父节点更新) * localPosition:[0,0,0], //相对parent的偏移 * pivot:[0,0.5], // 界面的重心 * }); * // type:'Marker'; * var marker = app.create({ * type: "Marker", * localPosition: [0, 5, 0], // 相对于包围盒的最高点偏移量 * size: 4, * url: "https://speech.uinnova.com/static/images/warning1.png", * parent: app.query('car01')[0] * }); * // type:'WebView'; * var webView = app.create({ * type: 'WebView', * url: 'http://www.baidu.com/', * position: [0, 0, 0], * width: 16, * height: 16 * }); * // type:'Box'; * var box = app.create({ * type: 'Box', * width: 1.0, // 宽度 * height: 1.0, // 高度 * depth: 1.0, // 深度 * widthSegments: 1.0, //宽度上的节数 * heightSegments: 1.0, // 高度上的节数 * depthSegments: 1.0, // 深度上的节数 * center:'Bottom', // 中心点 * style: { * color: '#ffffff', * opacity: 0.8, * image: 'images/uv.jpg' * } * }); * // type:'Sphere'; * var sphere = app.create({ * type: 'Sphere', * radius: 1, * widthSegments: 12, * heightSegments: 12, * position: [2, 0, 0], * style: { * image: 'images/perlin-512.png' * } * }); * // type:'Plane'; * var plane = app.create({ * type: 'Plane', * width: 2, * height: 1, * position: [4, 0, 0], * style: { * doubleSide: true, * image: 'images/perlin-512.png' * } * }); * // type:'Cylinder'; * var plane = app.create({ * type: 'Cylinder', * radius: 0.4, * height: 1.6, * position: [0, 0, 2] * }); * // type:'Tetrahedron'; * var t = app.create({ * type: 'Tetrahedron', * radius: 1, * position: [2, 0, 2] * }); * // 另外,可以通过 t3d.factory.registerClass(类名, '物体类型名') 来扩展物体类型 */ create(type: string, name: string, url: string, position: number[], complete: ()=>any): BaseObject | Marker | WebView | UIAnchor; /** * 物体查询 * @param {String} 参数列表 * @return {Array<THING.BaseObject>} 查询结果,注意是以数组的方式提供,如果什么都没有找到就返回 [] * @example * app.query('car01') 查询名称为 car01 的对象 * app.query('.Thing') 查询类型为 Thing 的对象 * app.query('#001') 查询id为 001 的对象 * app.query('[prop=value]') 查询自定义属性为 [prop=value] 的对象 * app.query('/car/') 查询名字中包含 car 的对象 */ query(参数列表: string): (BaseObject)[]; /** * 绑定事件 * @param {String} eventType 事件名称 * @param {String} selector 物体类型选择信息 * @param {Object} userData 事件绑定自定义数据, 如果是 Function 类型,也表示回调函数参数 * @param {Function} callback 事件触发的回调函数 * @param {String} tag? 事件名字标记 * @param {Number} priority ? 优先级,数值越大优先级越高 * @example * app.on('click', '.Building', function(ev) {...}); * app.on('click', '.Thing', {id: 1, hit: false}, function(ev) {...}); * app.on('update', function(ev) {...}); */ on(eventType: string, selector: string, userData: any, callback: ()=>any, tag?: string, priority: number): void; /** * 解绑事件 * @param {String} eventType 事件名称 * @param {String} selector 物体类型选择信息, 如果是 Function 类型,也表示回调函数参数 * @param {Function} callback 事件触发的回调函数 */ off(eventType: string, selector: string, callback: ()=>any): void; /** * 绑定事件(只触发一次) * @param {String} eventType 事件名称 * @param {String} selector 物体类型选择信息 * @param {Object} userData 事件绑定自定义数据, 如果是 Function 类型,也表示回调函数参数 * @param {Function} callback 事件触发的回调函数 * @param {String} tag? 事件名字标记 * @param {Number} priority ? 优先级,数值越大优先级越高 * @example * app.one('click', '.Building', function(ev) {...}); * app.one('click', '.Thing', {id: 1, hit: false}, function(ev) {...}); * app.one('update', function(ev) {...}); */ one(eventType: string, selector: string, userData: any, callback: ()=>any, tag?: string, priority: number): void; /** * 发送事件 * @param {String} eventType 事件名称 * @param {String} selector 物体类型选择信息 * @param {Object} ev 事件信息 */ trigger(eventType: string, selector: string, ev: any): void; /** * 暂停事件响应 * @param {String} eventType 事件名称 * @param {String} selector 物体类型选择信息 * @param {String} tag? 事件名字标记 */ pauseEvent(eventType: string, selector: string, tag?: string): void; /** * 暂停事件响应(当前帧,下一帧恢复响应) * @param {String} eventType 事件名称 * @param {String} selector 物体类型选择信息 * @param {String} tag? 事件名字标记 */ pauseEventInFrame(eventType: string, selector: string, tag?: string): void; /** * 恢复事件响应 * @param {String} eventType 事件名称 * @param {String} selector 物体类型选择信息 * @param {String} tag? 事件名字标记 */ resumeEvent(eventType: string, selector: string, tag?: string): void; /** * 获得园区数据,不会加载场景渲染资源, 信息将以JSON数据的方式返回。 * 主要用途是查询未加载或者准备加载场景的数据,因为没有渲染信息的加载,所以速度会非常快。 * @param {String} url 园区路径 * @param {Object} params 参数列表 * @return {Object} */ getCampusJSON(url: string, params: any): any; /** * 从启动到现在的流逝时间(毫秒) * @type {Number} */ elapsedTime: number; /** * 距离上一帧的流逝时间(毫秒) * @type {Number} */ deltaTime: number; /** * 当前帧计数器 * @type {Number} */ currentFrame: number; /** * 获取像素比例,在移动设备上,为了渲染效率,我们通常会把这个值设置成比1还要小的数值,从而获得较小的渲染分辨率来提供帧率。 * 数值越大,渲染效果越清晰(帧率低),数值越小,渲染效果越模糊(帧率高) * @type {Number} */ pixelRatio: number; /** * 设置时间线效果 * @type {Object} options 参数列表 * @property {Number} options.time 时间 * @property {Number} options.beta 角度 * @property {Number} options.turbidity 混浊度 * @property {Number} options.rayleigh 瑞利散射 * @property {Number} options.mieCoefficient 散射系数 * @property {Number} options.mieDirectionalG * @example * app.skyEffect = { * time: 9, * beta: 45, * turbidity: 10, * rayleigh: 1.5, * luminance: 1, * mieCoefficient: 0.005, * mieDirectionalG: 0.98 * }; */ skyEffect: any; /** * 设置灯光参数 * @type {Object} options 参数列表 * @property {Boolean} options.showHelper 是否显示辅助线 * @property {Object} options.ambientLight 环境光 * @property {Number} options.ambientLight.intensity 环境光强度 * @property {Number} options.ambientLight.color 环境光颜色 * @property {Object} options.mainLight 主灯光 * @property {Number} options.mainLight.intensity 主灯光强度 * @property {Number} options.mainLight.color 主灯光颜色 * @property {Number} options.mainLight.alpha 主灯光角度 * @property {Number} options.mainLight.beta 主灯光角度 * @property {Object} options.secondaryLight 第二光源 * @property {Number} options.secondaryLight.intensity 第二光源强度 * @property {Number} options.secondaryLight.color 第二光源颜色 * @property {Number} options.secondaryLight.alpha 第二光源角度 * @property {Number} options.secondaryLight.beta 第二光源角度 * @property {Object} options.tertiaryLight 第三光源 * @property {Number} options.tertiaryLight.intensity 第三光源强度 * @property {Number} options.tertiaryLight.color 第三光源颜色 * @property {Number} options.tertiaryLight.alpha 第三光源角度 * @property {Number} options.tertiaryLight.beta 第三光源角度 * @example * app.lighting = { * showHelper: false, // 灯光标示 * ambientLight: { * intensity: 0.5, * color: 0xffffff * }, * hemisphereLight: { * intensity: 0.0, * color: 0xffffff, * groundColor: 0x222222 * }, * mainLight: { * // If enable shadow of main light. * shadow: false, * // Quality of main light shadow. 'low'|'medium'|'high'|'ultra' * shadowQuality: 'high', * // Intensity of main light * intensity: 0.5, * // Color of main light * color: 0xffffff, * // Alpha is rotation from bottom to up. * alpha: 30, * // Beta is rotation from left to right. * beta: 30 * }, * secondaryLight: { * shadow: false, * shadowQuality: 'high', * intensity: 0, * color: 0xffffff, * alpha: 138, * beta: 0 * }, * tertiaryLight: { * shadow: false, * shadowQuality: 'high', * intensity: 0, * color: 0xffffff, * alpha: 0, * beta: 0 * } * }; */ lighting: any; /** * 设置雾参数 * @type {Object} options * @property {String} options.type 目前支持特殊类型 `Exp2`,及默认类型 * @property {Number} options.color 雾颜色数值 * @property {Number} options.far 设置远距离的雾效浓度 * @property {Number} options.near 设置近距离的雾效浓度 * @example * // 线性雾 * app.fog = {color: 0x888888, near: 1, far: 100}; * // 清除雾 * app.fog = null; */ fog: any; /** * 设置后期处理参数 * @type {Object} options 参数列表 * @property {Object} options.temporalSuperSampling 超采样(场景静止时起作用) * @property {boolean} options.temporalSuperSampling.enable * @property {Number} options.temporalSuperSampling.size 采样的帧数,帧数越多,收敛速度越慢 * @property {Object} options.postEffect 后期处理 * @property {boolean} options.postEffect.enable * @property {Object} options.bloom 泛光(会影响天空盒) * @property {boolean} options.bloom.enable * @property {Number} options.bloom.strength 泛光强度 * @property {Number} options.bloom.radius 泛光半径 * @property {Number} options.bloom.threshold 泛光阈值 * @property {Object} options.screenSpaceAmbientOcclusion 屏幕空间环境光遮蔽(相对昂贵的性能开销) * @property {boolean} options.screenSpaceAmbientOcclusion.enable * @property {Number} options.screenSpaceAmbientOcclusion.radius 采样半径 * @property {Number} options.screenSpaceAmbientOcclusion.quality 采样等级 * @property {Number} options.screenSpaceAmbientOcclusion.intensity 环境光遮蔽强度 * @property {Number} options.screenSpaceAmbientOcclusion.temporalFilter 使用temporal超采样时起作用,柔化采样效果 * @property {boolean} options.screenSpaceAmbientOcclusion.ignoreTransparent 忽略透明物体 * @property {Object} options.colorCorrection 颜色调整 * @property {boolean} options.colorCorrection.enable * @property {Number} options.colorCorrection.exposure 曝光 * @property {Number} options.colorCorrection.brightness 亮度 * @property {Number} options.colorCorrection.contrast 对比度 * @property {Number} options.colorCorrection.saturation 饱和度 * @property {Object} options.FXAA 抗锯齿 * @property {boolean} options.FXAA.enable * @property {boolean} resetOther? 是否重置其它未设置的后期处理配置,默认为false,会保持当前的设置状态 * @example * // 后期处理 * app.postEffect = { * // If enable post effects. * enable: false, * // Configuration about bloom post effect * // 泛光(会影响天空盒) * bloom: { * // If enable bloom * enable: false, * // Intensity of bloom * // 泛光强度 * strength: 0.14, * // radius of bloom * // 泛光半径 * radius: 0.4, * // threshold of bloom * // 泛光阈值 * threshold: 0.7 * }, * // Configuration about screen space ambient occulusion * // 屏幕空间环境光遮蔽(相对昂贵的性能开销) * screenSpaceAmbientOcclusion: { * // If enable SSAO * enable: false, * // Sampling radius in work space. * // Larger will produce more soft concat shadow. * // But also needs higher quality or it will have more obvious artifacts * // 采样半径 * radius: 0.2, * // Quality of SSAO. 'low'|'medium'|'high'|'ultra' * // 采样等级 * quality: 'medium', * // Intensity of SSAO * // 环境光遮蔽强度 * intensity: 0.8, * // temporal filter in temporal super sampling mode * // 使用temporal超采样时起作用,柔化采样效果 * temporalFilter: true, * // if ignore transparent objects * // 忽略透明物体 * ignoreTransparent: false * }, * // Configuration about color correction * // 颜色调整 * colorCorrection: { * // If enable color correction * enable: false, * // 曝光 * exposure: 0, * // 亮度 * brightness: 0, * // 对比度 * contrast: 1, * // 饱和度 * saturation: 1, * // 伽马矫正 * gamma: 1 * }, * // Configuration about FXAA * // fxaa 抗锯齿 * FXAA: { * // If enable FXAA * enable: false * } * }; */ postEffect: any; /** * 设置背景颜色或者图片 * @type {String|Number} value 图片路径或者颜色值 */ background: string | number; /** * 设置天空盒(THING JS目前提供了几个天空盒,分别是'BlueSky','MilkyWay','Night','SunCloud') * @type {String} 天空盒名称 * @example * var app = new THING.App({ skyBox: "BlueSky" }); */ skyBox: string; /** * 判断某按键是否按下 * @param {number} key 键值 * @return {Boolean} */ isKeyPressed(key: number): boolean; /** * 判断是否移动端设备 * @type {boolean} */ isMobileDevice: boolean; /** * 获取场景层次管理器 * @type {THING.SceneLevel} */ level: SceneLevel; /** * 获取场景根节点 * @type {THING.SceneRoot} */ root: SceneRoot; /** * 将当前截屏保存到缓冲区中 * @param {String} extension 文件类型 * @param {number} quality 质量 * @param {Boolean} allowDownload 是否允许被下载 */ captureScreenshotToImage(extension?: string, quality?: number, allowDownload?: boolean): void; /** * 将当前截屏保存到指定文件中 * @param {String} fileName 文件路径 */ captureScreenshot(fileName: string): void; /** * 保存文件 * @param {String} fileName 文件路径 * @param {String} data 文件数据 */ saveFile(fileName: string, data: string): void; } /** * @class CameraController * 摄像机类,就是 app.camera 对象 * @author wujunhua, larrow 2017.10.7 * @memberof THING */ class CameraController { constructor(); /** * 世界坐标转换成屏幕坐标 * @param {Array<Number>} position 世界坐标 * @return {Array<Number>} 屏幕坐标 */ worldToScreen(position: number[]): number[]; /** * 屏幕坐标转世界坐标 * @param {Number} x 屏幕x坐标 * @param {Number} y 屏幕y坐标 * @return {Array<Number>} 世界坐标 */ screenToWorld(x: number, y: number): number[]; /** * 摄像机自适应 * @param {Object} param 参数列表 * @param {THING.BaseObject} param.object 观察的物体 * @param {Array<Number>} param.offset? 离目标点的偏移量(根据目标的坐标系进行偏移) * @param {Number} param.radius? 目标点半径 * @param {Number} param.radiusFactor? 目标点半径倍数 */ fit(param: { object: BaseObject; "offset?": number[]; "radius?": number; "radiusFactor?": number; }): void; /** * 停止飞行 */ stopFlying(): void; /** * 摄像机飞行到某位置 * @param {Object} param 参数列表 * @param {Number} param.time? 飞行过程的时间 * @param {THING.BaseObject} param.object 观察的物体 * @param {Array<Number>} param.target 观察的目标点位置 * @param {Array<Number>} param.position? 摄像机位置 * @param {Array<Number>} param.up? 摄像机up朝向 * @param {Array<Number>} param.offset? 离目标点的偏移量(根据目标的坐标系进行偏移) * @param {Number} param.yAngle? Y 轴角度值 * @param {Number} param.xAngle? X 轴角度值 * @param {Number} param.radius? 目标点半径 * @param {Number} param.radiusFactor? 目标点半径倍数 * @param {THING.LerpType} param.lerpType? 插值方式 * @param {THING.LerpType} param.positionLerp? 摄像机坐标插值方式 * @param {THING.LerpType} param.targetLerp? 观察点插值方式 * @param {THING.LerpType} param.upLerp? up朝向插值方式 * @param {Function} param.complete? 飞行结束回调函数 * @example * // 跳转到物体 * app.camera.flyTo({ * 'time': 1500, * 'object': obj, * 'position':[0, 0, 0] * 'complete': function() { * } * }); * // 跳转到位置 * app.camera.flyTo({ * 'time': 1500, * 'position': [3.6, 4.8, -6.5], * 'target': [-4.2, -3.2, -20.6], * 'complete': function() { * } * }); */ flyTo(param: { "time?": number; object: BaseObject; target: number[]; "position?": number[]; "up?": number[]; "offset?": number[]; "yAngle?": number; "xAngle?": number; "radius?": number; "radiusFactor?": number; "lerpType?": LerpType; "positionLerp?": LerpType; "targetLerp?": LerpType; "upLerp?": LerpType; "complete?": ()=>any; }): void; /** * 看物体或位置 * @param {Array|THING.BaseObject} target 物体或者坐标 * @example * // 跳转到物体 * app.camera.lookAt(app.query('car01')[0]); * app.camera.lookAt([20, 5.6, -6.6]); */ lookAt(target: any[] | BaseObject): void; /** * 停止环绕旋转 */ stopRotateAround(): void; /** * 环绕旋转 * @param {Object} params 参数列表 * @param {THING.BaseObject} params.object? 围绕的物体 * @param {Array<Number>} params.target? 围绕的世界坐标点 * @param {Number} params.yRotateAngle? Y 轴旋转角度 * @param {Number} params.xRotateAngle? X 轴旋转角度 * @param {Number} params.time? 处理时间(毫秒) * @param {String} params.loopType? 循环类型 * @param {Function} params.complete? 旋转完成回调函数 * @example * app.camera.rotateAround({ * object: car, // 环绕物体 * time: 5000, // 环绕时间(毫秒) * yRotateAngle: 180, // 旋转角度 * }); */ rotateAround(params: { "object?": BaseObject; "target?": number[]; "yRotateAngle?": number; "xRotateAngle?": number; "time?": number; "loopType?": string; "complete?": ()=>any; }): void; /** * 跟随物体 * @param {Object} params 参数列表 * @param {THING.BaseObject} params.object 要跟随的物体 * @param {Boolean} params.enableRotate? 是否禁用旋转操作 * @param {Boolean} params.enableZoom? 是否禁用缩放操作 */ followObject(params: { object: BaseObject; "enableRotate?": boolean; "enableZoom?": boolean; }): void; /** * 停止跟随物体 */ stopFollowingObject(): void; /** * 向前/向后移动摄像机 * @param {Number} distance 移动距离(+: 向前, -: 向后) * @param {Number} time 移动时间(毫秒) */ zoom(distance: number, time?: number): void; /** * 移动摄像机 * @param {Number} deltaX 水平移动距离 * @param {Number} deltaY 垂直移动距离 */ move(deltaX: number, deltaY: number): void; /** * 根据物体包围盒检测是否在摄相机视锥内 * @param {THING.BaseObject} object 物体 * @return {Boolean} */ isInView(object: BaseObject): boolean; /** * 设置2D/3D视图 * @type {Number} */ viewMode: number; /** * 获取摄像机投影类型 * @type {String} */ projectionType: string; /** * 设置摄像机插值因子,数值越小插值效果越明显 * @type {Number} */ dampingFactor: number; /** * 设置摄像机FOV * @type {Number} */ fov: number; /** * 设置近裁剪面的距离,比这个距离近的物体将不会被看到 * @type {Number} */ near: number; /** * 设置远裁剪面的距离,超过这个距离的物体将不会被看到 * @type {Number} */ far: number; /** * 设置摄像机缩放系数范围[最小值, 最大值] * @type {Array<Number>} */ zoomLimited: number[]; /** * 设置摄像机距离范围[最小值, 最大值] * @type {Array<Number>} */ distanceLimited: number[]; /** * 设置摄像机垂直角度范围[最小值, 最大值] * @type {Array<Number>} */ yAngleLimited: number[]; /** * 设置摄像机水平角度范围[最小值, 最大值] * @type {Array<Number>} */ xAngleLimited: number[]; /** * 设置摄像机键盘平移速度 * @type {Number} */ keyPanSpeed: number; /** * 设置摄像机鼠标平移速度 * @type {Number} */ mousePanSpeed: number; /** * 获取当前和观察点的距离 * @type {number} */ distance: number; /** * 设置摄像机 UP 方向 * @type {Array<number>} */ up: number[]; /** * 设置摄像机 镜头位置(眼睛位置) * @type {Array<number>} */ position: number[]; /** * 设置摄像机 看点位置 * @type {Array<number>} */ target: number[]; /** * 开启/关闭摄像机操作 * @type {Boolean} */ inputEnabled: boolean; /** * 设置旋转生效 * @type {Boolean} */ enableRotate: boolean; /** * 设置缩放生效 * @type {Boolean} */ enableZoom: boolean; /** * 设置平移生效 * @type {Boolean} */ enablePan: boolean; /** * 获取是否在飞行 * @type {Boolean} */ flying: boolean; /** * 打印当前镜头位置和看点位置信息 */ log(): void; } /** * @class Mathics * 数学类 * @author WJH 2018.09.12 * @memberof THING */ class Mathics { constructor(); /** * 判断数值是否2次幂 * @param {Number} num 数值 * @return {Boolean} */ isPowerOf2(num: number): boolean; /** * 向上取数值的2次幂 * @param {Number} v 数值 * @return {Number} */ roundUpPowerOf2(v: number): number; /** * 数值取整 * @param {Number} n 数值 * @return {Number} */ toInteger(n: number): number; /** * 数值截取[最小值, 最大值] * @param {Number} value 数值 * @param {Number} min 最小值 * @param {Number} max 最大值 * @return {Number} */ clamp(value: number, min: number, max: number): number; /** * 获取随机浮点数值[最小值, 最大值] * @param {Number} min 最小值 * @param {Number} max 最大值 * @return {Number} */ randomFloat(min: number, max: number): number; /** * 获取随机整数数值[最小值, 最大值] * @param {Number} min 最小值 * @param {Number} max 最大值 * @return {Number} */ randomInt(min: number, max: number): number; /** * 获取随机颜色 * @return {Number} */ randomColor(): number; /** * 从数组随机挑选出任一元素 * @param {Array<*>} arr 数组 * @return {*} 元素 */ randomFromArray(arr: any[]): any; /** * 产生随机下标值 [0, number - 1] * @param {Number} number 总数 * @return {Number} */ randomIndex(number: number): number; /** * 随机产生坐标信息 * @return {Array<Number>} */ randomVector3(): number[]; /** * 线性插值 * @param {Number} start 起始值 * @param {Number} end 终止值 * @param {Number} percent 百分比(0~1) * @return {Number} */ lerp(start: number, end: number, percent: number): number; /** * 获取两点间距离 * @param {Array<Number>} v1 第一个坐标点 * @param {Array<Number>} v2 第二个坐标点 * @return {Number} */ getDistance(v1: number[], v2: number[]): number; /** * 角度转弧度 * @param {Number} degrees 角度 * @return {Number} */ degToRad(degrees: number): number; /** * 弧度转角度 * @param {Number} radians 弧度 * @return {Number} */ radToDeg(radians: number): number; /** * 生成唯一的 UUID * @return {String} */ generateUUID(): string; /** * 坐标相加 * @param {Array<Number>} v1 坐标 * @param {Array<Number>} v2 坐标 * @return {Array<Number>} */ addVector(v1: number[], v2: number[]): number[]; /** * 坐标相减 * @param {Array<Number>} v1 坐标 * @param {Array<Number>} v2 坐标 * @return {Array<Number>} */ subVector(v1: number[], v2: number[]): number[]; /** * 向量数乘 * @param {Array<Number>} v 坐标 * @param {Number} scale 缩放系数 * @return {Array<Number>} */ scaleVector(v: number[], scale: number): number[]; /** * 向量点乘 * @param {Array<Number>} v1 坐标 * @param {Array<Number>} v2 坐标 * @return {Number} */ dotVector(v1: number[], v2: number[]): number; /** * 向量叉乘 * @param {Array<Number>} v1 坐标 * @param {Array<Number>} v2 坐标 * @return {Number} */ crossVector(v1: number[], v2: number[]): number; /** * 坐标取负 * @param {Array<Number>} v 坐标 * @return {Array<Number>} */ negVector(v: number[]): number[]; /** * 求单位向量 * @param {Array<Number>} v 坐标 * @return {Array<Number>} */ normalizeVector(v: number[]): number[]; /** * 获取最小值 * @param {Array<Number>} positions 坐标列表 * @return {Array<Number>} */ minVector(positions: number[]): number[]; /** * 获取最大值 * @param {Array<Number>} positions 坐标列表 * @return {Array<Number>} */ maxVector(positions: number[]): number[]; /** * 获取向量长度 * @param {Array<Number>} v 坐标 * @return {Number} */ getVectorLength(v: number[]): number; /** * 获取向量长度 * @param {Array<Number>} v 坐标 * @return {Number} */ getVectorLengthSquared(v: number[]): number; /** * 获取面积 * @param {Array<Number>} positions 坐标列表 * @return {Number} */ getArea(positions: number[]): number; /** * 返回小数部分 * @param {Number} x 数值 * @return {Number} */ fract(x: number): number; /** * 交换数组元素位置 * @param {Array} arr 数组 * @param {Number} index1 第一个元素位置 * @param {Number} index2 第二个元素位置 * @return {Array} */ swapArray(arr: any[], index1: number, index2: number): any[]; /** * 获取 v2 到 v1 的方向向量 * @param {Array<Number>} v1 起点 * @param {Array<Number>} v2 终点 * @return {Array<Number>} */ getDirection(v1: number[], v2: number[]): number[]; } /** * @class Navigation * 导航寻路 * @memberof THING */ class Navigation { constructor(); /** * 获取导航路径 * @param {Object} params 参数列表 * @param {String} params.startRoom? 起始房间,可以只提供世界坐标,但是同时提供房间的话,会提高寻路速度 * @param {Array<Number>} params.startPosition 起始的世界坐标位置 * @param {String} params.endRoom? 终止房间,可以只提供世界坐标,但是同时提供房间的话,会提高寻路速度 * @param {Array<Number>} params.endPosition 终止的世界坐标位置 * @return {Array<Number>} 路径节点(世界坐标集合), null 表示起始点和终止点之间不可达 */ findPath(params: { "startRoom?": string; startPosition: number[]; "endRoom?": string; endPosition: number[]; }): number[]; } /** * @class Picker * 主要为支持gpu picker,同时兼容支持threejs的raycast * @author larrow 2017.12.2 * @memberof THING */ class Picker { constructor(); /** * 检测当前帧的拾取物体是否发生了变化 * @return {Boolean} */ isChanged(): boolean; /** * 以当前摄像机的位置拾取物体, 按照距离从近到远返回物体列表信息 * @param {Number} x 屏幕x坐标 (不提供则使用当前摄影机位置进行拾取) * @param {Number} y 屏幕y坐标 (不提供则使用当前摄影机位置进行拾取) * @param {Number} width 区域宽度 (提供则表示进行框选) * @param {Number} height 区域高度 (提供则表示进行框选) * @param {THING.Selector} candidates 框选物体列表 * @return {Array<THING.BaseObject>} 物体列表 */ pickObjects(x: number, y: number, width: number, height: number, candidates: Selector): (BaseObject)[]; /** * 开启框选 * @param {Object} params 参数列表 * @param {Number} params.x 屏幕 x 坐标 * @param {Number} params.y 屏幕 y 坐标 * @param {Boolean} params.realTimePicking? 是否实时框选(速度较慢) * @param {Boolean} params.drawRegion? 是否绘制框选区域 */ startAreaPicking(params: { x: number; y: number; "realTimePicking?": boolean; "drawRegion?": boolean; }): void; /** * 结束框选 */ endAreaPicking(): void; /** * 开启/禁用拾取功能 * @type {Boolean} */ enable: boolean; /** * 查询是否开启了区域选择功能 * @type {Boolean} */ areaPicking: boolean; /** * 设置框选候选集合, 因为框选速度较慢,所以这里需要先提供一个框选的候选列表 * @type {THING.Selector} */ areaCandidates: Selector; /** * 设置拾取对象回调函数 * @type {Function} */ pickedResultFunc: ()=>any; /** * 获取当前拾取物体(忽略物体过滤处理) * @type {THING.Selector} */ results: Selector; /** * 获取当前拾取物体列表(执行物体过滤处理后) * @type {THING.Selector} */ objects: Selector; /** * 获取上一帧拾取物体列表(执行物体过滤处理后) * @type {THING.Selector} */ previousObjects: Selector; } /** * @class SceneLevel * 场景层次管理 * @author WJH 2018.08.14 * @memberof THING */ class SceneLevel { constructor(); /** * 改变场景层次 * @param {THING.BaseObject} object 跳转的物体,以此决定跳转层次 */ change(object: BaseObject): void; /** * 返回父层级 */ back(): void; /** * 返回当前层级 * @type {THING.BaseObject} */ current: BaseObject; /** * 返回之前的层级 * @type {THING.BaseObject} */ previous: BaseObject; } /** * @class SceneRoot * 场景根节点 * @memberof THING * @extends THING.BaseObject */ class SceneRoot extends BaseObject { constructor(); /** * 显示/隐藏场景 * @type {boolean} */ visible: boolean; /** * 获取默认园区 * @type {THING.Campus} */ defaultCampus: Campus; /** * 获取根节点下的物体 * @type {THING.Selector} */ things: Selector; /** * 获取园区数据 * @type {THING.Selector} */ campuses: Selector; /** * 开启/取消线框渲染方式 * @type {string|Number} 颜色值, null 表示关闭线框渲染模式 */ wireframeColor: string | number; } /** * @class Selection * 物体选择集合 * @author WJH 2018.11.20 * @memberof THING */ class Selection { constructor(); /** * 选择物体 * @param {THING.BaseObject} object 物体 */ select(object: BaseObject): void; /** * 取消选择物体 * @param {THING.BaseObject} object 物体 */ deselect(object: BaseObject): void; /** * 查询物体是否被选择 * @param {THING.BaseObject} object 物体 * @return {Boolean} */ has(object: BaseObject): boolean; /** * 清空选择物体 */ clear(): void; /** * 查询当前帧物体选择集合是否发生过改变 * @return {Boolean} */ isChanged(): boolean; /** * 获取当前帧选择物体集合 * @type {THING.Selector} */ objects: Selector; /** * 获取上一帧选择物体集合 * @type {THING.Selector} */ previousObjects: Selector; } /** * @class SelectorStyle * 物体效果处理集合 * @memberof THING */ class SelectorStyle { constructor(); /** * 设置渲染排序值 * @type {Number} */ renderOrder: number; /** * 设置颜色 * @type {Number|String} */ color: number | string; /** * 设置透明度(0~1) * @type {Number} */ opacity: number; /** * 设置勾边颜色 * @type {Number|String} */ outlineColor: number | string; /** * 设置默认勾边颜色 * @type {Number|String} */ defaultOutlineColor: number | string; /** * 忽略/禁用勾边 * @type {Boolean} */ skipOutline: boolean; /** * 开启/关闭线框模式 * @type {Boolean} */ wireframe: boolean; /** * 显示/隐藏自身坐标系 * @type {Boolean} */ axisHelper: boolean; /** * 显示/隐藏包围盒 * @type {Boolean} */ boundingBox: boolean; /** * 设置包围盒颜色 * @type {Number|String} */ boundingBoxColor: number | string; /** * 设置始终在最后渲染 * @type {Boolean} */ alwaysOnTop: boolean; /** * 设置外发光 * @type {Boolean} */ glow: boolean; /** * 设置内发光 * @type {Boolean} */ innerGlow: boolean; /** * 设置材质 * @param {Object} params 材质参数 */ setMaterial(params: any): void; } /** * @class Selector * 选择器 * @see http://api.jquery.com/category/traversing/ * @author larrow 2017.10.3 * @memberof THING */ class Selector { constructor(); /** * 物体查询 * @param {*} param 参数列表 * @return {Array<THING.BaseObject>} 查询结果,注意是以数组的方式提供,如果什么都没有找到就返回 [] * @example * app.query('car01') 查询名称为car01的对象 * app.query('.Thing') 查询类型为Thing的对象 * app.query('#001') 查询id为001的对象 * app.query('#id > 1000') 查询id>1000的对象,要求id为数值类型,不然无法识别出来 * app.query('[prop=value]') 查询id为001的对象,支持*属性模糊匹配[Group=Outside*] * app.query('.Thing|[prop=value]') 满足条件1 或条件2,... * 字符串部分参考:http://www.w3school.com.cn/jquery/jquery_ref_selectors.asp */ query(param: any): (BaseObject)[]; /** * 从当前查询结果中移除对象 * @param {*} */ remove(param: any): void; /** * 从当前查询结果中添加部分对象 * @param {*} param 参数列表 * @example * sel.add(sel).add('car01').add([obj1, obj2]).add(obj); */ add(param: any): void; /** * 从当前查询结果中排除部分对象 * @param {*} param 参数列表 * @example * 可以 .not(sel).not('car01').not([obj1, obj2]).not(obj); */ not(param: any): void; /** * 清空 */ clear(): void; /** * 遍历对象 * @param {Function} callback 回调函数 */ forEach(callback: ()=>any): void; /** * 转换成 JSON 字符串 */ toJSON(): void; /** * 转换成数组遍历对象 * @return {Array} 数组 */ toArray(): any[]; /** * 获取物体下标值 * @param {THING.BaseObject} object 物体 * @return {Number} 下标值, -1 表示不存在 */ indexOf(object: BaseObject): number; /** * 删除物体 * @param {Number} index 下标值 * @param {Number} number 删除总数 */ splice(index: number, number: number): void; /** * 反转数组 * @return {THING.Selector} */ reverse(): Selector; /** * 是否拥有此物体 * @param {THING.BaseObject} object 物体 * @return {Boolean} */ has(object: BaseObject): boolean; /** * 淡入 * @param {Object} param * @param {Number} param.time 淡入时间 * @param {Function} param.complete 完成回调 */ fadeIn(param: { time: number; complete: ()=>any; }): void; /** * 淡出 * @param {Object} param * @param {Number} param.time 淡出时间 * @param {Function} param.complete 完成回调 */ fadeOut(param: { time: number; complete: ()=>any; }): void; /** * 销毁选择器里的所有对象 */ destroyAll(): void; /** * 绑定事件 * @param {String} eventType 事件名称 * @param {String} selector 物体类型选择信息 * @param {Object} userData 事件绑定自定义数据, 如果是 Function 类型,也表示回调函数参数 * @param {Function} cb 事件触发的回调函数 * @param {String} tag? 事件名字标记 */ on(eventType: string, selector: string, userData: any, cb: ()=>any, tag?: string): void; /** * 解绑事件 * @param {String} eventType 事件名称 * @param {String} selector 物体类型选择信息 * @param {Function} cb 事件触发的回调函数 */ off(eventType: string, selector: string, cb: ()=>any): void; /** * 绑定事件(只触发一次) * @param {String} eventType 事件名称 * @param {String} selector 物体类型选择信息 * @param {Object} userData 事件绑定自定义数据, 如果是 Function 类型,也表示回调函数参数 * @param {Function} callback 事件触发的回调函数 * @param {String} tag? 事件名字标记 * @example * app.one('click', '.Building', function(ev) {...}); * app.one('click', '.Thing', {id: 1, hit: false}, function(ev) {...}); * app.one('update', function(ev) {...}); */ one(eventType: string, selector: string, userData: any, callback: ()=>any, tag?: string): void; /** * 发送事件 * @param {String} eventType 事件名称 * @param {Object} ev 事件信息 * @param {String} tag? 事件名字标记 */ trigger(eventType: string, ev: any, tag?: string): void; /** * 暂停事件响应 * @param {String} eventType 事件名称 * @param {String} selector 物体类型选择信息 * @param {String} tag? 事件名字标记 */ pauseEvent(eventType: string, selector: string, tag?: string): void; /** * 暂停事件响应(当前帧,下一帧恢复响应) * @param {String} eventType 事件名称 * @param {String} selector 物体类型选择信息 * @param {String} tag? 事件名字标记 */ pauseEventInFrame(eventType: string, selector: string, tag?: string): void; /** * 恢复事件响应 * @param {String} eventType 事件名称 * @param {String} selector 物体类型选择信息 * @param {String} tag? 事件名字标记 */ resumeEvent(eventType: string, selector: string, tag?: string): void; /** * 设置显示隐藏 * @type {Boolean} value 是否显示 */ visible: boolean; /** * 设置是否能被拾取 * @type {Boolean} value 是否能被拾取 */ pickable: boolean; /** * 获取效果集合 * @type {THING.SelectorStyle} */ style: SelectorStyle; } /** * @class Utils * 工具辅助类 * @memberof THING */ class Utils { constructor(); /** * 判断是否布尔值 * @memberof THING.Utils * @param {*} value js元素 * @return {boolean} */ static isBoolean(value: any): boolean; /** * 判断是否DOM元素 * @memberof THING.Utils * @param {*} value js元素 * @return {boolean} */ static isDom(value: any): boolean; /** * 判断是否空 * @memberof THING.Utils * @param {*} o js元素 * @return {boolean} */ static isNull(o: any): boolean; /** * 判断是否空白字符串 * @memberof THING.Utils * @param {*} o js元素 * @return {boolean} */ static isBlank(o: any): boolean; /** * 判断是否空结构体 * @memberof THING.Utils * @param {*} o js元素 * @return {boolean} */ static isEmptyObj(o: any): boolean; /** * 判断是否空数组 * @memberof THING.Utils * @param {*} o js元素 * @return {boolean} */ static isEmptyArray(o: any): boolean; /** * 字符串转成小写 * @memberof THING.Utils * @param {string} s 字符串 * @return {string} */ static toLowerCase(s: string): string; /** * 成员键值全部转换成小写 * @memberof THING.Utils * @param {Object} input 要处理的 js 对象 * @param {Boolean} deep 是否需要转换所有的键值 * @param {Function} filter 键值过滤函数 * @return {Object} */ static objectKeysToLowerCase(input: any, deep: boolean, filter: ()=>any): any; /** * 生成唯一的 UUID * @return {String} */ static generateUUID(): string; /** * 克隆对象 * @memberof THING.Utils * @param {Object} obj js对象 * @param {Boolean} shallow 是否进行浅层克隆, 如果是 false 则会完全进行克隆处理 * @return {Object} */ static cloneObject(obj: any, shallow: boolean): any; /** * 合并简单对象 * @memberof THING.Utils * @param {object} target 目标结构体 * @param {object} source 源结构体 * @param {boolean} overwrite 是否更新已经存在的属性 * @return {object} */ static mergeObject(target: object, source: object, overwrite: boolean): object; /** * 判断结构体是否完全相等 * @memberof THING.Utils * @param {Object} o1 第一个结构体 * @param {Object} o2 第二个结构体 * @return {Boolean} */ static isEqual(o1: any, o2: any): boolean; /** * 异步加载 css文件、js文件、文本文件(html、text、json) * @memberof THING.Utils * @param {String|Array<String>} urls 文件路径 * @param {Function} callback 加载完成后回调方法 * @return {Object} */ static dynamicLoad(urls: string | string[], callback: ()=>any): any; /** * 添加物体类型转换规则 * @param {String} type 物体类名 * @param {String} condition 转换条件, 比如使用 /name/ 进行正则表达式匹配,能匹配上的才能进行转换 * @param {String} params? 新类型默认创建参数, 在转换成新类型后,会成为替换创建参数列表 * @example * 1. 我们想把 id 为 1 的物体转换成 '.Cabinet' 类型,则可以通过以下接口实现 * THING.Utils.addCastType('Cabinet', '#1'); * 2. 我们想把名字包含 'spotLight' 的物体都转换成 '.Cabinet' 类型,则可以通过以下接口实现 * THING.Utils.addCastType('Cabinet', /spotLight/); * 调用之后在场景加载的过程中,符合条件的物体都会以指定的类型创建 */ static addCastType(type: string, condition: string, params?: string): void; /** * 删除物体类型转换规则 * @param {String} type 物体类名 * @param {String} condition 转换条件 * @param {String} params? 新类型默认创建参数 */ static removeCastType(type: string, condition: string, params?: string): void; /** * 异步执行函数 * @param {Function} callback 回调函数 * @example * THING.Utils.runAsync(function() { * // ... * }); */ static runAsync(callback: ()=>any): void; } /** * @class Version * 标记封装类 * @author WJH 2018.09.12 * @memberof THING */ class Version { constructor(); } /** * 摄像机类型 * @enum {String} * @readonly * @memberof THING */ const enum CameraProjectionType { /** * 投影方式 */ Perspective, /** * 正交方式 */ Orthographic, } /** * 摄像机类型,用于摄像机2D/3D视角切换 * @enum {String} * @readonly * @memberof THING */ const enum CameraView { /** * 正常视角 */ Normal, /** * 顶部视角 */ TopView, /** * 左边视角(未实现) */ LeftView, /** * 右边视角(未实现) */ RightView, /** * 前视角(未实现) */ FrontView, /** * 后视角(未实现) */ BackView, } /** * 插值类型 * @typedef {Object} LerpType * @property {Object} Linear 线性插值 * @property {Function} Linear.None 线性插值 * @property {Object} Quadratic 二次插值 * @property {Function} Quadratic.In 二次插值(In) * @property {Function} Quadratic.Out 二次插值(In) * @property {Function} Quadratic.InOut 二次插值(InOut) * @property {Object} Cubic 三次曲线插值 * @property {Function} Cubic.In 三次插值(In) * @property {Function} Cubic.Out 三次插值(In) * @property {Function} Cubic.InOut 三次插值(InOut) * @property {Object} Quartic 四次插值 * @property {Function} Quartic.In 四次插值(In) * @property {Function} Quartic.Out 四次插值(In) * @property {Function} Quartic.InOut 四次插值(InOut) * @property {Object} Quintic 五次插值 * @property {Function} Quintic.In 五次插值(In) * @property {Function} Quintic.Out 五次插值(In) * @property {Function} Quintic.InOut 五次插值(InOut) * @property {Object} Sinusoidal 正弦曲线插值 * @property {Function} Sinusoidal.In 正弦曲线插值(In) * @property {Function} Sinusoidal.Out 正弦曲线插值(In) * @property {Function} Sinusoidal.InOut 正弦曲线插值(InOut) * @property {Object} Exponential 指数插值 * @property {Function} Exponential.In 指数插值(In) * @property {Function} Exponential.Out 指数插值(In) * @property {Function} Exponential.InOut 指数插值(InOut) * @property {Object} Circular 迂回插值 * @property {Function} Circular.In 迂回插值(In) * @property {Function} Circular.Out 迂回插值(In) * @property {Function} Circular.InOut 迂回插值(InOut) * @property {Object} Elastic 弹性插值 * @property {Function} Elastic.In 弹性插值(In) * @property {Function} Elastic.Out 弹性插值(In) * @property {Function} Elastic.InOut 弹性插值(InOut) * @property {Object} Back Back 插值 * @property {Function} Back.In Back 插值(In) * @property {Function} Back.Out Back 插值(In) * @property {Function} Back.InOut Back 插值(InOut) * @property {Object} Bounce 弹跳插值 * @property {Function} Bounce.In 弹跳插值(In) * @property {Function} Bounce.Out 弹跳插值(In) * @property {Function} Bounce.InOut 弹跳插值(InOu