jtwjs Dev Wiki
  • DEV_ROAD
    • 💪🏻 생존하기
    • Week 1
      • 개발 환경 세팅
      • 타입스크립트
      • 리엑트
      • Testing Library
      • Parcel & ESLint
    • Week 2
      • JSX
      • Virtual DOM
    • Week 3
      • React Component
      • React State
    • Week 4
      • Express
      • Fetch API & CORS
      • React Hook
      • useRef & Custom Hook
    • Week 5
      • TDD
      • React Testing Library
      • MSW
      • Playwrite
      • Snapshot
    • Week 6
      • Separtion of Concerns
      • Principle
      • DI, (Dependency Injection)
      • Reflect-metadata
      • TSyringe
      • External Store
      • Follow Redux
      • usestore-ts
      • useSyncExternalStore
    • Week 7
      • Routing
      • Routes
      • Router
      • Navigation
    • Week 8
      • Design System
      • Style Basics
      • CSS-in-JS
      • Styled-Components
      • Global Style & Theme
    • Week 9
      • 개발하기 전 준비
      • 상품 목록 페이지
      • 상품 상세 페이지
      • 장바구니 페이지
    • Week 10
      • 로그인
      • 로그아웃
      • 회원가입
      • 주문 목록 & 주문 상세
    • Week 11
      • 배송 정보 입력
      • 포트원 결제 요청
      • 배송 및 결제 정보 전달
    • Week 12
      • 관리자 웹사이트개발시작
  • DEV_NOTE
    • TypeScript
      • 기본적 문법
        • Enum
        • 다형성
          • Untitled
        • 구조적 타이핑
        • 제너릭 타입
        • 컨디셔널 타입
        • 함수 메서드 타이핑
        • infer로 타입스크립트의 추론 직접 활용
        • 재귀 타입
        • 템플릿 리터럴 타입
        • 추가적인 타입 검사 satisfies 연산자
        • 타입스크립트 건망증
        • 원시 자료형에도 브랜딩 기법 사용 가능
        • 타입 좁히기
        • 유용한 타입 만들기
        • 데코레이터 함수
        • 앰비언트 선언도 선언 병합이 된다.
        • 앰비언트 선언도 선언병합이 된다.
    • Testing
      • Unit Testing
      • 단위 테스트의 두 분파
      • 좋은 단위 테스트를 구성하는 4대 요소
      • 테스트 대역과 식별할 수 있는 동작
      • 단위 테스트 스타일
      • 가치 있는 단위 테스트를 위한 리팩토링
      • 통합 테스트
      • Cross Browsing Testing
      • 기능 테스트 종류
      • React Testing Pattern
      • 프론트엔드 테스트 입문
        • 테스트 범위
        • 단위 테스트 검증
        • Mock
        • UI 컴포넌트 테스트
        • 테스트 커버리지
        • 웹 통합 테스트
        • MSW
        • 스토리북
        • 시각적 회귀 테스트
        • E2E 테스트
        • Github Actions 설정
        • 깃허브 액션에서 E2E
      • 시프트 레프트
        • 테스트 기본중의 기본
        • 단위 테스트
        • 코드 복잡도
        • 리팩터링
        • 코드 리뷰
        • 통합 테스트 패턴
        • 시스템 테스트의 자동화
        • 탐색적 테스트
      • Test Tip
      • vitest
      • playwright
      • Test Data Generator
      • MSW
    • Algorithm
      • coding test
      • Data Structure
    • Next.js
      • Data Fetching
      • Hydration
      • Next 13
      • Optimization
      • Next 15
    • Tailwind
      • Tailwind CSS
      • Theme
      • Directives
      • Tool
      • Design System
    • Storybook
      • Storybook
      • CSF3
      • CDD
      • Headless Component
    • Funtional Programming
      • 함수형 프로그래밍
      • 참조 투명성
      • 부수효과
      • 함수 합성
      • 제너릭 타입 활용하기
      • 암묵적 입출력
      • 액션과 계산, 데이터
      • 계층형 설계
      • 호출 그래프
      • 함수형 설계
      • 불변성
      • 일급 함수
      • 함수형 도구
    • Git
      • Github Actions
      • Conflict
      • Branch 전략
    • Contents Format
      • Audio
    • 3D Graphic
      • 3D keyword
      • Three.js
      • Geometry
      • Material
      • Light
      • Camera
      • Decal
      • Rotation
      • Text
      • Shadow
      • Fog
      • Post Processing
      • Animation
      • Math
        • Vector Space
        • 벡터의 연산
        • 회전 계산
      • 3D 컨텐츠가 만들어지는 과정
      • R3F
      • Env
      • Scene
      • Transform
      • R3F
      • Interaction & Raycast
      • Rendering Algorithnm
      • Blender
      • Blender
    • Accessibility
      • 접근성이란
    • Interactive Web
      • Parallax
      • Canvas
      • requestAnimationFrame
      • Effect
      • HSL
      • React.js + Canvas
      • Matter.js
    • AWS
      • DevOps
      • Amplify
      • S3
      • 클라우드 컴퓨팅
        • 온프레미스와 클라우드
        • 클라우드 도입효과
        • 클라우드 컴퓨팅의 범위
        • 컴퓨팅 옵션
          • EC2 - Virtual Machin
          • ECS, EKS - Container
          • Lambda - Serverless
        • 네트워크 가상화
        • 스토리지
        • 데이터베이스
        • 데이터 수집
        • 머신 러닝 영역
        • IoT 영역
        • 블록체인 영역
      • 클라우드 아키텍처 설계
    • Network
      • Web Server & WAS
    • System Design
      • System Design
      • Component
      • 의존성을 배제한 개발
      • Error Handling
      • Architecture
        • 모노로틱 아키텍처
        • Clean Architecture
        • Layered Architecture
        • 이벤트 기반 아키텍처
      • 상황을 파악하는 메타인지
      • 중복 문제 해결하기
      • Monorepo Arhitecture
        • 모노레포 운영과 트러블슈팅
        • Module Federation
      • 코드 병목지점
      • API 대응
      • 공통 코드
      • Infra 구축
      • 모듈 기반의 개발 방식
      • Design System
        • 최소 수준의 아키텍처 설정
        • 더 효율적인 디자인시스템 만들기
        • 디자인 시스템과 UI 라이브러리 목적
        • 디자인 토큰
      • 효율적인 업무
        • 업무 프로세스 병목 파악
      • Clean Code
      • Design Pattern
        • CQRS Pattern
        • Strangler Fig Pattern
        • 데코레이터 패턴
        • 커맨드 패턴
        • 전략 패턴
        • 옵저버 패턴
      • A/B 테스팅
      • 대규모 리엑트 웹앱 개발
        • 복잡성 관리
        • 모듈성
        • 성능
        • 디자인 시스템
        • 데이터 패칭
        • 상태 관리
        • 국제화
        • 코드 조직화하기
        • 개인화 A/B 테스팅
        • 확장 가능한 웹 아키텍처
        • 테스팅
        • 툴링
        • 기술적 마이그레이션
        • 타입스크립트
        • 라우팅
        • 사용자 중심 API 디자인
        • 리액트 미래
    • Performance
      • React DevTools
      • Component 최적화
      • Page Load
      • API
    • MFA
      • MSA
      • MFA 도입하기
      • Monorepo
        • Monorepo Tool
        • Yarn Berry Workspace
        • Turborepo
      • MFA Composition
      • SPA 통합
      • Design System
      • Package Manager
        • Yarn
        • pnpm
      • Transpiler & Bundler
        • Babel
        • Rollup
        • esbuild
        • swc
        • Webpack
        • Vite
      • 분해와 통합을 위한 여러 기술 비교
    • State Management
      • Zustand
    • React v18
      • Automatic batching
      • Suspense
      • Transition
    • SEO
      • Search Engine Optimization
      • Open Graph Element
      • Metadata
    • FE Develop
      • Scrubbing
      • Clipboard
    • Refactoring
      • 리팩토링 깊게 들여다보기
      • 긴 코드 조각내기
      • 타입 코드 처리하기
      • 유사한 코드 융합하기
      • 데이터 보호
      • 코드 추가 및 제거
    • OAuth 2.0
    • Analytics
      • Mixpanel
    • ETC
      • VSCode
    • React Hook In Action
      • useContext & Provider
      • 커스텀 훅
      • 코드 분할하기 with Suspense, lazy
      • Suspense와 이미지 적재하기
      • useTransition, uesDeferredValue
      • SuspenseList
