API
init
快速初始化,并返回相机、场景、渲染器等对象和添加鼠标控制、获取鼠标点击对象等方法
示例
import lec3d from "@trickle/lec3d";
const { scene, renderer, camera, mountTo, refresh, addControls } = lec3d.init({
axesHelperConfigs: {
length: 10000,
},
});
mountTo(yourElement);
参数
params
: 配置项,所有内容都是可选的,具体定义如下:
type InitParams = {
/** 光照配置 */
lightConfigs?: {
// 统一控制所有光照颜色,优先级较低
color?: number | string;
// 统一控制所有光照透明度,优先级较低
colorOpacity?: number;
// 环境光
ambientLightColor?: number | string;
ambientLightColorOpacity?: number;
// 直射光
directLightColor?: number | string;
directLightColorOpacity?: number;
};
/** 相机配置 */
cameraConfigs?: {
width?: number;
height?: number;
position?: {
x: number;
y: number;
z: number;
};
lookAt?: {
x: number;
y: number;
z: number;
};
};
/** 辅助坐标系配置 */
axesHelperConfigs?: {
// 坐标轴长度
length?: number;
};
/** 渲染器配置 */
rendererConfigs?: {
width?: number;
height?: number;
backgroundColor?: number | string;
backgroundColorOpacity?: number;
};
} | null;
返回值
type InitReturns = {
// 渲染器
renderer: Renderer;
// 相机
camera: Camera;
// 场景
scene: Scene;
// 挂载函数,用于创建 canvas 绘制 3d 场景
mountTo: (el: HTMLElement) => void;
// 刷新函数,用于特殊场景下的手动刷新,一般情况不会用到
refresh: () => void;
// 添加鼠标控制,可以通过返回的控制对象进一步配置
addControls: (params: AddControlsParams) => AddControlsParams;
// 鼠标点击,返回值的第0个元素即鼠标选中的模型对象
getClickEventTargets: (
e: MouseEvent
) => Intersection<Object3D<Object3DEventMap>>[];
};
initCss3d
创建 css 3d 内容,主要分为
对象
和精灵
两种:
对象
: 能够被鼠标操作缩放,不被模型遮挡,能够通过DOM操作获取
精灵
: 不能被鼠标操作缩放,可以被模型遮挡,能够通过射线拾取(可以粗略理解为鼠标点击操作获取)
示例
参数
initCss3dParams
: 配置项,定义如下:
type InitCss3dParams = {
scene: Scene;
camera: Camera;
};
返回值
type InitCss3dReturns = {
// 手动刷新
refresh: () => void;
// 挂载 canvas 元素
mountTo: (element: HTMLElement) => void;
// 创建 css 3d 对象
createCss3dObject: ({ element }: CreateCss3dObjectParams) => CSS3DObject;
// 创建 css 3d 精灵
createCss3dSprite: ({ element }: CreateCss3dObjectParams) => CSS3DSprite;
// 创建 3d 文字
createText: ({
text,
color,
fontSize,
thickness,
position,
}: CreateTextParams) => THREE.Mesh<
TextGeometry,
THREE.MeshBasicMaterial,
THREE.Object3DEventMap
>;
};
interface CreateTextParams {
text: string;
color?: number | string;
fontSize?: number;
thickness?: number;
position?: {
x: number;
y: number;
z: number;
};
}
initCss2d
创建 css 2d 内容,其特点是:
不能被鼠标操作缩放,默认情况下不被模型遮挡,能够通过DOM操作获取
但是 lec3d 提供了配置项,能够控制其是否被模型遮挡
示例
参数
intCss2dParams
: 配置项,定义如下:
type InitCss2dParams = {
scene: Scene;
camera: Camera;
};
返回值
type InitCss2dReturns = {
refresh: () => void;
mountTo: (element: HTMLElement) => void;
// 创建 css 2d 对象
createCss2dObject: (params: CreateCss2dObjectParams) => CSS2DObject;
};
interface CreateCss2dObjectParams {
// 内容
content: string | HTMLElement;
// css 样式属性
style: Record<string, any>;
// 是否可被模型遮挡
occludable: boolean;
}
loadGLTF
导入 GLTF 模型文件, 并做相关配置
示例
import lec3d from "@trickle/lec3d";
const { scene } = lec3d.init();
lec3d.loadGLTF({
modelPath: "3d_model/scene.gltf",
options: {
scale: 30,
position: {
x: 100,
y: 100,
},
rotation: {
x: "30", // 字符串数字代表角度,即 30 度
z: -0.5,
},
},
callback: (gltf, model) => {
scene.add(model);
},
});
参数
loadGLTFparams
: 配置项,定义如下:
type LoadGLTFParams = {
// 模型文件路径
modelPath: string;
// 模型文件配置
options?: CommonModelOptions;
callback?: (gltf: GLTF, model: THREE.Group<THREE.Object3DEventMap>) => void;
};
interface CommonModelOptions {
// 模型缩放
scale?: number;
// 模型的名字
name?: string;
// 模型位置
position?: {
x?: number;
y?: number;
z?: number;
};
// 模型旋转角度,使用字符串则为角度值,使用数字则为弧度值
// 如 '30' 代表 30 度, 30 代表 180*30/PI 度
rotation?: {
x?: number | string;
y?: number | string;
z?: number | string;
};
}
返回值
type LoadGLTFReturns = void;