코딩하는 고릴라

[FE] 게시글 등록 상태에 따른 별자리 형성, 해제 본문

Project/별일

[FE] 게시글 등록 상태에 따른 별자리 형성, 해제

코릴라입니다 2024. 3. 2. 13:05

🦍 상황

 - Three.js(React-three/fiber)를 활용한 프로젝트 진행 중, 특정 별자리내 모든 별의 불을 밝히면 해당 별자리를 선명하게 표현해야 하는 기능을 구현했어야 했음

 

🐌 로직

1. 별자리 형성 여부 체크

- 모든 별들의 등록 상태를 담고 있는 누적합 세그먼트 트리 생성

- 등록된 별의 경우 point update를 이용해 해당 별의 정보를 담고 있는 리프노드의 값을 1로 설정

- 별자리 형성을 체크할 때는 range query를 활용해 해당 별자리 내 별의 개수와 등록된 별 개수를 비교, 일치할 때 별자리 형성


2. 별자리 형성 여부에 따른 props 전달 및 react-three/fiber 오브젝트 속성 제어

- GroupStar 컴포넌트 레벨에서 해당 별자리의 생성 여부를 체크

- 별자리 생성 여부에 따른 boolean 값을 props를 통해 Line 컴포넌트로 전달

- transparent 속성과 opacity 속성을 활용해 별자리 선의 투명도 조절

    - transparent: true로 설정해 두어야 opacity 속성 조절을 통한 오브젝트 투명도 조절 가능

    - opacity: 0 ~ 1 범위의 값 설정을 통해 오브젝트 투명도 조절

function Line(props) {

	// ...

    return (
        <line geometry={lineGeometry}>
            <lineBasicMaterial
                attach="material"
                ref={lineRef}
                transparent={true}
                opacity={
                    !props.lineColor {/*전달받은 lineColor props를 통해 투명도 조절*/}
                        ? 1
                        : starLineOpacity === groupNum
                        ? 0.05
                        : 0.01
                }
                color={0xced6ff}
            />
        </line>
    );
}

3. 결과

🦢 고찰

- 별의 등록, 삭제 시마다 State값에 1을 더하거나 빼주는 식으로 로직을 구성하면 성능적으로 더 우수할 것으로 예상

    - 불필요한 세그먼트트리 생성 및 조작 과정을 사용하지 않으므로

- 프로젝트를 진행하면서 이전에 학습했던 알고리즘을 적용해 보고 싶었던 시도로써 적용

반응형