• 八、3d场景的区域光墙


            在遇到区域展示的时候我们就能看到炫酷的区域选中效果,那么代码是怎么编辑的呢,今天咱们就好好说说,下面看实现效果。

    思路:

    1. 首先,光墙肯定有多个,那么必须要创建一个新的js文件来作为他的原型对象。
    2. 这个光墙是用c++写的,但是必须是拿js包裹的,否则加入不进Vue项目中。
    3. City文件加载引入,根据具体的传入参数一一对应上位置。

    创建lightwall.js文件,传1表示是一个方的光柱,2是个圆的光柱

    1. import * as THREE from "three";
    2. import vertexShader from "@/shader/lightWall/vertex.js";
    3. import fragmentShader from "@/shader/lightWall/fragment.js";
    4. export default class LightWall {
    5.   constructor(
    6.     type = 1,
    7.     radius = 5,
    8.     radius1 = 5,
    9.     length = 2,
    10.     position = { x: 0, z: 0 },
    11.   ) {
    12.     this.geometry = null
    13.     //type1表示方形柱,2是圆形柱
    14.     if (type == 1) {
    15.       this.geometry = new THREE.BoxBufferGeometry(
    16.         radius,
    17.         20,
    18.         radius1,
    19.       );
    20.     }
    21.     if (type == 2) {
    22.       this.geometry = new THREE.CylinderBufferGeometry(
    23.         radius,
    24.         radius1,
    25.         20,
    26.         32,
    27.         1,
    28.         true
    29.       );
    30.     }
    31.     this.material = new THREE.ShaderMaterial({
    32.       vertexShader: vertexShader,
    33.       fragmentShader: fragmentShader,
    34.       transparent: true,
    35.       side: THREE.DoubleSide,
    36.     });
    37.     this.mesh = new THREE.Mesh(this.geometry, this.material);
    38.     this.mesh.position.set(position.x, 78, position.z);
    39.     this.mesh.geometry.computeBoundingBox();
    40.     this.mesh.scale.set(length, 2, length);
    41.     //   console.log(mesh.geometry.boundingBox);
    42.     let { min, max } = this.mesh.geometry.boundingBox;
    43.     //   获取物体的高度差
    44.     let uHeight = max.y - min.y;
    45.     this.material.uniforms.uHeight = {
    46.       value: uHeight,
    47.     };
    48.   }
    49.   remove () {
    50.     this.mesh.remove();
    51.     this.mesh.removeFromParent();
    52.     this.mesh.geometry.dispose();
    53.     this.mesh.material.dispose();
    54.   }
    55. }

    再就是引入光墙的c++代码,也就是上面引入的vertex.js

    1. const fragmentShader = /*glsl*/ `
    2. varying vec3 vPosition;
    3. uniform float uHeight;
    4. void main(){
    5.     // 设置混合的百分比
    6.         float gradMix = (vPosition.y+uHeight/2.0)/uHeight;
    7.       gl_FragColor = vec4(0.7,0.5,0.35,1.0-gradMix);
    8.    
    9. }`
    10. export default fragmentShader

    最后在主文件使用,引入到scene中

    1. // 添加光墙
    2. import LightWall from "./LightWall";
    3. const lightWall = new LightWall(1, 12, 24, 10, { x: -78, z: -48 });
    4. scene.add(lightWall.mesh);

    以上就把这个光墙封装为一个类,当使用的时候只需要new就行了,是不是很方便呢,当然你也可以扩展增加参数使用这个东西,如果又不会的可以私信或者留言哦。

  • 相关阅读:
    Java责任链模式之总有你想不到的知识
    c++Flood Fill算法之池塘计数,城堡问题,山峰与山谷(acwing)
    LaMa 论文复现:Resolution-robust Large Mask Inpainting with Fourier Convolutions
    Java之TreeSet和TreeMap
    SpringWeb解析
    kafka快速入门
    IEEE754 标准存储浮点数
    京东医疗器械分类汇总
    【云服务器选型指南:五大关键】
    【项目部署-apache】windows系统下apache部署django+channels
  • 原文地址:https://blog.csdn.net/qq_43185384/article/details/133383282