cae导出的csv文件在three中加载

读取csv中顶点数据以及三角面片数据

根据塑性应变赋予三角面片的颜色

makeMesh1() {
      let geometry = new THREE.BufferGeometry();
      let vertices = [];
      let indices = [];
      // 使用 来存储数据
      let thicknessValues = [];
      let colorMap = createColorMap();
      for (let i = 0; i < points.length; i++) {
        let p = points[i];
        vertices.push(
          parseFloat(p.XCoord),
          parseFloat(p.YCoord),
          parseFloat(p.ZCoord)
        );
        thicknessValues.push(findPointAverage(p["Node Idx"]));
      }
      function findPointAverage(idx) {
        let filteredData = mians.filter(
          (item) =>
            item["Node Idx 1"] === idx ||
            item["Node Idx 2"] === idx ||
            item["Node Idx 3"] === idx
        );
        let sum = filteredData.reduce(
          (acc, cur) => acc + parseFloat(cur["Plastic Strain Layer 1"]),
          0
        );
        let average = sum / filteredData.length;
        return average;
      }
      for (let i = 0; i < mians.length; i++) {
        let m = mians[i];
        indices.push(m["Node Idx 1"], m["Node Idx 2"], m["Node Idx 3"]);
      }
      function normalize(values) {
        let max = Math.max.apply(null, values);
        let min = Math.min.apply(null, values);
        for (let i = 0; i < values.length; i++) {
          // 求出颜色的索引值
          let index = parseInt(
            ((values[i] - min) / (max - min)) * (colorMap.length - 1)
          );
          values[i] = [
            colorMap[index][0],
            colorMap[index][1],
            colorMap[index][2],
          ];
        }
        return values;
      }

      // 在设置属性之前,调用此函数进行归一化
      thicknessValues = normalize(thicknessValues);
      console.log(thicknessValues);
      let flatColors = [].concat.apply([], thicknessValues);
      geometry.setAttribute(
        "color",
        new THREE.BufferAttribute(new Float32Array(flatColors), 3)
      );
      geometry.setAttribute(
        "position",
        new THREE.Float32BufferAttribute(vertices, 3)
      );
      geometry.setIndex(indices);
      let shaderMaterial = new THREE.ShaderMaterial({
        vertexShader: `
          varying vec3 vColor;
          attribute vec3 color;
          void main() {
              vColor = color;
              gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
        }`,
        fragmentShader: `
          varying vec3 vColor;
          void main() {
              // gl_FragColor = vec4(vColor, 1.0);
              gl_FragColor = vec4(smoothstep(0.1, 0.9, vColor), 1.0);
          }`,
        uniforms: {},
        side: THREE.DoubleSide, // 添加这一行
      });
      let mesh = new THREE.Mesh(geometry, shaderMaterial);
      // 创建一个边界框对象
      let box = new THREE.Box3().setFromObject(mesh);

      // 获取边界框的中心点
      let center = box.getCenter(new THREE.Vector3());

      // 将模型的位置设置为与边界框中心点位置相反的位置,以便将模型的中心点移动到世界坐标系的原点
      mesh.position.x += mesh.position.x - center.x;
      mesh.position.y += mesh.position.y - center.y;
      mesh.position.z += mesh.position.z - center.z;
      scene.add(mesh);
    },

在这里插入图片描述

优化

效果并不好,三角面片边界分割感很强优化了一下shaderMaterial ,最终效果
在这里插入图片描述

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值