/
Inner_001.tsx
80 lines (61 loc) · 1.97 KB
/
Inner_001.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import React, { useState, useEffect, useRef } from 'react';
import styled from 'styled-components';
import * as THREE from 'three/src/Three';
// CSS in JS
const Figure = styled.figure`
canvas {
box-shadow: 0 0 15px 2px rgb(0 0 0 / 10%);
}
`;
// Component
function Inner() {
const [canvasSize, setCanvasSize] = useState(0);
const figureElm = useRef(null);
const changeCanvasSize = (canvasElmWidth) => {
if (canvasElmWidth < 900) {
setCanvasSize(canvasElmWidth);
} else {
setCanvasSize(900);
}
}
useEffect(() => {
const canvasElmWidth = figureElm.current.clientWidth;
// console.log('canvasElmWidth(load)', canvasElmWidth);
changeCanvasSize(canvasElmWidth);
window.addEventListener('resize', () => {
const canvasElmWidth = figureElm.current.clientWidth;
// console.log('canvasElmWidth(resize)', canvasElmWidth);
changeCanvasSize(canvasElmWidth);
});
}, [0]);
useEffect(() => {
// three.js
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera( 35, canvasSize / canvasSize, 0.1, 1000 );
const renderer = new THREE.WebGLRenderer();
renderer.setSize( canvasSize, canvasSize );
if (figureElm.current.firstChild) {
figureElm.current.removeChild( figureElm.current.firstChild );
}
figureElm.current.appendChild( renderer.domElement );
const geometry = new THREE.BoxGeometry( 1, 1, 1 );
const material = new THREE.MeshStandardMaterial( { color: 0xff0000 } );
const cube = new THREE.Mesh( geometry, material );
scene.add( cube );
camera.position.z = 5;
const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );
scene.add( light );
function animate() {
requestAnimationFrame( animate );
cube.rotation.x += 0.01;
cube.rotation.y += 0.01;
renderer.render( scene, camera );
};
animate();
}, [canvasSize]);
// JSX
return (
<Figure ref={figureElm}></Figure>
);
}
export default Inner;