Powered by GitBook
On this page
  • Camera
  • Method
  • Built In Camera
  • Camera Type
  • Perspective Camera
  • Orthographic Camera
  • Camera Controls
  • Built In Controls
  • Options
  • OrbitControls
  • AxisHelper
  • GridHelper
  • GUI Control
  1. DEV_NOTE
  2. 3D Graphic

Camera

Camera

3D 객체가 담긴 장면을 바라보는 역할을 담당

const camera = new THREE.PerspectiveCamera(fov, aspect ratio, near, far);
  • Fov(시야각): 값이 클수록 시야각이 커지며 담는 범위가 늘어난다. 일반적으로 사용되는 값은 45 또는 75이다.

  • Aspect ratio(종횡비): 일반적으로 화면의 너비를 높이로 나누다.

  • Near(가시 근거리): 근거리 범위보다 앞에 있는 경우 렌더링 계산이 이루어지지 않음, 일반적으로 0.1 값이 설정된다.

  • Far(가시 원거리): 원거리 범위보다 뒤에 있는 경우 렌더링 계산이 이루어지지 않음

3D 객체를 보기에 적합한 각도를 찾는것은 어렵고도 중요한 작업

Method

  • updateProjectionMatrix → 카메라의 시야각, 종횡비, 줌 등 모든 속성이 변경되면 반드시 해당 메서드를 호출해주어야 반영이 된다.

