12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- var LinesDrawingManager = {
- meshEdgeLines: undefined,
- rotateLine: undefined,
- rotateLineGeometry: new THREE.Geometry(),
- rotateLineMesh: new MeshLine(),
- clipLine: undefined,
- clipLineMaterial: new THREE.MeshBasicMaterial({ color: new THREE.Color(0x00FA9A) }),
- clipLineMultiplyMatrix: new THREE.Matrix4().set(1, 0, 0, 0,
- 0, 0, 1, 0,
- 0, -1, 0, 0,
- 0, 0, 0, 1),
- initialMatrix: new THREE.Matrix4(),
- clipLineObject3D: new THREE.Object3D(),
- initLine: function () {
- this.initActiveLine();
- this.initRotateLine();
- this.initClipLine();
- scene.add(this.rotateLine);
- scene.add(this.meshEdgeLines);
- scene.add(this.clipLine);
- this.hideAll();
- },
- initActiveLine: function () {
- let activeLineGeometry = new THREE.BufferGeometry();
- let activeLineMaterial = new THREE.LineBasicMaterial({
- color: 0x00FA9A,
- clippingPlanes: []
- });
- this.meshEdgeLines = new THREE.Line(activeLineGeometry, activeLineMaterial);
- },
- showMeshEdgeLines: function (points, clippingPlanes) {
- if (points.length > 1) {
- points.push(points[0]);
- this.hideMeshEdgeLines();
- this.meshEdgeLines.material.clippingPlanes = clippingPlanes;
- this.meshEdgeLines.geometry.setFromPoints(points);
- this.meshEdgeLines.visible = true;
- }
- },
- hideMeshEdgeLines: function () {
- this.meshEdgeLines.visible = false;
- },
- initRotateLine: function () {
- let rotateLineMaterial = new MeshLineMaterial({
- useMap: false,
- color: new THREE.Color(0xFFFF00),
- opacity: 1,
- lineWidth: 5
- });
- this.rotateLine = new THREE.Mesh(this.rotateLineMesh.geometry, rotateLineMaterial);
- },
- showRotateLine: function (rotateLine) {
- this.rotateLineGeometry.vertices.splice(0, this.rotateLineGeometry.vertices.length);
- this.rotateLineGeometry.vertices.push(rotateLine.start, rotateLine.end);
- this.rotateLineMesh.geometry.dispose();
- this.rotateLineMesh.setGeometry(this.rotateLineGeometry);
- this.rotateLine.visible = true;
- },
- hideRotateLine: function () {
- this.rotateLine.visible = false;
- },
- initClipLine: function () {
- var meshGeometry = new THREE.CylinderBufferGeometry();
- this.clipLine = new THREE.Mesh(meshGeometry, this.clipLineMaterial);
- },
- showClipLine: function (start, end) {
- this.updateClipLineByTwoPoints(start, end);
- this.clipLine.visible = true;
- },
- hideClipLine: function () {
- this.clipLine.visible = false;
- },
- hideAll: function () {
- this.hideClipLine();
- this.hideRotateLine();
- this.hideMeshEdgeLines();
- },
- //threejs two point draw a cylinder
- //https://stackoverflow.com/questions/15316127/three-js-line-vector-to-cylinder
- updateClipLineByTwoPoints: function (start, end) {
- let height = end.distanceTo(start);
- this.clipLine.geometry.dispose();
- var meshGeometry = new THREE.CylinderBufferGeometry(2, 2, height, 8, 1);
- meshGeometry.userData = end;
- this.clipLine.geometry = meshGeometry;
- this.clipLine.matrix.lookAt(start, end, this.clipLineObject3D.up);
- this.clipLine.matrix.multiply(this.clipLineMultiplyMatrix);
- this.clipLine.applyMatrix(this.initialMatrix);
- // position based on midpoints - there may be a better solution than this
- this.clipLine.position.set((end.x + start.x) / 2, (end.y + start.y) / 2, (end.z + start.z) / 2);
- }
- };
|