physics.html 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <html>
  2. <head>
  3. <meta charset="UTF-8" />
  4. <title>spine-threejs</title>
  5. <script src="https://unpkg.com/[email protected]/build/three.js"></script>
  6. <script src="../dist/iife/spine-threejs.js"></script>
  7. <script src="./OrbitalControls.js"></script>
  8. </head>
  9. <style>
  10. * {
  11. margin: 0;
  12. padding: 0;
  13. }
  14. body,
  15. html {
  16. height: 100%;
  17. }
  18. canvas {
  19. position: absolute;
  20. width: 100%;
  21. height: 100%;
  22. }
  23. </style>
  24. <body>
  25. <script>
  26. (function () {
  27. let scene, camera, renderer;
  28. let geometry, material, mesh, skeletonMesh;
  29. let assetManager;
  30. let canvas;
  31. let controls;
  32. let lastFrameTime = Date.now() / 1000;
  33. let pma = false;
  34. let baseUrl = "assets/";
  35. let skeletonFile = "celestial-circus-pro.json";
  36. let atlasFile = `celestial-circus${pma ? "-pma" : ""}.atlas`;
  37. function init() {
  38. // create the THREE.JS camera, scene and renderer (WebGL)
  39. let width = window.innerWidth,
  40. height = window.innerHeight;
  41. camera = new THREE.PerspectiveCamera(75, width / height, 1, 3000);
  42. camera.position.y = 0;
  43. camera.position.z = 800;
  44. scene = new THREE.Scene();
  45. renderer = new THREE.WebGLRenderer();
  46. renderer.setSize(width, height);
  47. document.body.appendChild(renderer.domElement);
  48. canvas = renderer.domElement;
  49. controls = new OrbitControls(camera, renderer.domElement);
  50. // load the assets required to display the Raptor model
  51. assetManager = new spine.AssetManager(baseUrl, undefined, pma);
  52. assetManager.loadText(skeletonFile);
  53. assetManager.loadTextureAtlas(atlasFile);
  54. requestAnimationFrame(load);
  55. }
  56. function load(name, scale) {
  57. if (assetManager.isLoadingComplete()) {
  58. // Add a box to the scene to which we attach the skeleton mesh
  59. geometry = new THREE.BoxGeometry(200, 200, 200);
  60. material = new THREE.MeshBasicMaterial({
  61. color: 0xff0000,
  62. wireframe: true,
  63. });
  64. mesh = new THREE.Mesh(geometry, material);
  65. scene.add(mesh);
  66. // Load the texture atlas using name.atlas and name.png from the AssetManager.
  67. // The function passed to TextureAtlas is used to resolve relative paths.
  68. atlas = assetManager.require(atlasFile);
  69. // Create a AtlasAttachmentLoader that resolves region, mesh, boundingbox and path attachments
  70. atlasLoader = new spine.AtlasAttachmentLoader(atlas);
  71. // Create a SkeletonJson instance for parsing the .json file.
  72. let skeletonJson = new spine.SkeletonJson(atlasLoader);
  73. // Set the scale to apply during parsing, parse the file, and create a new skeleton.
  74. skeletonJson.scale = 0.4;
  75. let skeletonData = skeletonJson.readSkeletonData(
  76. assetManager.require(skeletonFile)
  77. );
  78. // Create a SkeletonMesh from the data and attach it to the scene
  79. skeletonMesh = new spine.SkeletonMesh(
  80. skeletonData,
  81. (parameters) => {
  82. parameters.depthTest = true;
  83. parameters.depthWrite = true;
  84. parameters.alphaTest = 0.001;
  85. }
  86. );
  87. skeletonMesh.state.setAnimation(0, "swing", true);
  88. skeletonMesh.state.setAnimation(1, "eyeblink-long", true);
  89. mesh.add(skeletonMesh);
  90. skeletonMesh.position.y = -300;
  91. requestAnimationFrame(render);
  92. } else requestAnimationFrame(load);
  93. }
  94. let lastTime = Date.now();
  95. function render() {
  96. // calculate delta time for animation purposes
  97. let now = Date.now() / 1000;
  98. let delta = now - lastFrameTime;
  99. lastFrameTime = now;
  100. // resize canvas to use full page, adjust camera/renderer
  101. resize();
  102. // Update orbital controls
  103. controls.update();
  104. // update the animation
  105. skeletonMesh.update(delta);
  106. // render the scene
  107. renderer.render(scene, camera);
  108. requestAnimationFrame(render);
  109. }
  110. function resize() {
  111. let w = window.innerWidth;
  112. let h = window.innerHeight;
  113. if (canvas.width != w || canvas.height != h) {
  114. canvas.width = w;
  115. canvas.height = h;
  116. }
  117. camera.aspect = w / h;
  118. camera.updateProjectionMatrix();
  119. renderer.setSize(w, h);
  120. }
  121. init();
  122. })();
  123. </script>
  124. </body>
  125. </html>