Advertisement
Guest User

Untitled

a guest
Feb 24th, 2020
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.16 KB | None | 0 0
  1. import React, { Component, useState } from "react";
  2. import * as THREE from "three";
  3. import { OrbitControls } from "three/examples/jsm/controls/OrbitControls";
  4. // import { useSpring, a } from "react-spring/three";
  5.  
  6. export function main() {
  7. const canvas = document.querySelector("#c");
  8. const renderer = new THREE.WebGLRenderer({ canvas });
  9. const n = 3;
  10. const fov = 50;
  11. const aspect = 2; // the canvas default
  12. const near = 0.2;
  13. const far = 50;
  14. const camera = new THREE.PerspectiveCamera(fov, aspect, near, far);
  15. camera.position.z = 10;
  16. camera.position.y = 10;
  17. camera.position.x = 10;
  18. const controls = new OrbitControls(camera, canvas);
  19. controls.target.set(n/2 , n/2 , n/2);
  20. controls.update();
  21. const scene = new THREE.Scene();
  22. scene.background = new THREE.Color("white");
  23. function addLight(x, y, z) {
  24. const color = 0xffffff;
  25. const intensity = 1;
  26. const light = new THREE.DirectionalLight(color, intensity);
  27. light.position.set(x, y, z);
  28. scene.add(light);
  29. }
  30. addLight(-1, 2, 4);
  31. addLight(1, -1, -2);
  32. addLight(1, 1, 3)
  33. const boxWidth = 0.95;
  34. const boxHeight = 0.95;
  35. const boxDepth = 0.95;
  36. let cubes = [];
  37. const geometry = new THREE.BoxGeometry(boxWidth, boxHeight, boxDepth);
  38. let cubeClosed = true;
  39. function makeInstance(geometry, color, x, y, z, opacity) {
  40. [THREE.BackSide, THREE.FrontSide].forEach(side => {
  41. const material = new THREE.MeshPhongMaterial({
  42. color,
  43. opacity: opacity,
  44. // transparent: true,
  45. side,
  46. //wireframe:true
  47. });
  48. const cube = new THREE.Mesh(geometry, material);
  49. cubes.push(cube);
  50. scene.add(cube);
  51. cube.position.set(x, y, z);
  52. });
  53. }
  54. function hsl(h, s, l) {
  55. return new THREE.Color().setHSL(h, s, l);
  56. }
  57. function makecube() {
  58. var x = 0;
  59. for (var i = 0; i < n; i++) {
  60. for (var j = 0; j < n; j++) {
  61. for (var k = 0; k < n; k++) {
  62. //makeInstance(geometry, hsl(0.5, 1, 0.5), i, j, k, 0.8);
  63. if(i > 1 && j == 0 && k >= 1)
  64. makeInstance(geometry, hsl(0.15, 1, 0.5), i, j, k, 0.8);
  65. else
  66. makeInstance(geometry, hsl(0.5, 1, 0.45), i, j, k, 0.8);
  67. x++;
  68. }
  69. }
  70. }
  71. cubeClosed = true;
  72. }
  73. makecube();
  74. function expandcube() {
  75. var x = 0;
  76. for (var i = 0; i < n; i++) {
  77. for (var j = 0; j < n; j++) {
  78. for (var k = 0; k < n; k++) {
  79. //makeInstance(geometry, hsl(0.5, 1, 0.5), i * 2, j * 2, k * 2, 0.8);
  80. if(i == 0 && j == 0 && k < 2)
  81. makeInstance(geometry, hsl(0.15, 1, 0.5), i* 2, j* 2, k* 2, 0.8);
  82. else
  83. makeInstance(geometry, hsl(0.5, 1, 0.45), i* 2, j* 2, k* 2, 0.8);
  84. x++;
  85. }
  86. }
  87. }
  88. cubeClosed = false;
  89. }
  90. function resizeRendererToDisplaySize(renderer) {
  91. const canvas = renderer.domElement;
  92. const width = canvas.clientWidth;
  93. const height = canvas.clientHeight;
  94. const needResize = canvas.width !== width || canvas.height !== height;
  95. if (needResize) {
  96. renderer.setSize(width, height, false);
  97. }
  98. return needResize;
  99. }
  100. // let renderRequested = false;
  101.  
  102. function render() {
  103. // renderRequested = undefined;
  104.  
  105. if (resizeRendererToDisplaySize(renderer)) {
  106. const canvas = renderer.domElement;
  107. camera.aspect = canvas.clientWidth / canvas.clientHeight;
  108. camera.updateProjectionMatrix();
  109. }
  110. renderer.render(scene, camera);
  111. }
  112. render();
  113. function requestRenderIfNotRequested() {
  114. // if (!renderRequested) {
  115. for (let index =0; index< cubes.length; index++) {
  116. scene.remove(cubes[index]);
  117. }
  118. cubes = []
  119. if (cubeClosed == true) {
  120. expandcube();
  121. } else if (cubeClosed == false) {
  122. makecube()
  123. }
  124. // renderRequested = true;
  125. //requestAnimationFrame(render);
  126. // }
  127. }
  128.  
  129. function requestRenderIfNotRequestedAndRotated() {
  130. requestAnimationFrame(render);
  131. }
  132.  
  133. controls.addEventListener("change", requestRenderIfNotRequestedAndRotated);
  134. window.addEventListener("dblclick", requestRenderIfNotRequested);
  135. }
  136. main();
  137.  
  138. //export default App;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement