ThreeLayer如何在resize事件中进行场景的重渲染调整?
- Dominant language
- TypeScript
- Stars
- 4.1k
- Forks
- 656
- PR merge metrics
- No merged PRs in 30d
Description
### 问题描述
在使用L7叠加一个threejs图层渲染的时候,如果触发窗口的 `resize` 事件,默认情况下,three场景图层中的物体始终保持原来的位置信息。
通过手动调整 `camera.aspect` 和 `renderer.setSize` 方法后才能正确地渲染原有位置关系,但是会产生抖动,有没有更好的解决办法?
### 重现链接
_No response_
### 重现步骤
```javascript
import { Scene } from '@antv/l7';
import { GaodeMap } from '@antv/l7-maps';
import { ThreeLayer, ThreeRender } from '@antv/l7-three';
import * as THREE from 'three';
const scene = new Scene({
id: 'map',
map: new GaodeMap({
pitch: 50,
style: 'light',
center: [104.062427, 30.656733],
zoom: 14,
}),
});
scene.on('loaded', () => {
scene.registerRenderService(ThreeRender);
const threeJSLayer = new ThreeLayer({
enableMultiPassRenderer: false,
onAddMeshes: (threeScene, layer) => {
threeScene.add(new THREE.AmbientLight(0xffffff));
const sunlight = new THREE.DirectionalLight(0xffffff, 1);
sunlight.position.set(0, 80000000, 100000000);
sunlight.matrixWorldNeedsUpdate = true;
threeScene.add(sunlight);
const center = scene.getCenter();
const cubeGeometry = new THREE.BoxGeometry(500, 500, 500);
const cubeMaterial = new THREE.MeshStandardMaterial({ color: 0xff9900, side: THREE.DoubleSide });
const cube = new THREE.Mesh(cubeGeometry, cubeMaterial);
layer.setObjectLngLat(cube, [center.lng, center.lat], 500);
threeScene.add(cube);
// 重绘图层
window.addEventListener("resize", () => {
const camera = threeJSLayer.getRenderCamera()
camera.aspect = window.innerWidth / window.innerHeight;
layer.threeRenderService.renderer.setSize(window.innerWidth, window.innerHeight)
})
},
}).animate(true)
scene.addLayer(threeJSLayer);
})
```
### 预期行为
resize事件触发时,图层中的物体不产生抖动
### 平台
- 操作系统: Windows
- 网页浏览器: Google Chrome 131.0.6778.265
### 屏幕截图或视频(可选)
未处理前:

处理后:

### 补充说明(可选)
_No response_
Contributor guide
Assessment
This issue has not been assessed yet.