备住:添加pcd模型想要根据模型 不同高度 设置不同颜色 利用ShaderMaterial实现自定义
// 添加pcd addPcd(url){ // 加载 PCD 文件 // loader.load('http://youid:60022/112233/partition/050.pcd', (loadedPointCloud) => { loader.load(url, (loadedPointCloud) => { const vertexShader = ` precision highp float; varying vec3 fPosition; varying vec3 vColor; varying vec2 vUv; // 接收uv void main() { vUv = uv; fPosition = (modelMatrix * vec4(position, 1.0)).xyz; vColor = vec3(1.0, 0.0, 0.0); // 设置点的颜色,例如红色 gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); // fPosition = gl_Position.xyz; gl_PointSize = 1.0; // 设置点的大小 } `; const fragmentShader = ` varying vec2 vUv; // 接收uv uniform float time; // 一个从外部传入的uniform变量,例如时间 precision highp float; varying vec3 fPosition; uniform float interval; void d_color() { float dataY = fPosition.z+25.0; float dataI = interval; if (dataY <= -dataI) { // 蓝色-蓝绿 // 0,0,1 -> 0,1,1 gl_FragColor = vec4(0.0, 0.0, 1.0, 1.0); } else if (dataY > -dataI && dataY <= 0.0) { float g = 1.0 - (-dataY / dataI); gl_FragColor = vec4(0.0, g, 1.0, 1.0); } else if (dataY > 0.0 && dataY <= dataI) { // 蓝绿-绿 // 0,1,1 -> 0,1,0 float g = 1.0 - dataY / dataI; gl_FragColor = vec4(0.0, 1.0, g, 1.0); } else if (dataY > dataI && dataY <= 2.0 * dataI) { // 绿-浅绿 // 0,1,0 -> 0.5,1,0 float r = 0.5 * ((dataY - dataI) / dataI); gl_FragColor = vec4(r, 1.0, 0.0, 1.0); } else if (dataY > 2.0 * dataI && dataY <= 3.0 * dataI) { // 浅绿-黄 // 0.5,1,0 -> 1,1,0 float r = 0.5 + ((dataY - 2.0 * dataI) / dataI) * 0.5; gl_FragColor = vec4(r, 1.0, 0.0, 1.0); } else if (dataY > 3.0 * dataI && dataY <= 4.0 * dataI) { // 黄-土黄 // 1,1,0 -> 1,0.76,0 float g = 1.0 - ((dataY - 3.0 * dataI) / dataI) * (1.0 - 0.76); gl_FragColor = vec4(1.0, g, 0.0, 1.0); } else if (dataY > 4.0 * dataI && dataY <= 5.0 * dataI) { // 土黄-橙 // 1,0.76,0 -> 1,0.58,0 float g = 0.76 - ((dataY - 4.0 * dataI) / dataI) * (0.76 - 0.58); gl_FragColor = vec4(1.0, g, 0.0, 1.0); } else if (dataY > 5.0 * dataI && dataY <= 6.0 * dataI) { // 橙-红 // 1,0.58,0 -> 1,0,0 float g = 0.58 - ((dataY - 5.0 * dataI) / dataI) * 0.58; gl_FragColor = vec4(1.0, g, 0.0, 1.0); } else { // 红 // 1.0,0.0,0.0 gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); } } void main() { // gl_FragColor = vec4(vUv, 0.0, 1.0); // vec3 color = vec3(vUv.x, 0, sin(time)); // // 使用UV坐标和time来生成颜色效果 // vec3 color = vec3(vUv.x, vUv.y, sin(time)); // gl_FragColor = vec4(color, 1.0); d_color(); } //片元着色器程序 `; //片元着色器程序 const material1 = new THREE.ShaderMaterial({ uniforms: { time: { value: 0.0 }, // 时间 u_resolution: { value: new THREE.Vector2() }, // 分辨率 u_mouse: { value: new THREE.Vector2() }, // 鼠标 interval: { type: "f", value: 1.9, }, }, vertexShader: vertexShader, fragmentShader: fragmentShader, transparent: true // 如果需要透明度,则设置为true,否则默认为false。 }); scene.add(loadedPointCloud); this.render(); }) },