threepipe
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

Object3DGeneratorPlugin.ts 6.2KB

1 год назад
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. import {AViewerPluginSync} from '../../viewer'
  2. import {
  3. AmbientLight2,
  4. DirectionalLight2,
  5. HemisphereLight2,
  6. IObject3D,
  7. Object3D2,
  8. OrthographicCamera2,
  9. PerspectiveCamera2,
  10. PointLight2,
  11. RectAreaLight2,
  12. SpotLight2,
  13. } from '../../core'
  14. import {uiButton, uiDropdown, uiPanelContainer} from 'uiconfig.js'
  15. import {Vector3} from 'three'
  16. /**
  17. * Adds support for generating different types of lights and camera objects in the viewer.
  18. * @category Plugins
  19. */
  20. @uiPanelContainer('Generate Scene Objects')
  21. export class Object3DGeneratorPlugin extends AViewerPluginSync {
  22. public static readonly PluginType = 'Object3DGeneratorPlugin'
  23. enabled = true
  24. toJSON: any = undefined
  25. @uiDropdown('Type', undefined, (that)=>({
  26. children: [()=>Object.keys(that.generators).map(label=>({label}))],
  27. }))
  28. protected _selectedType = ''
  29. @uiButton('Generate', {sendArgs: false})
  30. generate(type?: string, params?: any, addToScene = true, select = true) {
  31. if (!this._viewer) throw new Error('No viewer')
  32. const obj = this.generators[type ?? this._selectedType]?.(params)
  33. addToScene && obj && this._viewer.scene.addObject(obj)
  34. select && obj.dispatchEvent({type: 'select', value: obj, object: obj, ui: true})
  35. return obj
  36. }
  37. generators: Record<string, (params?: any)=>IObject3D> = {
  38. ['object-empty']: (params: {
  39. position?: Vector3,
  40. name?: string,
  41. } = {})=>{
  42. const obj = new Object3D2()
  43. params.position ? obj.position.copy(params.position) : obj.position.set(0, 0, 0)
  44. obj.name = params.name ?? 'New Object'
  45. return obj
  46. },
  47. ['camera-perspective']: (params: {
  48. controlsMode?: string,
  49. autoAspect?: boolean,
  50. fov?: number,
  51. aspect?: number,
  52. position?: Vector3,
  53. target?: Vector3,
  54. autoLookAtTarget?: boolean,
  55. name?: string,
  56. } = {})=>{
  57. const camera = new PerspectiveCamera2(
  58. params.controlsMode ?? '',
  59. this._viewer?.canvas,
  60. params.autoAspect,
  61. params.fov,
  62. params.aspect,
  63. )
  64. params.position ? camera.position.copy(params.position) : camera.position.set(0, 0, 5)
  65. params.target ? camera.target.copy(params.target) : camera.target.set(0, 0, 0)
  66. camera.autoLookAtTarget = params.autoLookAtTarget ?? true
  67. camera.setDirty()
  68. camera.name = params.name ?? 'Perspective Camera'
  69. return camera
  70. },
  71. ['camera-orthographic']: (params: {
  72. controlsMode?: string,
  73. autoAspect?: boolean,
  74. frustumSize?: number,
  75. position?: Vector3,
  76. target?: Vector3,
  77. autoLookAtTarget?: boolean,
  78. name?: string,
  79. } = {})=>{
  80. const camera = new OrthographicCamera2(
  81. params.controlsMode ?? '',
  82. this._viewer?.canvas,
  83. params.autoAspect,
  84. params.frustumSize,
  85. )
  86. params.position ? camera.position.copy(params.position) : camera.position.set(0, 0, 5)
  87. params.target ? camera.target.copy(params.target) : camera.target.set(0, 0, 0)
  88. camera.autoLookAtTarget = params.autoLookAtTarget ?? true
  89. camera.setDirty()
  90. camera.name = params.name ?? 'Orthographic Camera'
  91. return camera
  92. },
  93. ['light-directional']: (params: {
  94. color?: number,
  95. intensity?: number,
  96. position?: Vector3,
  97. target?: Vector3,
  98. name?: string,
  99. } = {})=>{
  100. const light = new DirectionalLight2(params.color ?? 0xff0000, params.intensity ?? 3)
  101. params.position ? light.position.copy(params.position) : light.position.set(5, 5, 5)
  102. light.lookAt(params.target ?? new Vector3(0, 0, 0))
  103. light.name = 'Directional Light'
  104. return light
  105. },
  106. ['light-ambient']: (params: {
  107. color?: number,
  108. intensity?: number,
  109. name?: string,
  110. } = {})=>{
  111. const light = new AmbientLight2(params.color ?? 0xffffff, params.intensity ?? 1)
  112. light.name = 'Ambient Light'
  113. return light
  114. },
  115. ['light-point']: (params: {
  116. color?: number,
  117. intensity?: number,
  118. position?: Vector3,
  119. name?: string,
  120. } = {})=>{
  121. const light = new PointLight2(params.color ?? 0xff0000, params.intensity ?? 3)
  122. params.position ? light.position.copy(params.position) : light.position.set(5, 5, 5)
  123. light.name = 'Point Light'
  124. return light
  125. },
  126. ['light-spot']: (params: {
  127. color?: number,
  128. intensity?: number,
  129. position?: Vector3,
  130. target?: Vector3,
  131. name?: string,
  132. } = {})=>{
  133. const light = new SpotLight2(params.color ?? 0xff0000, params.intensity ?? 3)
  134. params.position ? light.position.copy(params.position) : light.position.set(5, 5, 5)
  135. light.lookAt(params.target ?? new Vector3(0, 0, 0))
  136. light.name = 'Spot Light'
  137. return light
  138. },
  139. ['light-hemisphere']: (params: {
  140. color?: number,
  141. intensity?: number,
  142. name?: string,
  143. } = {})=>{
  144. const light = new HemisphereLight2(params.color ?? 0xaaaaff, 0x555443, params.intensity ?? 1)
  145. light.name = 'Hemisphere Light'
  146. return light
  147. },
  148. ['light-rect-area']: (params: {
  149. color?: number,
  150. intensity?: number,
  151. position?: Vector3,
  152. target?: Vector3,
  153. name?: string,
  154. } = {})=>{
  155. const light = new RectAreaLight2(params.color ?? 0x000ff, params.intensity ?? 3, 2, 2)
  156. params.position ? light.position.copy(params.position) : light.position.set(5, 5, 5)
  157. light.lookAt(params.target ?? new Vector3(0, 0, 0))
  158. light.name = 'Rect Area Light'
  159. return light
  160. },
  161. }
  162. constructor() {
  163. super()
  164. this._selectedType = Object.keys(this.generators)[0]
  165. }
  166. }