|
|
@ -6,6 +6,8 @@ import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial.js' |
|
|
import { decimalSumBy } from '@/core/ModelUtils' |
|
|
import { decimalSumBy } from '@/core/ModelUtils' |
|
|
import Constract from '@/core/Constract.ts' |
|
|
import Constract from '@/core/Constract.ts' |
|
|
import ptrUrl from '@/assets/images/ptr/ptr.png' |
|
|
import ptrUrl from '@/assets/images/ptr/ptr.png' |
|
|
|
|
|
import { CSG } from 'three-csg-ts'; |
|
|
|
|
|
import {BufferGeometry} from "three"; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* ptr侧叉渲染器 |
|
|
* ptr侧叉渲染器 |
|
|
@ -60,27 +62,34 @@ export default class PtrRenderer extends BaseRenderer { |
|
|
return null |
|
|
return null |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
const textureLoader = new THREE.TextureLoader() |
|
|
|
|
|
const texture = textureLoader.load(ptrUrl) |
|
|
|
|
|
|
|
|
|
|
|
const group = new THREE.Group() |
|
|
const group = new THREE.Group() |
|
|
group.name = PtrRenderer.POINT_NAME |
|
|
group.name = PtrRenderer.POINT_NAME |
|
|
|
|
|
|
|
|
// 绘制背景矩形框
|
|
|
const ptrPedestalGeometry = this.createPtrPedestal(item, option) |
|
|
const planeGeometry = new THREE.PlaneGeometry(item.dt.ptrWidth, item.dt.ptrDepth) |
|
|
const ptrPedestalMaterial = new THREE.MeshPhongMaterial({color: 0xffdddbca}); |
|
|
planeGeometry.rotateX(-Math.PI / 2) |
|
|
const ptrPedestalMesh = new THREE.Mesh(ptrPedestalGeometry, ptrPedestalMaterial); |
|
|
const planeMaterial = new THREE.MeshLambertMaterial({ |
|
|
|
|
|
map: texture, // 颜色贴图
|
|
|
const ptrPillarGeometry = this.createPtrPillar(item, option); |
|
|
transparent: true // 允许透明纹理
|
|
|
const ptrPillarMaterial = new THREE.MeshPhongMaterial({color: 0xff6c6956}); |
|
|
}) |
|
|
const ptrPillarMesh = new THREE.Mesh(ptrPillarGeometry, ptrPillarMaterial); |
|
|
const planeMesh = new THREE.Mesh(planeGeometry, planeMaterial) |
|
|
|
|
|
group.add(planeMesh) |
|
|
const ptrForkGeometry = this.createPtrFork(item, option); |
|
|
|
|
|
const ptrForkMaterial = new THREE.MeshPhongMaterial({color: 0xff111111}); |
|
|
|
|
|
const ptrForkMesh = new THREE.Mesh(ptrForkGeometry, ptrForkMaterial); |
|
|
|
|
|
|
|
|
|
|
|
group.add(ptrPedestalMesh) |
|
|
|
|
|
const groupPillar = new THREE.Group() |
|
|
|
|
|
groupPillar.add(ptrPillarMesh) |
|
|
|
|
|
groupPillar.add(ptrForkMesh) |
|
|
|
|
|
group.add(groupPillar) |
|
|
|
|
|
|
|
|
// 设置位置
|
|
|
// 设置位置
|
|
|
group.position.set(item.tf[0][0], item.tf[0][1], item.tf[0][2]) |
|
|
group.position.set(item.tf[0][0], item.tf[0][1], item.tf[0][2]) |
|
|
return group |
|
|
return group |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
dispose() { |
|
|
dispose() { |
|
|
super.dispose() |
|
|
super.dispose() |
|
|
this.pointMaterial?.dispose() |
|
|
this.pointMaterial?.dispose() |
|
|
@ -89,4 +98,218 @@ export default class PtrRenderer extends BaseRenderer { |
|
|
createPointBasic(item: ItemJson, option?: RendererCudOption): THREE.Object3D { |
|
|
createPointBasic(item: ItemJson, option?: RendererCudOption): THREE.Object3D { |
|
|
throw new Error('Ptr createPointBasic not allow!') |
|
|
throw new Error('Ptr createPointBasic not allow!') |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 创建ptr的底座
|
|
|
|
|
|
createPtrPedestal(item: ItemJson, option?: RendererCudOption): THREE.BufferGeometry { |
|
|
|
|
|
// 参数配置
|
|
|
|
|
|
const radius = 0.8; // 圆半径
|
|
|
|
|
|
const lineDist = 0.75; // 切割线距离圆心距离
|
|
|
|
|
|
const segments = 64; // 圆的分段精度
|
|
|
|
|
|
|
|
|
|
|
|
// 计算切割线与圆的交点
|
|
|
|
|
|
const intersectY = Math.sqrt(radius*radius - lineDist*lineDist); |
|
|
|
|
|
const startAngle = Math.asin(intersectY/radius); |
|
|
|
|
|
const endAngle = Math.acos(intersectY/radius); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const shape = new THREE.Shape(); |
|
|
|
|
|
shape.moveTo(0, 0); // 起点在圆心
|
|
|
|
|
|
shape.absarc(0, 0, 0.8, startAngle, endAngle, false); // 从0到π绘制半圆
|
|
|
|
|
|
shape.absarc(0, 0, 0.8, startAngle + Math.PI/2, endAngle + Math.PI/2, false); |
|
|
|
|
|
shape.absarc(0, 0, 0.8, startAngle + Math.PI, endAngle + Math.PI, false); |
|
|
|
|
|
shape.absarc(0, 0, 0.8, startAngle + Math.PI/2 * 3, endAngle + Math.PI/2 * 3, false); |
|
|
|
|
|
|
|
|
|
|
|
shape.lineTo(-0.5, -intersectY) |
|
|
|
|
|
shape.lineTo(-0.5, -intersectY + 0.17) |
|
|
|
|
|
shape.lineTo(0.75, -intersectY + 0.17) |
|
|
|
|
|
shape.lineTo(0.75, intersectY - 0.17) |
|
|
|
|
|
shape.lineTo(-0.5, intersectY - 0.17) |
|
|
|
|
|
shape.lineTo(-0.5, intersectY) |
|
|
|
|
|
shape.closePath(); // 闭合路径
|
|
|
|
|
|
|
|
|
|
|
|
// 拉伸轨迹线
|
|
|
|
|
|
const curve = new THREE.CatmullRomCurve3( |
|
|
|
|
|
[new THREE.Vector3(0, 0.02, 0), new THREE.Vector3(0, 0.22, 0)], |
|
|
|
|
|
false, // 闭合曲线
|
|
|
|
|
|
'catmullrom', |
|
|
|
|
|
0 |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
// 挤出几何图形 参数
|
|
|
|
|
|
const options = { |
|
|
|
|
|
steps: 1, |
|
|
|
|
|
bevelEnabled: false, |
|
|
|
|
|
extrudePath: curve // 设置挤出轨迹
|
|
|
|
|
|
} |
|
|
|
|
|
// 创建挤出几何体
|
|
|
|
|
|
const geometry = new THREE.ExtrudeGeometry(shape, options) |
|
|
|
|
|
const material = new THREE.MeshBasicMaterial({color: 0xffdddbca}); |
|
|
|
|
|
const mesh = new THREE.Mesh(geometry, material); |
|
|
|
|
|
|
|
|
|
|
|
mesh.updateMatrix() |
|
|
|
|
|
|
|
|
|
|
|
// 倒角
|
|
|
|
|
|
const shapeD = new THREE.Shape(); |
|
|
|
|
|
shapeD.moveTo(-0.02, -0.02); |
|
|
|
|
|
shapeD.lineTo(0.02, 0.02) |
|
|
|
|
|
shapeD.lineTo(-0.02, 0.02) |
|
|
|
|
|
shapeD.closePath() |
|
|
|
|
|
|
|
|
|
|
|
const curveD = new THREE.EllipseCurve( |
|
|
|
|
|
0, 0, radius, radius, 0, Math.PI * 2, false, 0 |
|
|
|
|
|
); |
|
|
|
|
|
// 生成拉伸路径点
|
|
|
|
|
|
const pointsD = curveD.getPoints(segments).map(p => |
|
|
|
|
|
new THREE.Vector3(p.x, 0.20, p.y) |
|
|
|
|
|
); |
|
|
|
|
|
// 3. 挤出成型
|
|
|
|
|
|
const optionsD = { |
|
|
|
|
|
steps: segments, |
|
|
|
|
|
bevelEnabled: false, |
|
|
|
|
|
// bevelSegments: 0.01,
|
|
|
|
|
|
extrudePath: new THREE.CatmullRomCurve3(pointsD) |
|
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
const geometryD = new THREE.ExtrudeGeometry(shapeD, optionsD) |
|
|
|
|
|
const meshD = new THREE.Mesh(geometryD, material); |
|
|
|
|
|
meshD.updateMatrix() |
|
|
|
|
|
|
|
|
|
|
|
// 布尔运算
|
|
|
|
|
|
const result = CSG.subtract(mesh, meshD) |
|
|
|
|
|
|
|
|
|
|
|
return result.geometry |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 创建ptr的立柱
|
|
|
|
|
|
createPtrPillar(item: ItemJson, option?: RendererCudOption): THREE.BufferGeometry { |
|
|
|
|
|
// 606.5
|
|
|
|
|
|
const width = 0.245 |
|
|
|
|
|
const depth = 0.716 |
|
|
|
|
|
const dd = 0.05 |
|
|
|
|
|
const shape = new THREE.Shape(); |
|
|
|
|
|
shape.moveTo(-0.728, -0.358 + dd); |
|
|
|
|
|
shape.lineTo(-0.728 + dd, -0.358); |
|
|
|
|
|
shape.lineTo(-0.728 + width - dd, -0.358); |
|
|
|
|
|
shape.lineTo(-0.728 + width, -0.358 + dd); |
|
|
|
|
|
|
|
|
|
|
|
shape.lineTo(-0.728 + width, -0.28); |
|
|
|
|
|
shape.lineTo(-0.728 + width - 0.08, -0.28); |
|
|
|
|
|
shape.lineTo(-0.728 + width - 0.08, 0.28); |
|
|
|
|
|
shape.lineTo(-0.728 + width, 0.28); |
|
|
|
|
|
|
|
|
|
|
|
shape.lineTo(-0.728 + width, -0.358 + depth - dd); |
|
|
|
|
|
shape.lineTo(-0.728 + width - dd, -0.358 + depth); |
|
|
|
|
|
shape.lineTo(-0.728 + dd, -0.358 + depth); |
|
|
|
|
|
shape.lineTo(-0.728, -0.358 + depth - dd); |
|
|
|
|
|
// shape.lineTo(-0.728, -0.358 + dd);
|
|
|
|
|
|
// shape.closePath()
|
|
|
|
|
|
|
|
|
|
|
|
// 拉伸轨迹线
|
|
|
|
|
|
const curve = new THREE.CatmullRomCurve3( |
|
|
|
|
|
[new THREE.Vector3(0, 0.22, 0), new THREE.Vector3(0, 1.872, 0)], |
|
|
|
|
|
false, // 闭合曲线
|
|
|
|
|
|
'catmullrom', |
|
|
|
|
|
0 |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
// 挤出几何图形 参数
|
|
|
|
|
|
const options = { |
|
|
|
|
|
steps: 1, |
|
|
|
|
|
bevelSegments: 0.05, |
|
|
|
|
|
bevelEnabled: true, |
|
|
|
|
|
extrudePath: curve // 设置挤出轨迹
|
|
|
|
|
|
} |
|
|
|
|
|
// 创建挤出几何体
|
|
|
|
|
|
const geometry = new THREE.ExtrudeGeometry(shape, options) |
|
|
|
|
|
// const material = new THREE.MeshBasicMaterial({color: 0xffdddbca});
|
|
|
|
|
|
// const mesh = new THREE.Mesh(geometry, material);
|
|
|
|
|
|
return geometry |
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 创建ptr的立柱
|
|
|
|
|
|
createPtrFork(item: ItemJson, option?: RendererCudOption): THREE.BufferGeometry { |
|
|
|
|
|
// 606.5
|
|
|
|
|
|
const width = 0.245 |
|
|
|
|
|
const depth = 0.716 |
|
|
|
|
|
const dd = 0.05 |
|
|
|
|
|
const fd = 0.03 |
|
|
|
|
|
const shape = new THREE.Shape(); |
|
|
|
|
|
|
|
|
|
|
|
shape.moveTo(-0.728 + width - 0.08, -0.28); |
|
|
|
|
|
shape.lineTo(-0.728 + width + 0.02, -0.28); |
|
|
|
|
|
shape.lineTo(-0.728 + width + 0.02, -0.27); |
|
|
|
|
|
shape.lineTo(-0.728 + width + 0.02 + 1.130 - fd, -0.27); |
|
|
|
|
|
shape.lineTo(-0.728 + width + 0.02 + 1.130, -0.27 + fd); |
|
|
|
|
|
shape.lineTo(-0.728 + width + 0.02 + 1.130, -0.12 - fd); |
|
|
|
|
|
shape.lineTo(-0.728 + width + 0.02 + 1.130 - fd, -0.12); |
|
|
|
|
|
shape.lineTo(-0.728 + width + 0.02, -0.12); |
|
|
|
|
|
shape.lineTo(-0.728 + width + 0.02, 0.12); |
|
|
|
|
|
shape.lineTo(-0.728 + width + 0.02 + 1.130 - fd, 0.12); |
|
|
|
|
|
shape.lineTo(-0.728 + width + 0.02 + 1.130, 0.12 + fd); |
|
|
|
|
|
shape.lineTo(-0.728 + width + 0.02 + 1.130, 0.27 - fd); |
|
|
|
|
|
shape.lineTo(-0.728 + width + 0.02 + 1.130 - fd, 0.27); |
|
|
|
|
|
shape.lineTo(-0.728 + width + 0.02, 0.27); |
|
|
|
|
|
shape.lineTo(-0.728 + width + 0.02, 0.28); |
|
|
|
|
|
shape.lineTo(-0.728 + width - 0.08, 0.28); |
|
|
|
|
|
|
|
|
|
|
|
shape.closePath() |
|
|
|
|
|
|
|
|
|
|
|
// 拉伸轨迹线
|
|
|
|
|
|
const curve = new THREE.CatmullRomCurve3( |
|
|
|
|
|
[new THREE.Vector3(0, 0.02, 0), new THREE.Vector3(0, 0.482, 0)], |
|
|
|
|
|
false, // 闭合曲线
|
|
|
|
|
|
'catmullrom', |
|
|
|
|
|
0 |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
// 挤出几何图形 参数
|
|
|
|
|
|
const options = { |
|
|
|
|
|
steps: 1, |
|
|
|
|
|
bevelSegments: 0.05, |
|
|
|
|
|
bevelEnabled: true, |
|
|
|
|
|
extrudePath: curve // 设置挤出轨迹
|
|
|
|
|
|
} |
|
|
|
|
|
// 创建挤出几何体
|
|
|
|
|
|
const geometry = new THREE.ExtrudeGeometry(shape, options) |
|
|
|
|
|
const material = new THREE.MeshBasicMaterial({color: 0xffdddbca}); |
|
|
|
|
|
const mesh = new THREE.Mesh(geometry, material); |
|
|
|
|
|
mesh.updateMatrix() |
|
|
|
|
|
|
|
|
|
|
|
const shapeD = new THREE.Shape(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
shapeD.moveTo(-0.728 + width + 0.02, -0.3); |
|
|
|
|
|
shapeD.lineTo(-0.728 + width + 0.02 + 1.2, -0.3); |
|
|
|
|
|
shapeD.lineTo(-0.728 + width + 0.02 + 1.2, 0.3); |
|
|
|
|
|
shapeD.lineTo(-0.728 + width + 0.02, 0.3); |
|
|
|
|
|
shape.closePath() |
|
|
|
|
|
|
|
|
|
|
|
// 拉伸轨迹线
|
|
|
|
|
|
const curveD = new THREE.CatmullRomCurve3( |
|
|
|
|
|
[new THREE.Vector3(0, 0.07, 0), new THREE.Vector3(0, 0.482, 0)], |
|
|
|
|
|
false, // 闭合曲线
|
|
|
|
|
|
'catmullrom', |
|
|
|
|
|
0 |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
// 挤出几何图形 参数
|
|
|
|
|
|
const optionsD = { |
|
|
|
|
|
steps: 1, |
|
|
|
|
|
bevelSegments: 0.05, |
|
|
|
|
|
bevelEnabled: true, |
|
|
|
|
|
extrudePath: curveD // 设置挤出轨迹
|
|
|
|
|
|
} |
|
|
|
|
|
// 创建挤出几何体
|
|
|
|
|
|
const geometryD = new THREE.ExtrudeGeometry(shapeD, optionsD) |
|
|
|
|
|
const meshD = new THREE.Mesh(geometryD, material); |
|
|
|
|
|
|
|
|
|
|
|
meshD.updateMatrix() |
|
|
|
|
|
|
|
|
|
|
|
// 布尔运算
|
|
|
|
|
|
const result = CSG.subtract(mesh, meshD) |
|
|
|
|
|
|
|
|
|
|
|
return result.geometry |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|