Skip to content

通用模型

支持格式

支持的格式有 sbm、gltf (glb)、fbx、sbmx

loadModel

加载 model 模型。

样例:

定义:

ts
interface ModelInfo extends BaseObject3DInfo, ObjectEvents<Model> {
  url: string;
}

function loadModel(modelInfo: ModelInfo, parent?: Object3D | null): Promise<Model | null>;

用法:

js
//

ssp
  .loadModel({
    id: 'xx',
    name: 'xx',
    url: 'xx/x.fbx',
    level: {
      max: 1000,
      min: null,
    },
    position: { x: 0, y: 0, z: 0 },
    rotation: { x: 0, y: 0, z: 0 },
    scale: { x: 2, y: 2, z: 2 },
    onClick(e) {
      /**
       * 对象的独立事件触发后,默认不传播(类似 DOM 的事件冒泡)到全局事件,
       * 调用 eventPropagation 方法通知事件继续传播到全局。
       *
       * warn:
       *  在 **非箭头函数** 中参数 e 与 this 的指向都是当前模型对象,
       *  在 *箭头函数** 参数 e 依然是模型对象,但 this 指向会发生改变。
       */
      this.eventPropagation();

      console.log('模型自身的点击事件触发', this);
    },
    onDblClick: (e) => {
      /**
       * 这里模拟在 **箭头函数** 中
       */
      e.eventPropagation();

      console.log('模型自身的双击事件触发', e);
    },
    userData: {},
  })
  .then((model) => console.log(model))
  .catch((err) => console.error(err));

//

const model = await ssp.loadModel(
  {
    id: 'xx',
    url: './xx.glb',
  },
  null // 父级对象, null 表示模型不会添加到场景中
);

// 添加到场景中
ssp.addObject(model);

参数:

modelInfo

  • 描述: 实例 Model 对象所需信息
  • 类型: ModelInfo
  • 必填:
ModelInfo
属性描述类型必填默认值
id唯一IDstring | number
name名称string
url资源路径string
level显示层级范围Level{ max: null, min: null }
visible是否可见booleantrue
position位置坐标Position{ x: 0, y: 0, z: 0 }
rotation旋转弧度Rotation{ x: 0, y: 0, z: 0 }
scale缩放比例Scale{ x: 1, y: 1, z: 1 }
userData用户数据any{}
onClick左键单击事件(object: Model) => voidnull
onDblClick左键双击事件(object: Model) => voidnull
onRightClick右键单击事件(object: Model) => voidnull
onLoad加载完成事件(object: Model) => voidnull

parent

  • 描述: 父级对象,默认被添加在 scene
  • 类型: Object3D | null
  • 必填:

cloneModel

克隆 Model 模型

定义:

ts
interface CloneModelInfo extends Omit<ModelInfo, 'url'> {}

function cloneModel(model: Model, modelInfo: CloneModelInfo, parent?: BaseObject3D | null): Promise<Model>;

用法:

js
const clonedModel = await ssp.cloneModel(model, {
  id: 'clone_model',
  position: {
    x: 100,
    y: 0,
    z: 0,
  },
});

参数:

model

  • 描述: Model 对象
  • 类型: Model
  • 必填:

modelInfo

ModelInfo, 但不需要字段 url

parent

  • 描述:Model 克隆到的 parent
  • 类型: Model
  • 必填:

getModelById

通过 id 查找

定义:

ts
function getModelById(id: ModelInfo['id']): Model | null;

用法:

js
const model = ssp.getModelById('xxx');

弃用警告

请使用 getObjectById 替代

getModelByName

通过 name 查找

定义:

ts
function getModelByName(name: string): Model[];

用法:

js
const modelList = ssp.getModelByName('xxx');

弃用警告

请使用 getObjectByName 替代

getAllModel

获取所有 Model 对象

定义:

ts
function getAllModel(): Model[];

用法:

js
const allModelList = ssp.getAllModel();

getModelByUserDataProperty

通过 userData 属性查找

定义:

ts
function getModelByUserDataProperty(propNameOrFindFunc: string | UserDataPropertyFindFunc, value?: any): Model[];

用法:

js
const modelList = ssp.getModelByUserDataProperty('propKey''propVal')
// or
const modelList = ssp.getModelByUserDataProperty(item => item['itemPropKey'] === 'itemPropVal')

参数:

propNameOrFindFunc

  • 描述: userData 内属性名 或 find 函数
  • 类型: string | function
  • 必填:

