webgl_loader_x.html 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336
  1. <!DOCTYPE html>
  2. <html lang='en'>
  3. <head>
  4. <title>three.js webgl - loaders - X-File loader</title>
  5. <meta charset='utf-8'>
  6. <meta name='viewport' content='width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0'>
  7. <style>
  8. body {
  9. font-family: Monospace;
  10. background-color: #000;
  11. color: #fff;
  12. margin: 0px;
  13. overflow: hidden;
  14. }
  15. #info {
  16. color: #fff;
  17. position: absolute;
  18. top: 10px;
  19. width: 100%;
  20. text-align: center;
  21. z-index: -1;
  22. display: block;
  23. }
  24. #info a,
  25. .button {
  26. color: #f00;
  27. font-weight: bold;
  28. text-decoration: underline;
  29. cursor: pointer;
  30. }
  31. </style>
  32. </head>
  33. <body>
  34. <div id='info'>
  35. <a href='http://threejs.org' target='_blank'>three.js</a> - X-File Loader test<br />
  36. </div>
  37. <script src='../build/three.js'></script>
  38. <script src='js/controls/OrbitControls.js'></script>
  39. <script src='js/loaders/XLoader.js'></script>
  40. <script src='js/Detector.js'></script>
  41. <script src='js/libs/stats.min.js'></script>
  42. <script src='js/libs/dat.gui.min.js'></script>
  43. <script>
  44. if (!Detector.webgl) Detector.addGetWebGLMessage();
  45. var container, stats, controls;
  46. var camera, scene, renderer;
  47. var clock = new THREE.Clock();
  48. var gui = new dat.GUI();
  49. var mixers = [];
  50. var manager = null;
  51. var Texloader = null;
  52. var ParentList = null;
  53. var skeletonHelper = null;
  54. var Models = [];
  55. var animateInf = null;
  56. var DashAnime = null;
  57. var d = new Date();
  58. var LastDateTime = null;
  59. var animates = [];
  60. var actions = [];
  61. init();
  62. function init() {
  63. LastDateTime = Date.now();
  64. container = document.createElement('div');
  65. document.body.appendChild(container);
  66. container.style.zIndex = -10;
  67. camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 2000);
  68. scene = new THREE.Scene();
  69. scene.add(new THREE.AmbientLight(0x999999));
  70. // grid
  71. var gridHelper = new THREE.GridHelper(14, 1, 0x303030, 0x303030);
  72. gridHelper.position.set(0, -0.04, 0);
  73. scene.add(gridHelper);
  74. // stats
  75. stats = new Stats();
  76. container.appendChild(stats.dom);
  77. // model
  78. manager = new THREE.LoadingManager();
  79. manager.onProgress = function (item, loaded, total) {
  80. console.log(item, loaded, total);
  81. };
  82. var onProgress = function (xhr) {
  83. if (xhr.lengthComputable) {
  84. var percentComplete = xhr.loaded / xhr.total * 100;
  85. console.log(Math.round(percentComplete, 2) + '% downloaded');
  86. }
  87. };
  88. var onError = function (xhr) {
  89. console.log('Errror Loading!');
  90. };
  91. Texloader = new THREE.TextureLoader();
  92. var loader = new THREE.XLoader(manager, Texloader);
  93. // ! If [ Texture ] was reversed Y axis, enable the following.
  94. // THREE.XLoader.IsUvYReverse = false;
  95. // ! And if [ Model ] was reversed polygons, enable the following.
  96. // loader.load([' your model url ', true ], function (object) {
  97. // read (download) model file
  98. loader.load(['models/xfile/SSR06_Born2.x', false], function (object) {
  99. for (var i = 0; i < object.FrameInfo.length; i++) {
  100. Models.push(object.FrameInfo[i]);
  101. scene.add(Models[i]);
  102. if (Models[i] instanceof THREE.SkinnedMesh) {
  103. skeletonHelper = new THREE.SkeletonHelper(Models[i]);
  104. scene.add(skeletonHelper);
  105. if (object.XAnimationObj !== undefined && object.XAnimationObj.length !== 0) {
  106. Models[i].geometry.animations = [];
  107. /*
  108. * ↓ that is BASIC animation data code.
  109. * Usually, please use this.
  110. * Because of the data I have, I use a different code
  111. *
  112. for (var a = 0; a < object.XAnimationObj.length; a++) {
  113. Models[i].geometry.animations.push(THREE.AnimationClip.parseAnimation(object.XAnimationObj[a], Models[i].skeleton.bones));
  114. }
  115. Models[i].mixer = new THREE.AnimationMixer(Models[i]);
  116. animates.push(Models[i].mixer);
  117. var action = Models[i].mixer.clipAction(Models[i].geometry.animations[0]);
  118. action.play();
  119. */
  120. // ↓ that is a code for [ All animation-keyframes are connected data ]. output from 'LightWave3D'
  121. {
  122. Models[i].geometry.animations.push(THREE.AnimationClip.parseAnimation(splitAnimation(object.XAnimationObj[0], 'stand', 10 * object.XAnimationObj[0].fps, 11 * object.XAnimationObj[0].fps), Models[i].skeleton.bones));
  123. Models[i].geometry.animations.push(THREE.AnimationClip.parseAnimation(splitAnimation(object.XAnimationObj[0], 'walk', 50 * object.XAnimationObj[0].fps, 80 * object.XAnimationObj[0].fps), Models[i].skeleton.bones));
  124. Models[i].geometry.animations.push(THREE.AnimationClip.parseAnimation(splitAnimation(object.XAnimationObj[0], 'dash', 140 * object.XAnimationObj[0].fps, 160 * object.XAnimationObj[0].fps), Models[i].skeleton.bones));
  125. Models[i].geometry.animations.push(THREE.AnimationClip.parseAnimation(splitAnimation(object.XAnimationObj[0], 'dashing', 160 * object.XAnimationObj[0].fps, 165 * object.XAnimationObj[0].fps), Models[i].skeleton.bones));
  126. Models[i].geometry.animations.push(THREE.AnimationClip.parseAnimation(splitAnimation(object.XAnimationObj[0], 'damage', 500 * object.XAnimationObj[0].fps, 530 * object.XAnimationObj[0].fps), Models[i].skeleton.bones));
  127. Models[i].mixer = new THREE.AnimationMixer(Models[i]);
  128. animates.push(Models[i].mixer);
  129. var stand = Models[i].mixer.clipAction('stand');
  130. // stand.play();
  131. stand.setLoop(THREE.LoopRepeat);
  132. actions['stand'] = stand;
  133. var walk = Models[i].mixer.clipAction('walk');
  134. walk.setLoop(THREE.LoopRepeat);
  135. walk.play();
  136. actions['walk'] = walk;
  137. var dash = Models[i].mixer.clipAction('dash');
  138. dash.setLoop(THREE.LoopOnce);
  139. //dash.play();
  140. actions['dash'] = dash;
  141. var dashing = Models[i].mixer.clipAction('dashing');
  142. dashing.setLoop(THREE.LoopPingPong);
  143. // dashing.play();
  144. actions['dashing'] = dashing;
  145. var damage = Models[i].mixer.clipAction('damage');
  146. damage.setLoop(THREE.LoopRepeat);
  147. //damage.play();
  148. actions['damage'] = damage;
  149. var ActionKeys = Object.keys(actions);
  150. var dmy = {};
  151. dmy.gui = '';
  152. dmy.action = '';
  153. gui.add(dmy, 'action', ActionKeys).onChange(function (v) {
  154. animates[0].stopAllAction();
  155. actions[v].play();
  156. });
  157. }
  158. ///////////
  159. }
  160. }
  161. }
  162. object = null;
  163. }, onProgress, onError);
  164. renderer = new THREE.WebGLRenderer();
  165. renderer.setPixelRatio(window.devicePixelRatio);
  166. renderer.setSize(window.innerWidth, window.innerHeight);
  167. renderer.setClearColor(0x666666);
  168. container.appendChild(renderer.domElement);
  169. controls = new THREE.OrbitControls(camera, renderer.domElement);
  170. controls.target.set(0, 12, 0);
  171. camera.position.set(2, 18, 28);
  172. camera.up.set(0, 1, 0);
  173. var light = new THREE.DirectionalLight(0xeeeeff, 2);
  174. light.position.set(10, 100, 1).normalize();
  175. scene.add(light);
  176. light = new THREE.DirectionalLight(0x555588);
  177. light.position.set(-1, -1, -1).normalize();
  178. scene.add(light);
  179. controls.update();
  180. window.addEventListener('resize', onWindowResize, false);
  181. animate();
  182. }
  183. function onWindowResize() {
  184. camera.aspect = window.innerWidth / window.innerHeight;
  185. camera.updateProjectionMatrix();
  186. renderer.setSize(window.innerWidth, window.innerHeight);
  187. }
  188. //
  189. function animate() {
  190. requestAnimationFrame(animate);
  191. var nowTime = Date.now();
  192. var dulTime = nowTime - LastDateTime;
  193. LastDateTime = nowTime;
  194. if (animates != null && animates.length > 0) {
  195. for (var i = 0; i < animates.length; i++) {
  196. animates[i].update(dulTime);
  197. }
  198. }
  199. if (Models != null && Models.length > 0 && skeletonHelper != null) { skeletonHelper.update(); }
  200. stats.update();
  201. render();
  202. }
  203. function render() {
  204. renderer.render(scene, camera);
  205. }
  206. /////////////////
  207. /// this is not must mount codes.
  208. // split One and Long Animation, for time
  209. function splitAnimation(_baseAnime, _name, _beginTime, _endTime) {
  210. var Animation = {};
  211. Animation.fps = _baseAnime.fps;
  212. Animation.name = _name;
  213. Animation.length = _endTime - _beginTime;
  214. Animation.hierarchy = [];
  215. for (var i = 0; i < _baseAnime.hierarchy.length; i++) {
  216. var firstKey = -1;
  217. var lastKey = -1;
  218. var frame = {};
  219. frame.name = _baseAnime.hierarchy[i].name;
  220. frame.parent = _baseAnime.hierarchy[i].parent;
  221. frame.keys = [];
  222. for (var m = 1; m < _baseAnime.hierarchy[i].keys.length; m++) {
  223. if (_baseAnime.hierarchy[i].keys[m].time > _beginTime) {
  224. if (firstKey === -1) {
  225. firstKey = m - 1;
  226. frame.keys.push(_baseAnime.hierarchy[i].keys[m - 1]);
  227. }
  228. frame.keys.push(_baseAnime.hierarchy[i].keys[m]);
  229. }
  230. if (_endTime <= _baseAnime.hierarchy[i].keys[m].time || m >= _baseAnime.hierarchy[i].keys.length - 1) {
  231. break;
  232. }
  233. }
  234. for (var m = 0; m < frame.keys.length; m++) {
  235. frame.keys[m].time -= _beginTime;
  236. }
  237. Animation.hierarchy.push(frame);
  238. }
  239. return Animation;
  240. }
  241. </script>
  242. </body>
  243. </html>