import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';
new OrbitControls(camera, renderer.domElement);
// Mesh
const geometry = new THREE.BoxGeometry(1, 1, 1, 16, 16, 16);
const material = new THREE.MeshStandardMaterial({
color: 'hotpink',
side: THREE.DoubleSide, // 물체 안에서도 카메라로 찍을 수 있음
wireframe: true, // frame 만 보이게 할건지
});
const mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
구 형태
Segments는 점의 개수
예시
// 반지름 5, 각 높이/넓이 Segments 는 64개씩 설정
const geometry = new THREE.SphereGeometry(5, 64, 64);
// 색상 설정
const material = new THREE.MeshStandardMaterial({ color: 'orangered', side: THREE.DoubleSide, flatShading: true });
const mesh = new THREE.Mesh(geometry, material);
// 각 점들의 위치
const positionArray = geometry.attributes.position.array;
// 점들이 움직일 랜덤한 위치를 미리 생성해둠
const randomArray = [];
for (const key in positionArray) {
// @ts-expect-error
positionArray[key] += (Math.random() - 0.5) * 0.2; // -0.5~+0.5 더해줌
randomArray[key] = (Math.random() - 0.5) * 0.2;
}
scene.add(mesh);
// 그리기
const clock = new THREE.Clock();
function draw(): void {
// 점점 증가하는 시간 값 이용
const elapsedTime = clock.getElapsedTime() * 3;
for (const key in positionArray) {
// sin 값을 이용한다. (1 ~ -1 까지의 값이 리턴됨)
// 정해둔 randomArray 값을 더해주지 않으면 그냥 일정하게 커졌다 작아졌다만 하게됨
// @ts-expect-error
positionArray[key] += Math.sin(elapsedTime + randomArray[key] * 100) * 0.002;
}
// 이 값을 true 로 바꿔줘야 점의 위치가 변경되는 게 보임
geometry.attributes.position.needsUpdate = true;
renderer.render(scene, camera);
renderer.setAnimationLoop(draw);
}
draw();