Axis.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import * as THREE from "../../libs/three.js/build/three.module.js";
  2. import {MeshDraw,LineDraw} from '../utils/DrawUtil.js'
  3. /*
  4. z
  5. |
  6. |
  7. |
  8. |
  9. x <-------| 中心为点云position加boudingbox中心
  10. /
  11. /
  12. y
  13. */
  14. var lineLen = 2, stemLen = 4, arrowLen = 2, lineDisToStem = 5;
  15. var opacity = 0.5
  16. export default class Axis extends THREE.Object3D {// 坐标轴
  17. constructor (position) {
  18. super()
  19. this.getArrow()
  20. this.createArrows()
  21. //this.position.copy(position) 点云的中心点就是在(0,0,0)
  22. //this.scale.set(2,2,2)
  23. }
  24. getArrow(){
  25. var arrowGroup = new THREE.Object3D()
  26. var line = LineDraw.createLine([new THREE.Vector3, new THREE.Vector3(0,0,lineLen)])
  27. var stem = new THREE.Mesh(new THREE.BoxGeometry(0.3, 0.3, stemLen))
  28. stem.position.set(0,0,lineLen+lineDisToStem+stemLen/2);
  29. var arrow = new THREE.Mesh(new THREE.CylinderBufferGeometry( 0, 0.6, arrowLen, 12, 1, false ));//radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 8, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2
  30. arrow.position.set(0,0,lineLen+lineDisToStem+stemLen + arrowLen/2);
  31. arrow.rotation.set(Math.PI/2,0,0)
  32. arrowGroup.add(stem)
  33. arrowGroup.add(line)
  34. arrowGroup.add(arrow)
  35. this.arrowGroup = arrowGroup
  36. }
  37. createArrows(){
  38. var material = new THREE.MeshBasicMaterial({color:"#00d7df",side:2,transparent:true,opacity:0.8, depthWrite:false});
  39. let axis = Object.keys(Potree.config.axis)
  40. axis.forEach((axisText)=>{
  41. let color = Potree.config.axis[axisText].color
  42. var group = this.arrowGroup.clone()
  43. group.children.forEach(e=>{
  44. e.material = e.material.clone()
  45. /* e.material.opacity = opacity
  46. e.material.transparent = true */
  47. e.material.color.set(color)
  48. })
  49. var label = this.createLabel(axisText, color)
  50. label.position.set(0, 0, lineLen + stemLen + arrowLen + lineDisToStem + 3);
  51. group.add(label)
  52. if(axisText == 'y'){
  53. group.rotation.x = -Math.PI / 2
  54. }else if(axisText == 'x'){
  55. group.rotation.y = Math.PI / 2
  56. }
  57. this.add(group)
  58. })
  59. }
  60. createLabel(text,color){
  61. var canvas = document.createElement("canvas")
  62. var context = canvas.getContext("2d");
  63. canvas.width = 256,
  64. canvas.height = 256;
  65. var fontSize = 120
  66. context.fillStyle = color //"#00ffee";
  67. context.font = "normal " + fontSize + "px 微软雅黑"
  68. var textWidth = context.measureText(text).width;
  69. context.clearRect(0,0,canvas.width,canvas.height);
  70. context.fillText(text, (canvas.width - textWidth) / 2 , (canvas.height + fontSize) / 2);
  71. var tex = new THREE.Texture(canvas);
  72. tex.needsUpdate = true
  73. tex.minFilter = THREE.NearestFilter//防止边缘发黑
  74. tex.magFilter = THREE.NearestFilter//防止边缘发黑
  75. var sprite = new THREE.Sprite(new THREE.SpriteMaterial({
  76. map: tex , // depthWrite:false,
  77. }))
  78. sprite.renderOrder = 1//防止在透明后还是出现白矩形挡住其他mesh
  79. sprite.scale.set(3,3,3)
  80. return sprite
  81. }
  82. }