propValue

  • 描述: userData 内属性值。
  • 类型: any
  • 必填:

find 函数使用场景

js
model.userData = {
  people: {
    name: 'xiaoming',
    age: 18,
  },
};
const modelList = ssp.getModelByUserDataProperty((userData) => userData?.people?.name === 'xiaoming');

弃用警告

请使用 getObjectByUserDataProperty 替代

removeModelById

通过 id 移除

定义:

ts
function removeModelById(id: ModelInfo['id']): boolean;

用法:

js
ssp.removeModelById('xxx');

弃用警告

请使用 removeObjectById 替代

loadModelToGroup

加载 model 到一个组内。

定义:

ts
function loadModelToGroup(groupInfo: GroupInfo, modelInfoList: ModelInfo[]): Promise<Group>;

用法:

js
ssp
  .loadModelToGroup(
    // groupInfo
    {
      id: 'firstModelGroup',
      name: 'name_firstModelGroup',
      // ...
    },
    // modelInfoList
    [modelInfo1, modelInfo2, modelInfo3]
  )
  .then((group) => console.log(group));

参数

groupInfo

  • 描述: 实例组对象所需信息
  • 类型: GroupInfo
  • 必填:

modelInfoList

  • 描述: modelInfo 集合
  • 类型: modelinfo[]
  • 必填:

createGroupForModel

model 提前创建一个空组。

使用场景

loadModelToGroup 不同,有些时候可能你还没有具体的 modelInfo 数据,但你想提前创建一个批量管理的空组,当有数据时再使用 addModelForGroup 插入。

定义:

ts
function createGroupForModel(groupInfo: GroupInfo): Group;

用法:

js
ssp.createGroupForModel({
  id: 'firstModelGroup',
  name: 'name_firstModelGroup',
  // ...
});

参数

groupInfo

  • 描述: 实例组对象所需信息
  • 类型: GroupInfo
  • 必填:

弃用警告

请使用 createGroup 替代

addModelForGroup

向一个已经存在的组内添加 model 对象。

定义:

ts
function addModelForGroup(groupId: GroupInfo['id'], modelInfoList: ModelInfo[]): Promise<Group | null>;

用法:

js
ssp
  .addModelForGroup(
    // groupId
    'firstModelGroup',
    // modelInfoList
    [modelInfo4, modelInfo5]
  )
  .then((group) => console.log(group));

参数

groupId

  • 描述:id
  • 类型: groupId[‘id’]
  • 必填:

modelInfoList

  • 描述: modelInfo 集合
  • 类型: modelinfo[]
  • 必填:

getModelGroupById

通过 id 查找 model

定义:

ts
function getModelGroupById(id: GroupInfo['id']): Group | null;

用法:

js
const group = ssp.getModelGroupById('firstModelGroup');

弃用警告

请使用 getObjectById 替代

getModelGroupByName

通过 name 查找 model

定义:

ts
function getModelGroupByName(name: string): Group[];

用法:

js
const groupList = ssp.getModelGroupByName('name_firstModelGroup');

弃用警告

请使用 getObjectByName 替代

getAllModelGroup

获取所有 Model 对象组

定义:

ts
function getAllModelGroup(): Group[];

用法:

js
const allModelGroupList = ssp.getAllModelGroup();

弃用警告

请使用 getAllGroup 替代

removeModelGroupById

通过 id 移除 model

定义:

ts
function removeModelGroupById(id: GroupInfo['id']): boolean;

用法:

js
const isRemoveSuccess = ssp.removeModelGroupById('firstModelGroup');

弃用警告

请使用 removeObjectById 替代

clearModel

清除当前场景内所有 model 对象。

定义:

ts
function clearModel(): void;

用法:

js
ssp.clearModel();

showAllModel

显示当前场景内所有 model 对象。

定义:

ts
function showAllModel(): void;

用法:

js
ssp.showAllModel();

hideAllModel

隐藏当前场景内所有 model 对象。

定义:

ts
function hideAllModel(): void;

用法:

js
ssp.hideAllModel();

playModelAnimation

播放模型动画。

定义:

ts
interface ModelAnimationFindFunc {
  (animation: AnimationClip, index: number, animations: AnimationClip[]): boolean;
}

function playModelAnimation(
  model: Model,
  animation: number | AnimationClip | ModelAnimationFindFunc
): AnimationAction | undefined;

用法:

js
const model = ssp.getObjectById('xxxx');

