在三维应用中时常需要拾取场景中的物体,射线包围盒是一种常用的方法,在 CPU 中进行拾取,性能较好,但是精度较差,因为包围盒比较简单,不能拾取复杂的模型。
当拾取频率不高时,可以考虑使用像素级精度的 FramebufferPicker
组件;当拾取频率过高时,需要开发者评估好性能开销是否适合业务场景,因为该组件底层会进行 CPU-GPU 通信,即调用 gl.readPixels
。
import { FramebufferPicker } from "@galacean/engine-toolkit-framebuffer-picker";
const framebufferPicker = rootEntity.addComponent(FramebufferPicker);
framebufferPicker.camera = camera;
class ClickScript extends Script {
onUpdate(): void {
const inputManager = this.engine.inputManager;
if (inputManager.isPointerDown(PointerButton.Primary)) {
const pointerPosition = inputManager.pointerPosition;
framebufferPicker.pick(pointerPosition.x, pointerPosition.y).then((renderElement) => {
if (renderElement) {
// ...
} else {
// ...
}
});
}
}
}
cameraEntity.addComponent(ClickScript);