[ #8.5 ] ThreeJS의 Debug UI - 2탄

2024. 5. 29. 23:49ThreeJS 공부 뿌셔

★☆ 이 글은 Three.js journey 강의를 통해 작성하게 되었습니다 ☆★  

 

시작하기 전, 1탄을 안보신 분들이라면..
꼭꼭! 보고 오십셔!! 이전 내용과 이어지니께!!

👇 ThreeJS의 Debug UI - 1탄

 

[ #8 ] ThreeJS의 Debug UI - 1탄

★☆ 이 글은 Three.js journey 강의를 통해 작성하게 되었습니다 ☆★   우리는 ThreeJS 프로젝트를 진행하면서,UI를 Debug하기 위한 방법이 절실히 필요합니다!아직 딱히 필요성을 느끼시지 못하셨

whrmawn123.tistory.com

 

 

🍀 Geometry 조정

우리가 Geometry를 생성할 때 사용했던 코드.. 기억 나시나요?

const geometry = new THREE.BoxGeometry(1, 1, 1, 2, 2, 2);

'모든 Geometry는 BufferGeometry의 속성을 상속받는다' 라고 설명했던 것 기억... 나실까요? 

안나시거나, 금시초문이라면 아래의 게시글 한번 읽고 오시는 것을 추천드립니당!

 

[ #7 ] ThreeJS의 Geometry

★☆ 이 글은 Three.js journey 강의를 통해 작성하게 되었습니다 ☆★   👇 기본 ThreeJS의 틀은 아래 게시글을 참고하세용 [ #1 ] ThreeJS의 기본 틀★☆ 이 글은 Three.js journey 강의를 통해 작성하게

whrmawn123.tistory.com

한번 저 Segments을 조정해보는 코드를 만들어 봅시다!

시작하기 전에, 먼저 Materialwireframe를 활성화하여 삼각형들이 잘 보일 수 있도록 해줍시당!    

const material = new THREE.MeshBasicMaterial({
  color: '#9c7fe3',
  wireframe: true,
});
// !작동이 안되는 코드
gui.add(geometry, 'widthSegments').min(1).max(20).step(1);

음.. 이렇게 하면 될줄 알았건만.. 전혀 작동하지 않습니다!
왜일까요??!

widthSegmentsgeometry의 속성이 아니였습니다..!!! 

widthSegments는 단지 BoxGeometry 클래스를 통해 인스턴스화를 할 때에, 보내지는 매개변수일 뿐인 것이죠..!
한마디로, Geometry 인스턴스를 생성할 때 딱 한번만 쓰이는 값인거죠..!

우리는 직접 만든 객체를 사용해서 필요할 때마다 Geometry 인스턴스를 새로 만들어, Mesh에 할당해주어야 하는 상황이 된 것입니다.!

const debugObject = {};

// ...

debugObject.subdivision = 2; // Segments를 위한 속성 생성 
gui
    .add(debugObject, 'subdivision')
    .min(1)
    .max(20)
    .step(1)
    .onFinishChange((value) => // onChange가 아닌 onFinishChange 사용
    {
        mesh.geometry.dispose(); // 기존의 geometry 삭제 
        mesh.geometry = new THREE.BoxGeometry(
            1, 1, 1,
            value, value, value
        );
    });

👆 onFinishChange( )를 사용하여, 사용자가 변경을 완료한 후 값이 적용하고 있습니다.
이를 통해 Segments의 잦은 변경을 통해 발생할 수 있는 CPU 성능하락을 해결할 수있습니다. 

👆 mesh.geometry.dispose( )를 사용하여, geometry를 새롭게 생성하기 전, 이전의 geometry를 삭제해주고 있습니다.
이를 통해 이전의 geometry들을 통해 발생할 수 있는 메모리 누수를 해결할 수 있습니다.  

 

 

🍀 폴더 생성

많은 UI들이 생기게 되면, 폴더 별로 정리하는 것이 유용하겠죠?

const cubeTweaks = gui.addFolder("Awesome Cube");

// gui.add(...) 또는 gui.addColor(...)의 코드 변경
// gui -> cubeTweaks 로 변경
cubeTweaks.add(mesh.position, "y").min(-3).max(3).step(0.01).name("elevation");

cubeTweaks.add(mesh, "visible");

cubeTweaks.addColor(debugObject, "color").onChange((value) => {
  material.color.set(debugObject.color);
});

debugObject.spin = () => {
  gsap.to(mesh.rotation, {
    duration: 2,
    y: mesh.rotation.y + Math.PI * 2,
    ease: "power2.inOut",
  });
};
cubeTweaks.add(debugObject, "spin");

debugObject.subdivision = 2;
cubeTweaks
  .add(debugObject, "subdivision")
  .min(1)
  .max(20)
  .step(1)
  .onFinishChange((value) => {
    mesh.geometry.dispose();
    mesh.geometry = new THREE.BoxGeometry(1, 1, 1, value, value, value);
  });

 

const cubeTweaks = gui.addFolder('Awesome cube');
cubeTweaks.close();

👆cubeTweaks.close( ) 메서드를 사용하여 초기에 폴더를 닫은 상태로 설정할 수 있습니당!   

 

 

🍀 GUI 설정

[ 🌳 Width ]

UI들의 상자의 width를 변경할 수 있습니다!

const gui = new GUI({
    width: 300
});

[ 🌳 Title ]

최상단 폴더의 제목을 변경할 수 있습니다!
default - "Controls"

const gui = new GUI({
    title: 'Nice debug UI'
});

[ 🌳 Close Folders ]

초기에 모든 폴더를 닫은 상태로 설정할 수 있습니다!

const gui = new GUI({
    closeFolders: true
});

[ 🌳 Close GUI ]

초기에 최상위 폴더를 닫은 상태로 설정할 수 있습니다!

const gui = new GUI({
    width: 300,
    title: 'Nice debug UI',
    closeFolders: false,
});
gui.close();

[ 🌳 Hide GUI ]

초기에 GUI의 숨김처리를 설정할 수 있습니다!

const gui = new GUI({
    width: 300,
    title: 'Nice debug UI',
    closeFolders: false,
});
gui.hide();

위에는 맛보기였구, 진짜는 아래입니다요.

keydown을 통해 GUI 숨김/표출을 설정할 수 있습니다!

const gui = new GUI({
    width: 300,
    title: 'Nice debug UI',
    closeFolders: false,
});

window.addEventListener('keydown', (event) =>
{
    if(event.key == 'h')
        gui.show(gui._hidden);
        // gui.hidden은 현재 숨김 여부의 값 반환
});

[ 🌳 ECT ]

이외에도 다양한 설정이 가능합니다! 자세한 내용은 아래 공식문서를 통해 확인해보세요!

 

lil-gui 0.19.2

Migrating For most projects, moving from dat.gui to lil-gui should be as simple as changing the import URL. The API is designed to be as backwards-compatible as is reasonably possible, but this section aims to address any breaking changes. API Changes gui.

lil-gui.georgealways.com

 

'ThreeJS 공부 뿌셔' 카테고리의 다른 글

[ #9.5 ] ThreeJS의 Texture - 2탄  (0) 2024.05.31
[ #9 ] ThreeJS의 Texture - 1탄  (0) 2024.05.30
[ #8 ] ThreeJS의 Debug UI - 1탄  (0) 2024.05.28
[ #7.5 ] BufferGeometry 뿌시기  (0) 2024.05.28
[ #7 ] ThreeJS의 Geometry  (0) 2024.05.27