index.html 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <link rel="icon" href="/favicon.ico" />
  6. <meta name="viewport"
  7. content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover">
  8. <meta http-equiv="Cache-control" content="no-cache">
  9. <meta http-equiv="Cache" content="no-cache">
  10. <meta name="apple-mobile-web-app-capable" content="yes" />
  11. <title>点名</title>
  12. <link rel="stylesheet" href="./css/index.css">
  13. <script src="js/three.min.js"></script>
  14. <script src="js/tween.min.js"></script>
  15. <!-- <script src="js/stats.min.js"></script> -->
  16. <script src="js/TrackballControls.js"></script>
  17. <script src="js/CSS3DRenderer.js"></script>
  18. <script src="js/vue.min.js"></script>
  19. <!-- 创建星星 -->
  20. <!-- <script src="js/star.js"></script> -->
  21. <!-- 数据位置 -->
  22. <script src="js/data.js"></script>
  23. </head>
  24. <body>
  25. <div id="container" style="pointer-events: none;"></div>
  26. <div id="vueBoxs">
  27. <div class="bss">
  28. <div class="pageTitle"></div>
  29. <div class="iconBack" @click="onBack()"></div>
  30. <div id="menu">
  31. <button id="table" :class="tableIndex <= 1 ? 'disabled' : ''" v-show="!animationStatus"
  32. @click="start()"></button>
  33. <button id="sphere" v-show="animationStatus" @click="closes()"></button>
  34. <!-- <button id="reset" style="margin-left:40px;" @click="resets()">照片墙</button> -->
  35. <!-- <button id="lists" @click="listShow = true">中奖名单</button> -->
  36. </div>
  37. </div>
  38. </div>
  39. </body>
  40. </html>
  41. <script>
  42. <<<<<<< HEAD
  43. var table = getData()
  44. =======
  45. var table = getData();
  46. >>>>>>> iteration-classroom
  47. var tableLens = table.length;
  48. var camera, scene, renderer;
  49. var controls;
  50. var objects = [];
  51. var targets = { chaos: [], table: [], sphere: [], helix: [], grid: [] };
  52. var ang = 0, moving = false, objectsss, starBG, isMoving = false; //objectsss 为切换的图片的
  53. var cpx = 0, cpy = 0, cpz = 0, crx = 0, cry = 0, crz = 0;
  54. function init() {
  55. camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 10000);
  56. camera.position.z = 1500;
  57. scene = new THREE.Scene();
  58. // table
  59. for (var i = 0; i < table.length; i++) {
  60. // 每个图标的盒子
  61. var element = document.createElement('div');
  62. element.className = 'element';
  63. element.style.backgroundColor = 'rgba(255,255,255)';
  64. element.style.borderRadius = '12px'
  65. if (i >= 32) {
  66. element.className = 'element hide'
  67. }
  68. // 图片
  69. var symbolBox = document.createElement('div');
  70. var symbol = document.createElement('img');
  71. symbolBox.className = 'symbolBox';
  72. symbol.className = 'symbol';
  73. <<<<<<< HEAD
  74. symbol.src = table[i].img + '?imageMogr2/strip/format/png/size-limit/50k!';
  75. =======
  76. symbol.src = table[i].img;
  77. >>>>>>> iteration-classroom
  78. symbolBox.appendChild(symbol);
  79. element.appendChild(symbolBox);
  80. // 姓名
  81. var details = document.createElement('div');
  82. details.className = 'details';
  83. details.innerHTML = table[i].name;
  84. element.appendChild(details);
  85. // 图标变成3d内的对象,放入场景中
  86. var object = new THREE.CSS3DObject(element);
  87. object.position.x = Math.random() * 3400 - 1700;
  88. object.position.y = Math.random() * 3400 - 1700;
  89. object.position.z = Math.random() * 3400 - 1700;
  90. object.name = table[i].name;
  91. scene.add(object);
  92. objects.push(object);
  93. // 根据索引,定制位置
  94. var object = new THREE.Object3D();
  95. var ix = (i) % 8;
  96. object.position.y = 300;
  97. <<<<<<< HEAD
  98. switch (table.length) {
  99. case 1:
  100. object.position.x = 0;
  101. break;
  102. case 2:
  103. object.position.x = (ix * 172) - (172 * 1 / 2);
  104. break;
  105. case 3:
  106. object.position.x = (ix * 172) - (172 * 2 / 2);
  107. break;
  108. case 4:
  109. object.position.x = (ix * 172) - (172 * 3 / 2);
  110. break;
  111. case 5:
  112. object.position.x = (ix * 172) - (172 * 4 / 2);
  113. break;
  114. case 6:
  115. object.position.x = (ix * 172) - (172 * 5 / 2);
  116. break;
  117. case 7:
  118. object.position.x = (ix * 172) - (172 * 6 / 2);
  119. break;
  120. default:
  121. var iy = Math.floor((i) / 8);
  122. object.position.x = (ix * 172) - 600;
  123. object.position.y = - (iy * 192) + 300;
  124. break;
  125. }
  126. =======
  127. if (table.length === 1) {
  128. object.position.x = 0;
  129. } else if (table.length === 2) {
  130. object.position.x = (ix * 172) - (172 * 1 / 2);
  131. } else if (table.length === 3) {
  132. object.position.x = (ix * 172) - (172 * 2 / 2);
  133. } else if (table.length === 4) {
  134. object.position.x = (ix * 172) - (172 * 3 / 2);
  135. } else if (table.length === 5) {
  136. object.position.x = (ix * 172) - (172 * 4 / 2);
  137. } else if (table.length === 6) {
  138. object.position.x = (ix * 172) - (172 * 5 / 2);
  139. } else if (table.length === 7) {
  140. object.position.x = (ix * 172) - (172 * 6 / 2);
  141. } else {
  142. var iy = Math.floor((i) / 8);
  143. object.position.x = (ix * 172) - 600;
  144. object.position.y = - (iy * 192) + 300;
  145. }
  146. >>>>>>> iteration-classroom
  147. targets.table.push(object);
  148. }
  149. // 创建切换图片
  150. var elements = document.createElement('div');
  151. elements.className = 'changeImgBoxs';
  152. // element.style.backgroundImage = "url(./img/pic.png)";
  153. elements.style.backgroundColor = 'rgba(255,255,255)';
  154. var symbolBox = document.createElement('div');
  155. var symbol = document.createElement('img');
  156. symbol.setAttribute("id", "changeImg");
  157. symbolBox.className = 'symbolBox2';
  158. symbol.className = 'symbol2';
  159. <<<<<<< HEAD
  160. symbol.src = table[0].img + '?imageMogr2/strip/format/png/size-limit/50k!';
  161. =======
  162. symbol.src = table[0].img;
  163. >>>>>>> iteration-classroom
  164. symbolBox.appendChild(symbol);
  165. elements.appendChild(symbolBox);
  166. var details = document.createElement('div');
  167. details.setAttribute("id", "detailss");
  168. details.className = 'details';
  169. details.innerHTML = table[0].name;
  170. elements.appendChild(details);
  171. objectsss = new THREE.CSS3DObject(elements);
  172. objectsss.position.x = 0;
  173. objectsss.position.y = 20000;
  174. objectsss.position.z = 0;
  175. scene.add(objectsss);
  176. // 散乱随机位置
  177. var vector = new THREE.Vector3();
  178. for (var i = 0, l = objects.length; i < l; i++) {
  179. var phi = Math.acos(-1 + (2 * i) / l);
  180. var theta = Math.sqrt(l * Math.PI) * phi;
  181. var object = new THREE.Object3D();
  182. var py = Math.random() * 3400 - 1700;
  183. if (py < 400 && py > -400) { //防止停止时,图片位置不好挡住中央的图片
  184. if (py < 0) {
  185. py -= 400;
  186. } else {
  187. py += 400;
  188. }
  189. }
  190. object.position.x = Math.random() * 3400 - 1700;
  191. object.position.y = py;
  192. object.position.z = Math.random() * 3400 - 1700;
  193. object.lookAt(vector);
  194. targets.chaos.push(object);
  195. }
  196. // 球
  197. var vector = new THREE.Vector3();
  198. for (var i = 0, l = objects.length; i < l; i++) {
  199. var phi = Math.acos(-1 + (2 * i) / l);
  200. var theta = Math.sqrt(l * Math.PI) * phi;
  201. var object = new THREE.Object3D();
  202. object.position.x = 750 * Math.cos(theta) * Math.sin(phi);
  203. object.position.y = 750 * Math.sin(theta) * Math.sin(phi);
  204. object.position.z = 750 * Math.cos(phi);
  205. vector.copy(object.position).multiplyScalar(2);
  206. object.lookAt(vector);
  207. targets.sphere.push(object);
  208. }
  209. //渲染
  210. renderer = new THREE.CSS3DRenderer();
  211. renderer.setSize(window.innerWidth, window.innerHeight);
  212. renderer.domElement.style.position = 'absolute';
  213. document.getElementById('container').appendChild(renderer.domElement);
  214. //控制器
  215. controls = new THREE.TrackballControls(camera, renderer.domElement);
  216. controls.rotateSpeed = 0.5;
  217. controls.minDistance = 500;
  218. controls.maxDistance = 6000;
  219. controls.addEventListener('change', render);
  220. // 初始化
  221. <<<<<<< HEAD
  222. transform(targets.table, 800);
  223. =======
  224. transform(targets.table, 500);
  225. >>>>>>> iteration-classroom
  226. window.addEventListener('resize', onWindowResize, false);
  227. cpx = camera.position.x;
  228. cpy = camera.position.y;
  229. cpz = camera.position.z;
  230. crx = camera.rotation.x;
  231. cry = camera.rotation.y;
  232. crz = camera.rotation.z;
  233. }
  234. // 切换状态时动画
  235. function transform(targets, duration, type) {
  236. var scale = 1;
  237. if (type == undefined) {
  238. type = 0;
  239. }
  240. TWEEN.removeAll();
  241. for (var i = 0; i < objects.length; i++) {
  242. var object = objects[i];
  243. var target = targets[i];
  244. new TWEEN.Tween(object.position)
  245. .to({ x: target.position.x, y: target.position.y, z: target.position.z }, Math.random() * duration + duration)
  246. .easing(TWEEN.Easing.Exponential.InOut)
  247. .start();
  248. new TWEEN.Tween(object.rotation)
  249. .to({ x: target.rotation.x, y: target.rotation.y, z: target.rotation.z }, Math.random() * duration + duration)
  250. .easing(TWEEN.Easing.Exponential.InOut)
  251. .start();
  252. }
  253. new TWEEN.Tween(this)
  254. .to({}, duration * 2)
  255. .onUpdate(render)
  256. .start()
  257. // console.log(document.querySelectorAll('.element'), '1212')
  258. setTimeout(() => {
  259. <<<<<<< HEAD
  260. console.log(moving, type)
  261. if (moving || type === 2) {
  262. const elements = document.querySelectorAll('.element')
  263. console.log(elements, 'eee')
  264. =======
  265. if (moving || type === 2) {
  266. const elements = document.querySelectorAll('.element')
  267. >>>>>>> iteration-classroom
  268. if (elements.length > 0) {
  269. elements.forEach((e, index) => {
  270. if (type === 2) {
  271. if (index >= 32) {
  272. e.classList.add('hide')
  273. }
  274. } else {
  275. e.classList.remove('hide')
  276. }
  277. })
  278. }
  279. }
  280. }, 400);
  281. }
  282. // 屏幕大小适配
  283. function onWindowResize() {
  284. camera.aspect = window.innerWidth / window.innerHeight;
  285. camera.updateProjectionMatrix();
  286. renderer.setSize(window.innerWidth, window.innerHeight);
  287. render();
  288. }
  289. function animate() {
  290. requestAnimationFrame(animate);
  291. TWEEN.update();
  292. // 旋转
  293. if (moving) {
  294. movings();
  295. }
  296. controls.update();
  297. // 星空位置与相机位置相对
  298. cpx = camera.position.x;
  299. cpy = camera.position.y;
  300. cpz = camera.position.z;
  301. crx = camera.rotation.x;
  302. cry = camera.rotation.y;
  303. crz = camera.rotation.z;
  304. }
  305. function render() {
  306. renderer.render(scene, camera);
  307. }
  308. var numsss = 0, srcss = '', txtsss = '';
  309. function movings() {
  310. // 相机旋转
  311. ang += Math.PI / 50;
  312. camera.position.x = Math.cos(ang) * 2000;
  313. camera.position.z = Math.sin(ang) * 2000;
  314. camera.position.y = 0;
  315. // 相机方向重置
  316. camera.up.x = 0;
  317. camera.up.y = 1;
  318. camera.up.z = 0;
  319. // 图片方向固定
  320. objectsss.rotation.y = -ang + Math.PI / 2;
  321. //中间图片切换
  322. numsss = Math.floor(Math.random() * tableLens);
  323. if (numsss == tableLens) {
  324. numsss = tableLens - 1;
  325. }
  326. <<<<<<< HEAD
  327. srcss = table[numsss].img + '?imageMogr2/strip/format/png/size-limit/50k!';
  328. =======
  329. srcss = table[numsss].img;
  330. >>>>>>> iteration-classroom
  331. txtsss = table[numsss].name;
  332. changeImg.src = srcss;
  333. detailss.innerHTML = txtsss;
  334. }
  335. // 停止时,图片放大动画
  336. function objDeal(obj, nums) {
  337. var option = {
  338. x: obj.scale.x,
  339. y: obj.scale.y,
  340. z: obj.scale.z,
  341. };
  342. var tween = new TWEEN.Tween(option).to({
  343. x: nums,
  344. y: nums,
  345. z: nums,
  346. }, 300).delay(100).onUpdate(function () {
  347. obj.scale.x = this.x;
  348. obj.scale.y = this.y;
  349. obj.scale.z = this.z;
  350. isMoving = true;
  351. }).onComplete(function () {
  352. isMoving = false;
  353. }).start();
  354. }
  355. // 初始化数据
  356. function renderData(data) {
  357. table = data
  358. tableLens = data.length
  359. vm.tableIndex = tableLens
  360. init();
  361. animate();
  362. <<<<<<< HEAD
  363. }
  364. function preloadImages(imageUrls, callback) {
  365. let images = {};
  366. let loadedImages = 0;
  367. let numImages = imageUrls.length;
  368. // 创建一个Image对象,并设置src属性来开始加载图片
  369. imageUrls.forEach((url) => {
  370. images[url] = new Image();
  371. images[url].onload = function () {
  372. // 当图片加载完成时,更新计数器
  373. loadedImages++;
  374. if (loadedImages === numImages && callback) {
  375. callback(images); // 所有图片都加载完毕,调用回调函数
  376. }
  377. };
  378. images[url].onerror = function () {
  379. console.error('Could not load image at ' + url);
  380. loadedImages++;
  381. };
  382. images[url].src = url;
  383. });
  384. }
  385. =======
  386. console.log(vm.tableIndex, 'renderData')
  387. }
  388. >>>>>>> iteration-classroom
  389. //点击事件及部分判断
  390. var vm = new Vue({
  391. el: '#vueBoxs',
  392. data: {
  393. animationStatus: false,
  394. tableIndex: 0,
  395. listShow: false
  396. },
  397. methods: {
  398. keyDowns: function () {
  399. this.closes();
  400. },
  401. //开始
  402. start: function () {
  403. if (this.tableIndex <= 1) {
  404. return
  405. }
  406. moving = true;
  407. this.animationStatus = true;
  408. objectsss.position.y = 0;
  409. transform(targets.sphere, 1000);
  410. objDeal(objectsss, 1);
  411. // music.play();
  412. // this.ckPrice();
  413. },
  414. //结束
  415. closes: function () {
  416. // music.pause();
  417. if (!moving) {
  418. return;
  419. }
  420. // music2.play();
  421. moving = false;
  422. this.animationStatus = false;
  423. // this.choosePerson();
  424. transform(targets.chaos, 250, 1);
  425. objDeal(objectsss, 1.8);
  426. },
  427. //回到照片墙的状态
  428. resets: function () {
  429. moving = false;
  430. camera.position.z = 1500;
  431. camera.position.x = 0;
  432. camera.position.y = 0;
  433. camera.up.x = 0;//相机以哪个方向为上方
  434. camera.up.y = 1;
  435. camera.up.z = 0;
  436. //图片重置方向
  437. objectsss.rotation.y = 0;
  438. objectsss.position.y = 20000;
  439. objectsss.scale.set(1, 1, 1);
  440. // 星空背景图重置
  441. transform(targets.table, 400, 2);
  442. <<<<<<< HEAD
  443. =======
  444. // music.pause();
  445. // this.ckPrice();
  446. >>>>>>> iteration-classroom
  447. },
  448. onBack() {
  449. // 返回时先结束
  450. this.closes()
  451. this.resets()
  452. window.parent.postMessage({
  453. api: 'callBack',
  454. loading: false,
  455. }, '*');
  456. }
  457. },
  458. created: function () {
  459. // init();
  460. // animate();
  461. <<<<<<< HEAD
  462. // const imageUrls = table.map(value => value.img + '?imageMogr2/strip/format/png/size-limit/50k!')
  463. // console.log(imageUrls.length, 'length')
  464. // console.log(imageUrls, 'imageUrls')
  465. // preloadImages(imageUrls, function (images) {
  466. // // console.log('All images loaded.');
  467. // // // 这里可以访问images对象,它是一个包含预加载图片的对象,
  468. // // // 其中键是图片的URL,值是Image对象。
  469. // init();
  470. // animate();
  471. // setTimeout(() => {
  472. // animate();
  473. // }, 100);
  474. // });
  475. =======
  476. >>>>>>> iteration-classroom
  477. // getStar();
  478. // this.ckPrice();
  479. }
  480. })
  481. </script>