monument-app.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568
  1. if (typeof AFRAME === 'undefined') {
  2. throw new Error('Component attempted to register before AFRAME was available.');
  3. }
  4. AFRAME.registerComponent('cursor-listener', {
  5. init: function () {
  6. this.el.addEventListener('click', function (evt) {
  7. console.log('I was clicked at: ', evt.detail.intersection.point);
  8. let cursorID = 'cursor-avatar-'+ vwf_view.kernel.moniker();
  9. if (evt.detail.cursorEl.id.includes(vwf_view.kernel.moniker())) {
  10. vwf_view.kernel.fireEvent(evt.detail.target.id, "clickEvent")
  11. }
  12. //vwf_view.kernel.fireEvent(evt.detail.target.id, "clickEvent")
  13. });
  14. }
  15. });
  16. AFRAME.registerComponent('raycaster-listener', {
  17. init: function () {
  18. let self = this;
  19. this.intersected = false;
  20. this.casters = {}
  21. this.el.addEventListener('raycaster-intersected', function (evt) {
  22. if (evt.detail.el.nodeName == 'A-CURSOR') {
  23. //console.log('CURSOR was intersected at: ', evt.detail.intersection.point);
  24. } else {
  25. if (self.intersected) {
  26. } else {
  27. console.log('I was intersected at: ', evt.detail.intersection.point);
  28. vwf_view.kernel.fireEvent(evt.detail.target.id, "intersectEvent")
  29. }
  30. self.casters[evt.detail.el.id] = evt.detail.el;
  31. self.intersected = true;
  32. }
  33. });
  34. this.el.addEventListener('raycaster-intersected-cleared', function (evt) {
  35. if (evt.detail.el.nodeName == 'A-CURSOR') {
  36. //console.log('CURSOR was intersected at: ', evt.detail.intersection.point);
  37. } else {
  38. if (self.intersected) {
  39. console.log('Clear intersection');
  40. if (Object.entries(self.casters).length == 1 && (self.casters[evt.detail.el.id] !== undefined))
  41. {
  42. vwf_view.kernel.fireEvent(evt.detail.target.id, "clearIntersectEvent")
  43. }
  44. delete self.casters[evt.detail.el.id]
  45. } else {}
  46. self.intersected = false;
  47. }
  48. });
  49. }
  50. });
  51. AFRAME.registerComponent('envmap', {
  52. /**
  53. * Creates a new THREE.ShaderMaterial using the two shaders defined
  54. * in vertex.glsl and fragment.glsl.
  55. */
  56. init: function () {
  57. const data = this.data;
  58. //this.applyToMesh();
  59. this.el.addEventListener('model-loaded', () => this.applyToMesh());
  60. },
  61. /**
  62. * Update the ShaderMaterial when component data changes.
  63. */
  64. update: function () {
  65. },
  66. getEnvMap: function () {
  67. var path = './assets/textures/skybox2/';
  68. var format = '.jpg';
  69. var urls = [
  70. path + 'px' + format, path + 'nx' + format,
  71. path + 'py' + format, path + 'ny' + format,
  72. path + 'pz' + format, path + 'nz' + format
  73. ];
  74. envMap = new THREE.CubeTextureLoader().load(urls);
  75. envMap.format = THREE.RGBFormat;
  76. return envMap;
  77. },
  78. /**
  79. * Apply the material to the current entity.
  80. */
  81. applyToMesh: function () {
  82. const mesh = this.el.getObject3D('mesh');
  83. //var scene = mesh;
  84. var envMap = this.getEnvMap();
  85. mesh.traverse(function (node) {
  86. if (node.material) {
  87. node.material.side = THREE.BackSide;
  88. node.material.needsUpdate = true;
  89. //side = THREE.DoubleSide; break;
  90. }
  91. });
  92. mesh.traverse(function (node) {
  93. if (node.material && (node.material.isMeshStandardMaterial ||
  94. (node.material.isShaderMaterial && node.material.envMap !== undefined))) {
  95. node.material.envMap = envMap;
  96. node.material.needsUpdate = true;
  97. }
  98. });
  99. // const mesh = this.el.getObject3D('mesh');
  100. // if (mesh) {
  101. // mesh.material = this.material;
  102. // }
  103. },
  104. /**
  105. * On each frame, update the 'time' uniform in the shaders.
  106. */
  107. tick: function (t) {
  108. }
  109. })
  110. //https://threejs.org/examples/webgl_shaders_sky.html
  111. AFRAME.registerComponent('skyshader', {
  112. init: function () {
  113. let sunSphereEl = document.querySelector('a-scene').querySelector('#sun');
  114. this.sunSphere = sunSphereEl.object3D;
  115. this.sky = new THREE.Sky();
  116. let scene = this.el.sceneEl;
  117. let effectController = {
  118. turbidity: 5,
  119. rayleigh: 2,
  120. mieCoefficient: 0.005,
  121. mieDirectionalG: 0.8,
  122. luminance: 1,
  123. inclination: 0, // elevation / inclination
  124. azimuth: 0.25, // Facing front,
  125. sun: ! true
  126. };
  127. let uniforms = this.sky.uniforms;
  128. uniforms.turbidity.value = effectController.turbidity;
  129. uniforms.rayleigh.value = effectController.rayleigh;
  130. uniforms.luminance.value = effectController.luminance;
  131. uniforms.mieCoefficient.value = effectController.mieCoefficient;
  132. uniforms.mieDirectionalG.value = effectController.mieDirectionalG;
  133. this.el.setObject3D('mesh', this.sky.mesh);
  134. let distance = 400000;
  135. var theta = Math.PI * (effectController.inclination - 0.5);
  136. var phi = 2 * Math.PI * (effectController.azimuth - 0.5);
  137. this.sunSphere.position.x = distance * Math.cos(phi);
  138. this.sunSphere.position.y = distance * Math.sin(phi) * Math.sin(theta);
  139. this.sunSphere.position.z = distance * Math.sin(phi) * Math.cos(theta);
  140. this.sunSphere.visible = effectController.sun;
  141. this.sky.uniforms.sunPosition.value.copy(this.sunSphere.position);
  142. },
  143. update: function () {
  144. },
  145. tick: function (t) {
  146. }
  147. })
  148. AFRAME.registerComponent('sun', {
  149. init: function () {
  150. this.sunSphere = new THREE.Mesh(
  151. new THREE.SphereBufferGeometry(20000, 16, 8),
  152. new THREE.MeshBasicMaterial({ color: 0xffffff })
  153. );
  154. this.sunSphere.position.y = - 700000;
  155. this.sunSphere.visible = true;
  156. this.el.setObject3D('mesh', this.sunSphere);
  157. },
  158. update: function () {
  159. },
  160. tick: function (t) {
  161. }
  162. })
  163. AFRAME.registerComponent('avatarbvh0', {
  164. /**
  165. * Creates a new THREE.ShaderMaterial using the two shaders defined
  166. * in vertex.glsl and fragment.glsl.
  167. */
  168. init: function () {
  169. let skeletonHelper;
  170. let self = this;
  171. this.clock = new THREE.Clock();
  172. let loader = new THREE.BVHLoader();
  173. loader.load("./assets/walk.bvh", function (result) {
  174. skeletonHelper = new THREE.SkeletonHelper(result.skeleton.bones[0]);
  175. skeletonHelper.skeleton = result.skeleton; // allow animation mixer to bind to SkeletonHelper directly
  176. //var material = new THREE.LineBasicMaterial( { vertexColors: THREE.VertexColors, depthTest: false, depthWrite: false, transparent: true } );
  177. skeletonHelper.material.depthTest = true;
  178. skeletonHelper.material.lineWidth = 10.0;
  179. skeletonHelper.material.depthWrite = true;
  180. skeletonHelper.material.transparent = false;
  181. skeletonHelper.material.flatShading = true;
  182. var boneContainer = new THREE.Group();
  183. boneContainer.add(result.skeleton.bones[0]);
  184. self.el.setObject3D('skeletonHelper', skeletonHelper);
  185. self.el.setObject3D('mesh', boneContainer);
  186. //scene.add( skeletonHelper );
  187. // scene.add( boneContainer );
  188. // play animation
  189. self.mixer = new THREE.AnimationMixer(skeletonHelper);
  190. self.mixer.clipAction(result.clip).setEffectiveWeight(1.0).play();
  191. });
  192. },
  193. /**
  194. * Update the ShaderMaterial when component data changes.
  195. */
  196. update: function () {
  197. },
  198. tick: function (t) {
  199. var delta = this.clock.getDelta();
  200. if (this.mixer) this.mixer.update(delta);
  201. }
  202. })
  203. AFRAME.registerComponent('avatarbvh', {
  204. init: function () {
  205. let helper;
  206. let self = this;
  207. this.clock = new THREE.Clock();
  208. console.log(this.el.object3D);
  209. this.el.addEventListener('model-loaded', function (evt) {
  210. const model = evt.detail.model
  211. console.log(model);
  212. // let loader = new THREE.BVHLoader();
  213. // loader.load("./assets/walk.bvh", function (bvh) {
  214. // console.log(model);
  215. // self.mixer = new THREE.AnimationMixer(model.children[0].children[0]);
  216. // self.mixer.clipAction(bvh.clip).setEffectiveWeight(1.0).play();
  217. // })
  218. //console.log(evt);
  219. self.mixer = new THREE.AnimationMixer(model);
  220. self.mixer.clipAction(model.animations[0]).setEffectiveWeight(1.0).play();
  221. })
  222. let loader = new THREE.BVHLoader();
  223. loader.load("./assets/walk.bvh", function (bvh) {
  224. const mesh = self.el.object3D;
  225. //mesh.material.skinning = true;
  226. // mesh.updateMatrixWorld();
  227. // mesh.skeleton.calculateInverses();
  228. // mesh.normalizeSkinWeights ()
  229. // See example from THREE.Skeleton for the armSkeleton
  230. // var rootBone = bvh.skeleton.bones[0]
  231. // mesh.add( rootBone );
  232. // mesh.bind( bvh.skeleton );
  233. // skeletonHelper = new THREE.SkeletonHelper(mesh);
  234. // self.mixer = new THREE.AnimationMixer(mesh );
  235. // self.mixer.clipAction(bvh.clip).setEffectiveWeight(1.0).play();
  236. })
  237. },
  238. update: function () {
  239. },
  240. tick: function (t) {
  241. var delta = this.clock.getDelta();
  242. // update skeletal animcation
  243. if (this.mixer){
  244. this.mixer.update(delta)
  245. }
  246. }
  247. })
  248. AFRAME.registerComponent('avatarbvh_best', {
  249. /**
  250. * Creates a new THREE.ShaderMaterial using the two shaders defined
  251. * in vertex.glsl and fragment.glsl.
  252. */
  253. createBones: function (object, jsonBones) {
  254. /* adapted from the THREE.SkinnedMesh constructor */
  255. // create bone instances from json bone data
  256. const bones = jsonBones.map(gbone => {
  257. bone = new THREE.Bone()
  258. bone.name = gbone.name
  259. bone.position.fromArray(gbone.pos)
  260. bone.quaternion.fromArray(gbone.rotq)
  261. if (gbone.scl !== undefined) bone.scale.fromArray(gbone.scl)
  262. return bone
  263. })
  264. // add bone instances to the root object
  265. jsonBones.forEach((gbone, index) => {
  266. if (gbone.parent !== -1 && gbone.parent !== null && bones[gbone.parent] !== undefined) {
  267. bones[gbone.parent].add(bones[index])
  268. } else {
  269. // object.add(bones[index])
  270. }
  271. })
  272. return bones
  273. },
  274. createSkinnedMesh: function (mesh, skeleton) {
  275. // create SkinnedMesh from static mesh geometry and swap it in the scene graph
  276. const skinnedMesh = new THREE.SkinnedMesh(mesh.geometry, mesh.material)
  277. skinnedMesh.castShadow = true
  278. skinnedMesh.receiveShadow = true
  279. // bind to skeleton
  280. skinnedMesh.bind(skeleton)
  281. // swap mesh for skinned mesh
  282. //mesh.parent.add(skinnedMesh)
  283. // mesh.parent.remove(mesh)
  284. return skinnedMesh
  285. },
  286. init: function () {
  287. let helper;
  288. let self = this;
  289. this.clock = new THREE.Clock();
  290. let loader = new THREE.BVHLoader();
  291. loader.load("./assets/walk.bvh", function (bvh) {
  292. // skeletonHelper = new THREE.SkeletonHelper(result.skeleton.bones[0]);
  293. // skeletonHelper.skeleton = result.skeleton; // allow animation mixer to bind to SkeletonHelper directly
  294. self.bvhData = bvh;
  295. new THREE.GLTFLoader().load("./assets/av2/avatar.gltf", result => {
  296. let scene = result
  297. const mesh = new THREE.SkinnedMesh(
  298. result,
  299. new THREE.MeshPhongMaterial()
  300. );
  301. mesh.material.skinning = true;
  302. //group.add( mesh );
  303. mesh.updateMatrixWorld();
  304. mesh.skeleton.calculateInverses();
  305. mesh.normalizeSkinWeights ()
  306. // See example from THREE.Skeleton for the armSkeleton
  307. var rootBone = self.bvhData.skeleton.bones[0]
  308. mesh.add( rootBone );
  309. // Bind the skeleton to the mesh
  310. mesh.bind( self.bvhData.skeleton );
  311. skeletonHelper = new THREE.SkeletonHelper(mesh);
  312. //skeletonHelper.skeleton = self.bvhData.skeleton;
  313. //var boneContainer = new THREE.Group();
  314. // boneContainer.add(mesh);
  315. // mesh.bind(self.bvhData.skeleton, mesh.matrixWorld)
  316. // const bones = self.createBones(result, result.bones)
  317. // mesh.updateMatrixWorld()
  318. // let skeleton = new THREE.Skeleton(bones, undefined, true)
  319. // mesh.bind(skeleton, mesh.matrixWorld)
  320. // let body = self.createSkinnedMesh(mesh, skeleton)
  321. // skeletonHelper = new THREE.SkeletonHelper(body);
  322. self.el.setObject3D('mesh', mesh)
  323. //self.el.setObject3D('mesh',boneContainer)
  324. self.mixer = new THREE.AnimationMixer(mesh );
  325. self.mixer.clipAction(self.bvhData.clip).setEffectiveWeight(1.0).play();
  326. //self.mixer.clipAction( mesh.geometry.animations[ 0 ] ).play();
  327. // const mesh = new THREE.SkinnedMesh(
  328. // result,
  329. // new THREE.MeshPhongMaterial()
  330. // );
  331. // mesh.material.skinning = true;
  332. // self.el.setObject3D('mesh', mesh)
  333. // self.mixer = new THREE.AnimationMixer( mesh );
  334. // self.mixer.clipAction( mesh.geometry.animations[ 0 ] ).play();
  335. // find armature root object.
  336. // This is a group instance with a userData.bones property
  337. // containing bones in the same format as would normally be
  338. // found on a SkinnedMesh Geometry instance
  339. //let root = scene.getObjectByName('Human')
  340. // manually create bones and parent them to the root object
  341. // NOTE: This is normally done in the SkinnedMesh constructor
  342. // const bones = self.createBones(root, root.userData.bones)
  343. // const bones = bvh.skeleton.bones[0]
  344. // Important! must update world matrices before creating skeleton instance
  345. //result.updateMatrixWorld()
  346. // create skeleton
  347. // let skeleton = new THREE.Skeleton(bones, undefined, true)
  348. // const skinnedMesh = new THREE.SkinnedMesh(result, null)
  349. // skinnedMesh.bind(skeleton, mesh.matrixWorld)
  350. // create SkinnedMesh from static mesh geometry
  351. // let body = self.createSkinnedMesh(root.getObjectByName('Body'), skeleton)
  352. //let body = self.createSkinnedMesh(result, skeleton)
  353. //let clothes = self.createSkinnedMesh(root.getObjectByName('Clothes'), skeleton)
  354. // create skeleton helper
  355. // self.helper = new THREE.SkeletonHelper(root)
  356. // scene.add(self.helper)
  357. // self.el.setObject3D('mesh', scene)
  358. // self.el.setObject3D('mesh', clothes)
  359. //self.el.setObject3D('skeletonHelper', self.helper)
  360. // scene.add( helper )
  361. // skeletal animation
  362. // self.mixer = new THREE.AnimationMixer(root);
  363. //self.mixer.clipAction(scene.animations[0]).play()
  364. // self.mixer.clipAction(bvh.clip).setEffectiveWeight(1.0).play();
  365. // let action = self.mixer.clipAction( scene.animations[ 0 ] ).play();
  366. //action.enabled = true;
  367. // self.mixer = new THREE.AnimationMixer(self.helper);
  368. // self.mixer.clipAction(scene.animations[0]).play();
  369. // start
  370. //animate()
  371. })
  372. })
  373. },
  374. /**
  375. * Update the ShaderMaterial when component data changes.
  376. */
  377. update: function () {
  378. },
  379. tick: function (t) {
  380. var delta = this.clock.getDelta();
  381. // update skeletal animcation
  382. if (this.mixer){
  383. this.mixer.update(delta)
  384. // update skeleton helper
  385. //this.helper.update()
  386. }
  387. }
  388. })