AxisViewer.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. import * as THREE from "../../../../libs/three.js/build/three.module.js";
  2. import {ViewerBase} from "../../viewer/viewerBase.js"
  3. import Viewport from "../../viewer/Viewport.js"
  4. import {ExtendView} from "../../../viewer/ExtendView.js"
  5. import {LineDraw/* , MeshDraw */} from "../../utils/DrawUtil.js";
  6. import {TextSprite} from '../TextSprite.js'
  7. export default class AxisViewer extends ViewerBase{
  8. constructor(listenViewport, parentArea, options={}){
  9. let domElement = $(`<div name="Axisdom" viewport=${listenViewport.name}></div>`)
  10. $(parentArea).append(domElement)
  11. let posInfo = Object.assign({
  12. //default:
  13. right: 0, top:0, width:'100px', height:'100px'
  14. },options.domStyle,{
  15. position:'absolute'
  16. })
  17. if(options.domStyle){
  18. if(options.domStyle.bottom != void 0){
  19. delete posInfo.top
  20. }
  21. if(options.domStyle.left != void 0){
  22. delete posInfo.right
  23. }
  24. }
  25. domElement.css(posInfo)
  26. super(domElement[0],{name:'axis', antialias:true } )
  27. this.listenViewport = listenViewport
  28. Object.defineProperty(listenViewport, 'axis', {
  29. value: this,
  30. writable: true, // 可写(可选)
  31. enumerable: false, // 不可枚举
  32. configurable: true // 可配置(可选)
  33. });
  34. this.scene = new THREE.Scene
  35. //this.camera = new THREE.PerspectiveCamera(30, 1, 1, this.radius*3);
  36. let w = 50
  37. this.camera = new THREE.OrthographicCamera(-w/2,w/2,w/2,-w/2 , 1, w*4);
  38. this.camera.zoom = 2.7//(domElement.clientWidth || 300) / w * 1.267//zoom越大视野越小
  39. this.camera.updateProjectionMatrix()
  40. this.view = new ExtendView();
  41. this.view.radius = 70
  42. this.viewports = [new Viewport( this.view, this.camera, {
  43. left:0, bottom:0, width:1, height: 1, name:'axis'
  44. }) ]
  45. this.updateScreenSize()
  46. this.createAxis()
  47. let updateCamera = e => {
  48. if (e.viewport == listenViewport && e.changeInfo.quaternionChanged) {
  49. this.update()
  50. }
  51. }
  52. viewer.addEventListener('camera_changed', updateCamera)
  53. let repos = ()=>{
  54. if(!listenViewport.active || listenViewport.width == 0 || listenViewport.height == 0){
  55. return domElement.css('visibility','hidden')
  56. }
  57. domElement.css('visibility','visible')
  58. let props = [['left','right', 'width'],['bottom','top', 'height']]
  59. let set = (prop)=>{
  60. let str
  61. let name = posInfo[prop[1]] != void 0 ? prop[1] : prop[0]
  62. let percent = posInfo[prop[1]] != void 0 ? (1-listenViewport[prop[0]] - listenViewport[prop[2]]) : listenViewport[prop[0]]
  63. if(posInfo[name] == 0 || posInfo[name].includes('%')){
  64. str = (parseFloat(posInfo[name]) + percent * 100) + '%'
  65. }else{//px
  66. str = 'calc('+(percent * 100) + '% + ' + posInfo[name] + ')'
  67. }
  68. domElement.css(name, str)
  69. }
  70. set(props[0])
  71. set(props[1])
  72. }
  73. this.listenViewport.addEventListener('resize',repos)
  74. this.addEventListener('dispose',()=>{
  75. viewer.removeEventListener('camera_changed', updateCamera)
  76. viewer.removeEventListener('resize', repos)
  77. })
  78. repos()
  79. this.update()
  80. }
  81. createAxis(){
  82. let axis = new THREE.Object3D
  83. ;['x','y','z'].forEach((axisText)=>{
  84. let color = new THREE.Color().set(Potree.config.axis[axisText].color)
  85. let group = new THREE.Object3D
  86. let line = LineDraw.createLine([new THREE.Vector3, new THREE.Vector3(0,0,7)],{color})
  87. let label = this.createLabel(axisText, color)
  88. label.position.set(0,0,11 /* + this.renderArea.clientWidth/200 */);
  89. if(axisText == 'y'){
  90. group.rotation.x = -Math.PI / 2
  91. }else if(axisText == 'x'){
  92. group.rotation.y = Math.PI / 2
  93. }
  94. group.add(line)
  95. group.add(label)
  96. axis.add(group)
  97. })
  98. this.axis = axis;
  99. this.scene.add(this.axis)
  100. }
  101. createLabel(text, color){
  102. let fontsize = this.renderArea.clientWidth / 5 //20//Math.round( Potree.math.linearClamp(this.renderArea.clientWidth, [80,500],[12,50]))
  103. let s = 3100 / this.renderArea.clientWidth
  104. console.log('fontsize',fontsize)
  105. let label = new TextSprite({
  106. backgroundColor: {r: 0, g: 0, b: 0, a:0},
  107. textColor: {r: color.r * 255, g: color.g*255, b: color.b*255, a:1},
  108. fontsize,
  109. //useDepth : true ,
  110. renderOrder : 5,// pickOrder:5,
  111. fontWeight:'Lighter',
  112. text, name:'axis' ,
  113. viewports: this.viewports
  114. })
  115. label.scale.set(s,s,s)
  116. return label
  117. }
  118. update(){
  119. this.updateCamera()
  120. this.render()
  121. }
  122. updateCamera(){
  123. let view = this.listenViewport.view
  124. this.view.yaw = view.yaw
  125. this.view.pitch = view.pitch
  126. var dir = view.direction; //相机朝向
  127. this.view.position.copy(dir.multiplyScalar(this.view.radius).negate()) //相机绕着指南针中心(000)转动
  128. this.view.applyToCamera(this.camera)
  129. }
  130. render(){
  131. viewer.dispatchEvent({type:"render.begin", viewport:this.viewports[0]}) //update sprite
  132. this.renderer.render(this.scene, this.camera)
  133. }
  134. dispose(){
  135. this.axis.traverse((child)=>{
  136. if(child instanceof TextSprite){
  137. child.dispose()
  138. }else if(child instanceof THREE.LineSegments){
  139. child.material.dispose();
  140. child.geometry.dispose()
  141. }
  142. })
  143. super.dispose()
  144. this.renderArea.parentElement.removeChild(this.renderArea)
  145. delete this.listenViewport.axis
  146. }
  147. }