// number
const action = ssp.playModelAnimation(model, 0);
// or AnimationClip
ssp.playModelAnimation(model, model.animations[0]);
// or ModelAnimationFindFunc
ssp.playModelAnimation(model, (itemAnimation) => itemAnimation.name === 'run');

提示

返回的 action 对象请参考 three.js AnimationAction

参数:

model

  • 描述: 模型对象
  • 类型: Model
  • 必填:

animation

  • 描述: 动画信息
  • 类型: number | AnimationClip | ModelAnimationFindFunc
  • 必填:

stopModelAnimation

停止模型动画。

定义:

ts
function stopModelAnimation(model: Model, animation: number | AnimationClip | ModelAnimationFindFunc): void;

用法:

js
const model = ssp.getObjectById('xxxx');

// number
ssp.stopModelAnimation(model, 0);
// or AnimationClip
ssp.stopModelAnimation(model, model.animations[0]);
// or ModelAnimationFindFunc
ssp.stopModelAnimation(model, (itemAnimation) => itemAnimation.name === 'run');

参数:

model

  • 描述: 模型对象
  • 类型: Model
  • 必填:

animation

  • 描述: 动画信息
  • 类型: number | AnimationClip | ModelAnimationFindFunc
  • 必填:

setModelDracoDecoderPath

设置模型的 DRACO 解压库路径

定义:

ts
function setModelDracoDecoderPath(path: string): void;

用法:

js
ssp.setModelDracoDecoderPath('/draco/');

提示

draco 目录在 node_modules/three/examples/jsm/libs

然后将 draco 目录拷贝至所在项目的静态资源目录中,一般是 public 目录

setModelKtx2DecoderPath

设置模型的 KTX2 贴图解压库路径

定义:

ts
function setModelKtx2DecoderPath(path: string): void;

用法:

js
ssp.setModelKtx2DecoderPath('/basis/');

提示

basis 目录在 node_modules/three/examples/jsm/libs

然后将 basis 目录拷贝至所在项目的静态资源目录中,一般是 public 目录

computeModelsBoundsTree

计算所有 model 的 BVH

调用此方法可减少控制器、模型事件的计算时间

需要在模型加载完成后调用此方法

定义:

ts
type ModelsBoundsTreeOptions = {
  /**
   * block 为阻塞计算,slice 为每帧分片计算,worker 使用 Worker 计算
   */
  type?: 'block' | 'slice' | 'worker';
  force?: boolean;
  frameSliceCount?: number;
  workerCreator?: () => Worker;
};

function computeModelsBoundsTree(options?: ModelsBoundsTreeOptions): Promise<void>;

用法:

js
await ssp.loadModel({
  id: 'model',
  url: 'xxxx',
});

ssp.computeModelsBoundsTree({
  type: 'slice',
  force: false,
  frameSliceCount: 1000,
});

参数:

options

  • 描述: 配置选项
  • 类型: ModelsBoundsTreeOptions
  • 必填:
ModelsBoundsTreeOptions
属性描述类型必填默认值
type计算的类型block | slice | workerslice
force是否强制重新计算booleanfalse
frameSliceCount配合 `slice` 使用,每帧的几何结构计算数量boolean500
workerCreator配合 `worker` 使用,请参考下方示例() => Worker

Worker 示例

js
function workerCreator() {
  const worker = new Worker(
    new URL(
      /**
       * 路径填写 generateBVH.worker.js 文件相对于当前文件的位置
       * 可以填写 node_modules 中的相对路径或将文件拷贝至项目的 src 目录中
       */
      './xx/xx/generateBVH.worker.js',
      import.meta.url
    ),
    { type: 'module', name: 'ssp-bvh-worker' }
  );

  return worker;
}

ssp.computeModelsBoundsTree({
  type: 'worker',
  workerCreator,
});

文件位于 node_modules/soonspacejs/dist/generateBVH.worker.js

注意

使用 workerCreator 时需要项目的构建工具支持 new Worker() 语法

Webpack5Vite 中无需特殊处理

如果你使用的是 Webpack4,你可能需要 worker-loader

setTexture

给 mesh 设置纹理贴图,可设置 图片、Cavans 元素、视频 等。

备注:它会恢复原材质中除了贴图之外的所有配置,以保证效果尽可能与原来材质一样。

定义:

ts
setTexture ( mesh: Mesh, image: string | HTMLImageElement | HTMLCanvasElement | HTMLVideoElement, options?: SetTextureOptions ): Texture

