6.7.x 版本发布日志
npm install @realsee/five@6.7
five.load时,现在可选择追加或者替换。 并且在切换过程中,可以不再发生切换/锁定视角等妨碍用户持续操作的行为。 这方面的改动只要适用于多项目下,项目追加,分批次加载的情况。
FiveLoadOptions.mode 在控制 替换 / 追加项目// 替换项目
// mode: 'replace' 默认
five.load([parseWork(json1), parseWork(json2)], 'inherit', { mode: 'replace' });
// 追加项目
// mode: 'add'
five.load(parseWork(json2), 'inherit', { mode: 'add' });
注意事项:
workCode。 同一场景下,不允许出现两个相同的 workCode 的 Work。如果出现会报错处理。replace 替换的 Work 的 workCode 和当前场景中有一样的(相当于替换一个一样的 Work),则会保留之前的 Work 的模型,直接挂在到新 Work 上,而不是重新加载。state=inherit 的行为five.load(parseWork(json), 'inherit', { mode: 'add' });
当 state=inherit 时,在切换过程中,可以不再发生切换/锁定视角等妨碍用户持续操作的行为。
针对大项目,对 work 的 json。做精简优化,减少网络传输时间。并且增加灵活性。
通过模版的模式匹配减少重复内容。 panoram 中的 hash,index 等参数的重复度很高,对一样的内容可以通过这种方式减少文件长度。
Before:
"panorama": {
"count": 465,
"list": [
{
"index": 0,
"derived_id": 0,
"derived_id_str": "auto3d-light-vEY8Zp4lPlkZ7R9K_1735117678",
"up": "images/cube_2048/0/0fd265355dbb94cb22fb930e52dd3c19/0_u.jpg",
"down": "images/cube_2048/0/0fd265355dbb94cb22fb930e52dd3c19/0_d.jpg",
"left": "images/cube_2048/0/0fd265355dbb94cb22fb930e52dd3c19/0_l.jpg",
"right": "images/cube_2048/0/0fd265355dbb94cb22fb930e52dd3c19/0_r.jpg",
"front": "images/cube_2048/0/0fd265355dbb94cb22fb930e52dd3c19/0_f.jpg",
"back": "images/cube_2048/0/0fd265355dbb94cb22fb930e52dd3c19/0_b.jpg",
"size_list": [ 2048, 4096 ],
"tiles": [ 1, 2, 3 ],
},
{
"index": 1,
"derived_id": 0,
"derived_id_str": "auto3d-light-vEY8Zp4lPlkZ7R9K_1735117799",
"up": "images/cube_2048/1/a6ca1991fc6bdb2dbd1a1003d9f62394/1_u.jpg",
"down": "images/cube_2048/1/a6ca1991fc6bdb2dbd1a1003d9f62394/1_d.jpg",
"left": "images/cube_2048/1/a6ca1991fc6bdb2dbd1a1003d9f62394/1_l.jpg",
"right": "images/cube_2048/1/a6ca1991fc6bdb2dbd1a1003d9f62394/1_r.jpg",
"front": "images/cube_2048/1/a6ca1991fc6bdb2dbd1a1003d9f62394/1_f.jpg",
"back": "images/cube_2048/1/a6ca1991fc6bdb2dbd1a1003d9f62394/1_b.jpg",
"size_list": [ 2048, 4096 ],
"tiles": [ 1, 2, 3 ],
},
{
"index": 2,
"derived_id": 0,
"derived_id_str": "auto3d-light-vEY8Zp4lPlkZ7R9K_1735117912",
"up": "images/cube_2048/2/567f94406885bf06f5586d7972da2b5e/2_u.jpg",
"down": "images/cube_2048/2/567f94406885bf06f5586d7972da2b5e/2_d.jpg",
"left": "images/cube_2048/2/567f94406885bf06f5586d7972da2b5e/2_l.jpg",
"right": "images/cube_2048/2/567f94406885bf06f5586d7972da2b5e/2_r.jpg",
"front": "images/cube_2048/2/567f94406885bf06f5586d7972da2b5e/2_f.jpg",
"back": "images/cube_2048/2/567f94406885bf06f5586d7972da2b5e/2_b.jpg",
"size_list": [ 2048, 4096 ],
"tiles": [ 1, 2, 3 ],
},
{
"index": 3,
"derived_id": 0,
"derived_id_str": "auto3d-light-vEY8Zp4lPlkZ7R9K_1735118067",
"up": "images/cube_2048/3/fa70f0f26594d3023a3824c9a92033da/3_u.jpg",
"down": "images/cube_2048/3/fa70f0f26594d3023a3824c9a92033da/3_d.jpg",
"left": "images/cube_2048/3/fa70f0f26594d3023a3824c9a92033da/3_l.jpg",
"right": "images/cube_2048/3/fa70f0f26594d3023a3824c9a92033da/3_r.jpg",
"front": "images/cube_2048/3/fa70f0f26594d3023a3824c9a92033da/3_f.jpg",
"back": "images/cube_2048/3/fa70f0f26594d3023a3824c9a92033da/3_b.jpg",
"size_list": [ 2048, 4096 ],
"tiles": [ 1, 2, 3 ],
},
...
]
}
After:
"panorama": {
"count": 465,
"pattern": {
"up": "images/cube_2048/{index}/{hash}/{index}_u.jpg",
"down": "images/cube_2048/{index}/{hash}/{index}_d.jpg",
"left": "images/cube_2048/{index}/{hash}/{index}_l.jpg",
"right": "images/cube_2048/{index}/{hash}/{index}_r.jpg",
"front": "images/cube_2048/{index}/{hash}/{index}_f.jpg",
"back": "images/cube_2048/{index}/{hash}/{index}_b.jpg",
"size_list": [ 2048, 4096 ],
"tiles": [ 1, 2, 3]
},
"list": [
{
"hash": "0fd265355dbb94cb22fb930e52dd3c19",
"derived_id": 0,
"derived_id_str": "auto3d-light-vEY8Zp4lPlkZ7R9K_1735117678",
"index": 0
},
{
"hash": "a6ca1991fc6bdb2dbd1a1003d9f62394",
"derived_id": 0,
"derived_id_str": "auto3d-light-vEY8Zp4lPlkZ7R9K_1735117799",
"index": 1
},
{
"hash": "567f94406885bf06f5586d7972da2b5e",
"derived_id": 0,
"derived_id_str": "auto3d-light-vEY8Zp4lPlkZ7R9K_1735117912",
"index": 2
},
{
"hash": "fa70f0f26594d3023a3824c9a92033da",
"derived_id": 0,
"derived_id_str": "auto3d-light-vEY8Zp4lPlkZ7R9K_1735118067",
"index": 3
},
...
]
}
在序列话 Work Json 时。资源的地址,均尝试存储为
base_url的相对地址,减少存储的开销。
可以通过 work.getURL 获取到完整地址。
// 获取图片地址
work.getURL(work.observers[0].image.left);
可以通过修改 work.baseURL= 修改前缀。
tileeset.rootMeta.coordinate。声明 file_url 的世界坐标。file_url 模型的上方向, 仅针对 obj / ply 等自身没有上方向定义的模型格式。work.toJSON() 可以获取到当前序列化后的标准 Work Json。类型为 WorkJsonparseWork 时的 Json。 而是从 work 数据中序列化后的结果。_signature certificate 等字段。优化 Gltf PBR 材质渲染。 对技术美术输出的模型,更准确的还原。
地址: https://vradmin.lianjia.com/gltf/
扩展 threejs 的 Raycaster。 支持多个自定义参数。
declare module 'three' {
export interface Raycaster {
/**
* 只捕获第一个交点
*/
firstHitOnly?: boolean;
/**
* 对交点进行筛选
*/
hitFilter?: (intersect: THREE.Intersection) => boolean;
/**
* 作用楼层
*/
floorIndex?: number;
}
}
同时一些内部逻辑变化
目的是通过有限的内存,获取到最清晰的模型效果。
// 设置内存最高缓存到 512 MB
five.modelScene.parameter.set('maxMemoryUsage', 512);
// 设置 maxScreenSpaceError 到 32
five.modelScene.parameter.set('maxScreenSpaceError', 32);
// 设置通过内存上限动态调整 maxScreenSpaceError
five.modelScene.parameter.set('memoryAdjustedScreenSpaceError', true);
当设置的 maxScreenSpaceError 已经全部加载完毕后,发现内存空间仍有剩余。则会尝试降低 maxScreenSpaceError 知道内存大体到达 maxMemoryUsage 设置的水平。
maxScreenSpaceError 已经全部加载完毕后,内存已经大于 maxMemoryUsage 设置的水平则不会变化。maxMemoryUsage 附近摆动的情况。导致模型反复加载/销毁。通过过渡到模型实现点位游走效果
five.moveToPano(0, {
effect: 'model',
});
目前支持:
function easeInQuad(x: number): number {
return x * x;
};
five.moveToPano({
workCode: "axv2ZQMaKZcMl5Bc6x",
panoIndex: 51,
}, {
latitude: 0.5314685806864204,
longitude: 4.324187623631265,
fov: 90,
effectEasing: easeInQuad
})
默认逻辑为:
const five = new Five({
panorama: {
aerialObserverMinHeight: 5,
panoCircleMeshCreator: (observer, options) => {
const distance = observer.position.distanceTo(observer.standingPosition);
if (distance > options.aerialObserverMinHeight) {
return new PanoCircleMeshSolid();
} else {
return new PanoCircleMesh();
}
},
}
}
业务可以修改或介入这个逻辑。
重写了渲染相关的逻辑。将 scene-renderer 和 postprocessing 分开
// 通过 renderMode 切换
// 直接渲染
five.renderMode = 'default';
// 点云融合渲染
five.renderMode = 'point-cloud-high-quality';
// SSAA算法的抗锯齿渲染
five.renderMode = 'ssaa';
// 开启 eye-dome-lighting-pass
five.enableEDL = true;
// 开启 adaptive-luminance-pass
five.enableAdaptiveLuminance = true;
后处理支持 THREE 对于 后处理 Pass 的定义。可以自定义追加。
注意:目前不支持 mask 模版剔除部分的逻辑。
interface Pass {
enabled: boolean;
needsSwap: boolean;
clear: boolean;
renderToScreen: boolean;
setSize(width: number, height: number): void;
render(
renderer: THREE.WebGLRenderer,
writeBuffer: THREE.WebGLRenderTarget,
readBuffer: THREE.WebGLRenderTarget,
deltaTime?: number,
maskActive?: boolean
): void;
}
const myPass: Pass = ...;
this.fiveRenderer.composer.addPass(myPass)