Built In Camera

  • PerspectiveCamera → 사람이의 눈이 바라보는 방식과 비슷하게 원근감을 구현한 카메라, 3D의 대부분은 해당 카메라를 사용한다.

  • OrthographicCamera → PerspectiveCamera 와 달리 원근감이 제거된 카메라, 물체와 카메라 사이의 거리에 상관없이 물체의 크기가 동일, 주로 전략시뮬레이션 게임에서 사용된다.

  • ArrayCamera → 여러 카메라 시점을 렌더링하며, 멀티플레이어 게임과 같이 분할 화면 디스플레이에서 여러 대의 카메라를 보는 것과 비슷하다.

  • StereoCamera → VR / 3D 안경으로 만 볼 수있는 입체 효과를 가진 장면을 쉽게 렌더링 할 수 있다.

  • CubeCamera → 현재 보고있는 장면을 실시간으로 6면 이미지로 렌더링하며, 거울과 같은 반사 효과를 만드는데 사용된다.

Camera Type

Perspective Camera

  • 우리가 흔히 생각하는 일반적인 카메라

  • 오브젝트들이 원근감있게 표시된다.

Orthographic Camera

  • 오브젝트들이 원근감없이 똑같은 크기로 보이게 된다.

  • 화면을 2D 형태로 관찰한다.

  • 2D 카메라이기 때문에 각도가 없어 fov를 사용하지 않고 zoom으로 거리를 조절한다.

Camera Controls

3D 공간을 탐색하기 위한 카메라를 제어하는 역할 ,각 컨트롤러는 주로 특정한 사용 사례에 맞게 설계됨

Built In Controls

Built In Controls는 내장 기능이라기보다는 에드온과같은 보조적인 기능으로 별도로 임포트를 추가해줘야 한다.

  • ArcballControls → 객체는 고정된 상태로 마우스 드래그를 통해 카메라를 회전시켜 객체 주변을 다양한 각도로 탐색한다.

  • TrackballControls → ArcballControls 와 유사하지만 더 자유롭다. 마우스 드래그를 통해 카메라를 회전 및 이동시켜 3D 공간을 탐색

  • FlyControls → 이름 그대로 비행 즉, 카메라를 자유롭게 이동하여 탐색

  • FirstPersonControls → FlyControls와 비슷하며, 사람이 움직이는 것과 유사한 효과를 갖는다.

  • PointerLockControls → 카메라가 FPS 게임처럼 마우스 이동 이벤트를 따라 회전, 1인칭 3D 게임에 적합하다.

  • OrbitControls → 카메라가 대상 물체의 주변을 궤도를 그려 탐색한다.

