Three.js 화면 조정하기 Next.js 한스푼을 더해서

2024. 6. 26. 17:34·Stack/Next.js
반응형

Next.js 에서 Three.js 를 구현, 그러나 Three.js의 화면 크기를 변경이 필요하여 변경하는 방법을 기록

DOM 요소의 크기를 설정

<div ref={mountRef} style={{ width: '800px', height: '600px' }}/>

구현할 요소의 크기를 width: '800px', height: '600px' 로 설정하였다.

Next.js 에서 render 설정

const mountRef = useRef<HTMLDivElement | null>(null);m

mountRef를 통해 DOM 요소에 접근하여 width와 height를 아래 코드를 통해 가지고 온다.

const width = mountRef.current.clientWidth;
const height = mountRef.current.clientHeight;
renderer.setSize(width, height);

renderer의 사이즈를 가지고온 DOM 요소와 같이 통일시킨다

카메라도 동일하게 설정

before Code

const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);

기존 카메라가 window의 기본을 받았지만 현재 renderer의 크기를 변경하였으므로 카메라도 동일하게 변경시켜줘야 된다.

const camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 1000);

변경이 적용된 코드

'use client';

import { useEffect, useRef } from 'react';
import * as THREE from 'three';

const ThreeScene: React.FC = () => {
  const mountRef = useRef<HTMLDivElement | null>(null);

  useEffect(() => {
    if (!mountRef.current) return;

    const scene = new THREE.Scene();
    const renderer = new THREE.WebGLRenderer();
    const width = mountRef.current.clientWidth;
    const height = mountRef.current.clientHeight;
    const camera = new THREE.PerspectiveCamera(75, width / height, 0.1, 1000);
    renderer.setSize(width, height);
    mountRef.current?.appendChild(renderer.domElement);

    const geometry = new THREE.BoxGeometry();
    const material = new THREE.MeshBasicMaterial({ color: 0x00ff00 });
    const cube = new THREE.Mesh(geometry, material);
    scene.add(cube);

    camera.position.z = 5;

    const animate = () => {
      requestAnimationFrame(animate);
      cube.rotation.x += 0.01;
      cube.rotation.y += 0.01;
      renderer.render(scene, camera);
    };

    animate();

    return () => {
      mountRef.current?.removeChild(renderer.domElement);
    };
  }, []);

  return <div ref={mountRef} style={{ width: '800px', height: '600px' }} />;
};

export default ThreeScene;
반응형

'Stack > Next.js' 카테고리의 다른 글

Button으로 Resizable 구현하기  (2) 2024.06.04
Draggable 구현하기  (0) 2024.06.04
Next.js metadata 다루는 방식의 변  (1) 2024.05.14
Next Image 사용하는 방법  (1) 2024.05.14
📘 Next.js 에 markdown 설치 하기  (1) 2024.05.09
'Stack/Next.js' 카테고리의 다른 글
  • Button으로 Resizable 구현하기
  • Draggable 구현하기
  • Next.js metadata 다루는 방식의 변
  • Next Image 사용하는 방법
WHITE_FROST
WHITE_FROST
개발공부리뷰블로그
    반응형
  • WHITE_FROST
    하얀하얀IT
    WHITE_FROST
  • 전체
    오늘
    어제
    • 분류 전체보기 (119)
      • Stack (43)
        • Next.js (7)
        • React (12)
        • React-Native (15)
        • TypeScript (0)
        • Python (2)
        • JavaScript (2)
        • Android (1)
        • DB (2)
        • JAVA (1)
      • Obsidian (1)
      • AI (3)
      • AI Tools (0)
      • Tools (0)
      • Mac (0)
      • Error (7)
      • 알고리즘 정리 (6)
      • 알고리즘 문제풀이 (46)
      • 공부일상 (4)
      • 개발 도구 & 라이브러리 (0)
      • 정보처리기사 (0)
      • 기타 (6)
      • Tip (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    React Hooks
    티스토리챌린지
    코테준비
    javascript
    ReactHook
    코테
    mongodb cloud
    React-Native cli
    SWEA
    hooks
    Python
    react
    Expo
    error
    react-native
    D2
    mongoDB Atlas
    java
    오블완
    d1
    boj
    react-native-maps
    프로그래머스
    백준
    코딩테스트
    알고리즘
    Next.js
    ios
    리액트네이티브
    reactnative
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
WHITE_FROST
Three.js 화면 조정하기 Next.js 한스푼을 더해서
상단으로

티스토리툴바