用法:

js
ssp.setTexture(mesh, 'http://xx.com/xx.png');

createFindObjectsInBoxNearPosition

创建用于 查找位置附近的 box 空间范围内的物体 的查找器。

当你来查找棱某个位置处 上、下、左、右、前、后 一定距离范围内的某类模型时,可以使用该方法。

定义:

ts
/**
 * 位置附近的对象查找器
 * @param position - 指定查找的位置
 * @returns 所有包含在指定空间的对象
 */
export type FindObjectsNearPosition = ( position: Vector3 ) => Object3D[]

/**
 * 盒子空间
 */
interface BoxSpace {
  top: number;
  bottom: number;
  left: number;
  right: number;
  front: number;
  back: number;
}


createFindObjectsInBoxNearPosition ( boxSpace: BoxSpace, objects: Object3D[] ): FindObjectsNearPosition

boxSpace

通过上、下、左、右、前、后来描述查找区域。

  • 类型:BoxSpace

objects

被查找的空间对象。只会从这些对象中进行查找。

  • 类型:Object3D

用法:

js
//合建一个查找器,需要指定查找的区域 和 从哪些对象中进行查找
const findObjectsNearPosition = ssp.createFindObjectsInBoxNearPosition(
  {
    top: 20,
    bottom: 20,
    left: 30,
    right: 40,
    front: 50,
    back: 60,
  },
  objArr
);

// 使用查找器查找指定位置附近区域的对象
const nearObjs = findObjectsNearPosition({ x: 100, y: 100, z: 100 });

createFindObjectsInSphereNearPosition

创建用于 查找位置附近的球形区域范围内的物体 的查找器

当你来查找某个位置处指定半径范围内的某类模型时,可以使用该方法。

定义:

ts
/**
 * 位置附近的对象查找器
 * @param position - 指定查找的位置
 * @returns 所有包含在指定空间的对象
 */
export type FindObjectsNearPosition = ( position: Vector3 ) => Object3D[]

/**
 * 创建用于 查找位置附近的球形区域范围内的物体 的查找器
 *
 * @param radius - 描述查找半径
 * @param objects - 所有需要被查找的对象
 * @returns 用于查找的函数
 */
createFindObjectsInSphereNearPosition ( radius: number, objects: Object3D[] ): FindObjectsNearPosition

radius

查找区域的半径

  • 类型:number

objects

被查找的空间对象。只会从这些对象中进行查找。

  • 类型:Object3D

用法:

js
//合建一个查找器,需要指定查找的区域 和 从哪些对象中进行查找
const findObjectsNearPosition = ssp.createFindObjectsInSphereNearPosition(20, objArr);

// 使用查找器查找指定位置附近区域的对象
const nearObjs = findObjectsNearPosition({ x: 100, y: 100, z: 100 });

createFindObjectsNearPath

创建用于 查找路径附近的范围内的物体 的查找器

当你来查找路径周围指定半径范围内的某类模型时,可以使用该方法。

定义:

ts
/**
 * 查找附近的对象
 * @param objs - 所有需要被查找的对象
 */
export type FindNearbyObjects = ( objs: Object3D[] ) => Object3D[]

/**
 *  创建用于 查找路径附近的范围内的物体 的查找器
 *
 * @param points - 描述路径的点
 * @param radius - 描述查找半径
 * @returns 用于查找的函数
 */
createFindObjectsNearPath ( points: Vector3[], radius: number ): FindNearbyObjects

points

组成路径的顶点

  • 类型:Vector3[]

radius

路径附近的查找区域的半径

  • 类型:number

用法:

js
//合建一个查找器,需要指定查找的区域 和 和被查找的路径
const findNearbyObjects = ssp.createFindObjectsNearPath(
  [
    { x: 0, y: 0, z: 0 },
    { x: 10, y: 0, z: 0 },
    { x: 10, y: 10, z: 0 },
    { x: 10, y: 10, z: 10 },
  ],
  20
);

// 使用查找器查找指定的对象集中进行查找
const nearObjs = findNearbyObjects({ x: 100, y: 100, z: 100 });

clearIdb

清空本地 indexedDB 模型缓存数据

定义:

ts
function clearIdb(): Promise<void>;

用法:

js
ssp.clearIdb().then(() => {
  console.log('本地数据已清空!!!');
});

手动清除 indexedDB 缓存

manual

浙ICP备16043491号