后处理
实现高亮发光描边
import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js';
const composer = new EffectComposer(renderer);
import { RenderPass } from 'three/addons/postprocessing/RenderPass.js';
const renderPass = new RenderPass(scene, camera);
composer.addPass(renderPass);
import { OutlinePass } from 'three/addons/postprocessing/OutlinePass.js';
const v2 = new THREE.Vector2(window.innerWidth, window.innerHeight);
const outlinePass = new OutlinePass(v2, scene, camera);
outlinePass.selectedObjects = [mesh];
outlinePass.selectedObjects = [mesh1,mesh2,group];
composer.addPass(outlinePass);
function render() {
composer.render();
requestAnimationFrame(render);
}
render();
射线拾取模型
Raycaster(鼠标点击选中模型)
renderer.domElement.addEventListener('click', function (event) {
const px = event.offsetX;
const py = event.offsetY;
const x = (px / width) * 2 - 1;
const y = -(py / height) * 2 + 1;
const raycaster = new THREE.Raycaster();
raycaster.setFromCamera(new THREE.Vector2(x, y), camera);
const intersects = raycaster.intersectObjects([mesh1, mesh2, mesh3]);
console.log("射线器返回的对象", intersects);
if (intersects.length > 0) {
intersects[0].object.material.color.set(0xff0000);
}
})
addEventListener('click', function (event) {
const px = event.offsetX;
const py = event.offsetY;
const x = (px / window.innerWidth) * 2 - 1;
const y = -(py / window.innerHeight) * 2 + 1;
const raycaster = new THREE.Raycaster();
raycaster.setFromCamera(new THREE.Vector2(x, y), camera);
const cunchu = model.getObjectByName('存储罐');
for (let i = 0; i < cunchu.children.length; i++) {
const group = cunchu.children[i];
group.traverse(function (obj) {
if (obj.isMesh) {
obj.ancestors = group;
}
})
}
const intersects = raycaster.intersectObjects(cunchu.children);
console.log('intersects', intersects);
if (intersects.length > 0) {
outlinePass.selectedObjects = [intersects[0].object.ancestors];
}
})
场景标注标签信息
CSS2DRenderer(HTML标签)
CSS2模型对象`CSS2DObject`
const div = document.getElementById('tag');
const tag = new CSS2DObject(div);
tag.position.set(50,0,50);
scene.add(tag);
const group = new THREE.Group();
group.add(tag);
### 4. `CSS2Renderer.domElement`重新定位
css2Renderer.domElement.style.position = 'absolute';
css2Renderer.domElement.style.top = '0px';
renderer.domElement.style.marginTop = '200px';
css2Renderer.domElement.style.top = '200px';
### Canvas全屏尺寸变化,CSS2渲染器设置
window.onresize = function () {
const width = window.innerWidth;
const height = window.innerHeight;
renderer.setSize(width,height);
css2Renderer.setSize(width,height);
camera.aspect = width / height;
camera.updateProjectionMatrix();
};
给CSS2模型对象赋予坐标
mesh.position.set(50,0,50);
const meshGroup = new THREE.Group();
meshGroup.add(mesh);
meshGroup.position.x = -100;
const tag = new CSS2DObject(div);
const worldPosition = new THREE.Vector3();
mesh.getWorldPosition(worldPosition);
tag.position.copy(worldPosition);
const group = new THREE.Group();
group.add(meshGroup,tag);
### CSS2模型对象作为Mesh子对象
const tag = new CSS2DObject(div);
mesh.add(tag);
标注模型几何体的某个顶点
const tag = new CSS2DObject(div);
mesh.add(tag);
const pos = geometry.attributes.position;
tag.position.set(pos.getX(0),pos.getY(0),pos.getZ(0));
标签位置
### CSS2模型对象标注工厂设备
loader.load("../工厂.glb", function (gltf) {
const tag = new CSS2DObject(div);
const obj = gltf.scene.getObjectByName('设备B');
obj.add(tag);
})
标签指示线或箭头指向标注点


标签位置模型会在mesh模型局部坐标位置的原点位置
const div = document.getElementById('tag');
div.style.top = '-161px';
<!-- CSS2渲染器渲染器之前,隐藏标签 -->
<div id="tag" style="display: none;"><>
鼠标选中模型弹出标签(工厂)
addEventListener("click", function (event) {
const px = event.offsetX;
const py = event.offsetY;
const x = (px / window.innerWidth) * 2 - 1;
const y = -(py / window.innerHeight) * 2 + 1;
const raycaster = new THREE.Raycaster();
raycaster.setFromCamera(new THREE.Vector2(x, y), camera);
const cunchu = model.getObjectByName("存储罐");
for (let i = 0; i < cunchu.children.length; i++) {
const group = cunchu.children[i];
group.traverse(function (obj) {
if (obj.isMesh) {
obj.ancestors = group;
}
});
}
const intersects = raycaster.intersectObjects(cunchu.children);
console.log("intersects", intersects);
if (intersects.length > 0) {
outlinePass.selectedObjects = [intersects[0].object.ancestors];
intersects[0].object.ancestors.add(tag);
chooseObj = intersects[0].object.ancestors;
span.innerHTML = intersects[0].object.ancestors.name;
} else {
if (chooseObj) {
outlinePass.selectedObjects = [];
chooseObj.remove(tag);
}
}
});