Controls에는 camera를 제어하는 것 뿐만 아니라 다양한 인터렉션을 추가할 수 있는 옵션들이 있다. ex:DragControls, TransformControls, MapControls 등,

Options

  • autoRotate → 드래그하지 않아도 대상 주변을 자동으로 회전시킨다.

  • enableDamping → 드래그시 회전을 멈추지않고 관성을 유지

  • dampingFactor → 관성의 정도 값 설정 (defualt: 0.05, 값이 작을수록 관성을 더 오래 유지함)

  • enableZoom → 카메라 줌인(앞, 뒤) 가능 여부 설정 (default: true)

  • minDistance → 카메라가 이동할 수 있는 최소 거리 설정

  • maxDistance → 카메라가 이동할 수 있는 최대 거리 설정

  • enablePan → 카메라 좌우 이동 가능 여부 설정 (default: true)

  • minPolarAngle → 카메라를 수직방향으로 회전할 수 있는 최소 각도

  • maxPolarAngle → 카메라를 수직방향으로 회전할 수 있는 최대 각도

  • minAzimuthAngle → 카메라를 수평방향으로 회전할 수 있는 최소 각도

  • maxAzimuthAngle → 카메라를 수평방향으로 회전할 수 있는 최대 각도

controls 옵션의 변경시켜 카메라를 제어한다면 애니메이션 루프내에서 update 메서드를 호출시켜줘야 정상적으로 반영된다.

OrbitControls

마우스나 터치로 3D 공간을 회전 및 이동할 수 있게 해주는 컨트롤러

  • 현재 카메라를 중심으로 상하좌우로 뷰를 회전하거나, 확대 축소가 가능하다.

AxisHelper

3D 공간에서 좌표축(X, Y, Z)축을 시각적으로 표시

GridHelper

3D 공간 바닥에 특정 단위(default Meter)로 정렬된 격자를 표시

  • 3D 공간에서 객체의 Transform을 시각적으로 파악할 때 유용

axisHelper, gridHelper 를 통해 내가 보고 있는 3D 공간이 얼마만큼의 규격으로 렌더링되고있는지 파악할 수 있다.

GUI Control

옵션이나 속성을 변경하고 확인할 때 코드를 직접 수정하고 확인하는 번거로움을 줄이기 위해 GUI 컨트롤 패널을 이용하여 값을 변경해보자.

npm i lil-gui
import GUI from 'lil-gui';

const gui = new GUI();
// 값의 최소, 최대 값을 설정하면 컨트롤러가 슬라이더로 변한다.
gui.add(object, property, min, max, step);
// 변경하고자 하는 객체, 변경하고자 하는 프로퍼티, 값의 최소 범위, 값의 최대 범위, 값 조절 단위
// 메서드 체이닝을 통해 좀 더 읽기 쉬운 코드로 설정 가능
gui.add(cube.position, 'y').min(-3).max(3).step(0.1)

lil-gui는 프로퍼티 데이터 타입을 보고 적절한 UI 컨트롤러를 알아서 선택한다.

색상 팔레트 사용하기

머터리얼의 색상을 제어하기 위한 색상 팔레트 컨트롤러를 추가해보자.

색상은 hex 또는 rgb 값으로 표현되고, 문자열 타입이기 때문에 lil-gui가 이 값을 보고 색상 팔레트 UI를 사용해야하는지 알수가 없어 add 함수 대신 addColor 함수를 사용하여 색상 팔레트를 사용하겠다고 알려야 한다.

또한, 머터리얼의 색상 프로퍼티에 저장되는 값은 hex 나 rgb 값이 아닌 Built In Color Instance 로 잡혀있기 때문에 프로퍼티 값을 직접적으로 변경할 수 없어 컬러 옵션 객체를 별도로 선언한 후 주입 해주어야 한다.

const options = {
  color: '#0066ff',
}

gui.addColor(options, 'color').onChange((value) => cube.material.color.set(value));

onChage 메서드는 색상 팔레트 컨트롤러로 값을 변경시킬 때마다 인자로 넘긴 콜백 함수가 호출되며, 변경한 값을 머터리얼에 반영시키기 위해 사용된다.

PreviousLightNextDecal

Last updated 1 year ago