threejs 3D标注

在这里插入图片描述

import { CSS3DObject } from "three/examples/jsm/renderers/CSS3DRenderer";

	gltfLoader.load("./model/exhibit2.glb", (gltf) =>{
            let array = ["雕像", "中药房", "浸制区", "道地沙盘","动物标本区","灵芝","茶话室","药材制作"];
            console.log(gltf)
            this.exhibitionHall = gltf.scene;
            // 判断子元素是否是物体
            this.exhibitionHall.traverse((child) => {
                if(child.isMesh){
                    child.material.emissiveIntensity = 15;
                }
                if (array.indexOf(child.name) !== -1){
                    console.log(child)
                    const css3DObject = this.createTag(child);
                    css3DObject.visible =true
                    this.floor2Tags.push(css3DObject);
                    this.exhibitionHall.add(css3DObject);
                }
            })
            let fakeChild = {
                name: "标注",
                position: {
                    x:100,
                    y:100,
                    z:20}
            }
            const css3DObject = this.createTag(fakeChild);
            css3DObject.visible =true
            this.floor2Tags.push(css3DObject);
            this.exhibitionHall.add(css3DObject);

            this.exhibitionHall.position.set(0,0,0)
            this.exhibitionHall.scale.set(15,15,15)
            console.log(gltf)
            scene.add(this.exhibitionHall)

        })

    createTag(object3d) {
        // 创建各个区域的元素
        const element = document.createElement("div");
        element.className = "elementTag";
        element.innerHTML = `
      <div class="elementContent">
        <h3>${object3d.name}</h3>
        <p>温度:26℃</p>
        <p>湿度:50%</p>
      </div>
    `;

        const objectCSS3D = new CSS3DObject(element);
        objectCSS3D.position.copy(object3d.position);
        objectCSS3D.scale.set(0.2, 0.2, 0.2);
        return objectCSS3D;
        // scene.add(objectCSS3D);
    }
css 样式内不要加 scoped 会找不到样式
// app.vue
<style lang="less">

.cssrender {
  display: flex;
  position: fixed;
  top: 0;
  left: 0;
  z-index: 100;
  pointer-events: none;
}

.elementTag {
  position: relative;
  left: -30px;
  top: 20px;
}
.elementTag::before {
  content: "";
  display: block;
  position: absolute;
  width: 100px;
  height: 1px;
  background: rgb(127 177 255 / 75%);
  bottom: 0;
  right: -100px;
  transform-origin: 0 0;
  transform: rotate(30deg);
}
.elementTag::after {
  content: "";
  display: block;
  position: absolute;
  width: 20px;
  height: 20px;
  background: rgb(127 177 255 / 75%);
  bottom: -65px;
  right: -105px;
  border-radius: 50%;
}

.elementContent {
  background-color: rgb(20 143 221 / 68%);
  box-shadow: 0px 0px 12px rgb(0 128 255 / 75%);
  border: 1px solid rgb(127 177 255 / 75%);
  padding: 20px;
  color: #efefef;
}

.elementContent h3 {
  font-size: 20px;
  font-weight: bold;
  margin: 15px 0;
  color: #efefef;
}
</style>
//index.html 
// 加入css样式渲染区
<div class="cssrender"></div>
// renderer.js
import { CSS3DRenderer } from "three/examples/jsm/renderers/CSS3DRenderer.js";

// 创建css3drender
// 所有涉及到渲染的 都需要css3drender 去渲染
const css3drender = new CSS3DRenderer();
css3drender.setSize(window.innerWidth, window.innerHeight);
document.querySelector(".cssrender").appendChild(css3drender.domElement);
export default { css3drender };


import rendererModule from "@/three/renderer.js";
// 使用渲染器渲染相机看到这个场景的内容渲染出来
rendererModule.renderer.render(scene, cameraModule.activeCamera);
rendererModule.css3drender.render(scene, cameraModule.activeCamera);
three.js是一个用于创建和展示 3D 地图的开源 JavaScript 库。它提供了许多功能和工具,可以轻松地创建和标注 3D 地图。 首先,我们需要加载地图的基本模型。在 three.js 中,我们可以通过导入地形数据或使用现有的地形模型来创建一个基本的 3D 地图。这可以通过使用 three.js 中的几何体和纹理进行实现。例如,我们可以使用高程数据创建山脉和河流,使用贴图添加地面纹理。 接下来,我们可以使用标注工具在地图上加入标记。这些标记可以是地点、建筑物或其他感兴趣的地方等。我们可以使用 three.js 的几何体和纹理来创建不同类型的标记,如球体、立方体或自定义模型。然后,我们可以将这些标记放置在地图的特定位置,并添加相应的标记文字或图标。 除了标注工具,three.js 还提供了交互性的功能,例如可以通过鼠标或触摸屏进行地图的旋转、缩放和平移操作。这允许用户自由地探索地图,并更好地了解地理环境。 最后,我们可以根据需要对地图进行自定义和优化。我们可以添加光源,使地图的光照效果更加真实。我们还可以使用 three.js 的特效功能,如雾效和阴影效果,来提高地图的视觉质量。 总之,通过使用three.js,我们可以轻松创建和标注3D地图,并使其具有交互性和视觉效果。这个库提供了许多功能和工具,使我们能够将地理数据可视化,并为用户提供一个更加 immersive 和有趣的地图浏览体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值