Advertisement
Guest User

Untitled

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