读取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 ,最终效果