HIT해

[iOS/SceneKit] defaultCameraController 알아보기 본문

Swift/Swift 개발 노트

[iOS/SceneKit] defaultCameraController 알아보기

힛해 2024. 8. 29. 20:26
728x90

https://developer.apple.com/documentation/scenekit/scnview/2867336-defaultcameracontroller

 

defaultCameraController | Apple Developer Documentation

There's never been a better time to develop for Apple platforms.

developer.apple.com

 

카메라 제어 허용

더보기

var allowsCameraControl: Bool 

 

A Boolean value that determines whether the user can manipulate the current point of view that is used to render the scene.

 

사용예시

scnView.allowsCameraControl = true

 

 

defaultCameraController 의 메서드 및 속성들

더보기

속성(Properties)

  1. delegate:
    • SCNCameraControllerDelegate 프로토콜을 따르는 대리자(delegate)를 설정합니다. 대리자는 unowned(unsafe)로 선언되어 있어, 대리자가 해제되면 참조가 유효하지 않게 됩니다.
  2. pointOfView:
    • 현재 카메라의 시점(viewpoint)을 나타내는 SCNNode입니다. 카메라의 위치와 방향을 정의합니다.
  3. interactionMode:
    • 현재 카메라의 상호작용 모드를 나타내는 SCNInteractionMode 타입입니다. 예를 들어, 카메라가 대상 주위를 회전하는 방식(fly, orbit 등)을 결정합니다.
  4. target:
    • 카메라가 회전할 때 중심이 되는 세계 좌표계에서의 목표 지점입니다.
  5. automaticTarget:
    • 상호작용이 시작될 때 카메라의 목표 지점을 자동으로 업데이트할지 여부를 결정합니다. 기본값은 NO입니다.
  6. worldUp:
    • SCNInteractionModeFly 및 SCNInteractionModeOrbitTurntable 모드에서 참조되는 세계 좌표계에서의 상향 벡터(기본값: (0, 1, 0))입니다.
  7. inertiaEnabled:
    • 상호작용이 끝날 때 관성 효과를 활성화할지 여부를 결정합니다. 기본값은 NO입니다.
  8. inertiaFriction:
    • 관성 효과에 적용되는 마찰 계수입니다. 기본값은 0.05입니다.
  9. isInertiaRunning:
    • 현재 관성 효과가 작동 중인지 여부를 나타내는 읽기 전용 속성입니다.
  10. minimumVerticalAngle 및 maximumVerticalAngle:
    • SCNInteractionModeFly 및 SCNInteractionModeOrbitTurntable 모드에서 카메라의 최소 및 최대 수직 시야각을 설정합니다. 각도는 세계 좌표계에서 -90도에서 90도 사이여야 합니다. 기본값은 0.0입니다.
  11. minimumHorizontalAngle 및 maximumHorizontalAngle:
    • SCNInteractionModeFly 및 SCNInteractionModeOrbitTurntable 모드에서 카메라의 최소 및 최대 수평 시야각을 설정합니다. 각도는 세계 좌표계에서 -180도에서 180도 사이여야 합니다. 기본값은 0.0입니다.

메서드(Methods)

  1. translateInCameraSpaceBy(x:y:z:):
    • 카메라를 로컬 X, Y, Z 축을 기준으로 이동시킵니다.
  2. frameNodes(_:):
    • 주어진 노드들의 경계 구를 카메라 시야에 완전히 들어오도록 카메라 위치를 이동시킵니다. 카메라 목표 지점도 경계 구의 중심으로 설정됩니다.
  3. rotateBy(x:y:):
    • 카메라를 X 및 Y 축을 기준으로 지정된 각도만큼 회전시킵니다.
  4. roll(by:aroundScreenPoint:viewport:):
    • 화면의 특정 점을 기준으로 카메라를 지정된 각도만큼 회전시킵니다. 회전 축은 화면의 좌표계를 기준으로 합니다.
  5. dolly(by:onScreenPoint:viewport:):
    • 화면의 특정 점을 기준으로 카메라를 축 방향으로 이동(줌)시킵니다.
  6. rollAroundTarget(_:):
    • 카메라의 위치에서 목표 지점으로 향하는 축을 기준으로 카메라를 회전시킵니다.
  7. dolly(toTarget:):
    • 카메라를 목표 지점으로 향하는 축을 따라 이동(줌)시킵니다.
  8. clearRoll():
    • 카메라의 롤 회전을 초기화합니다.
  9. stopInertia():
    • 현재 진행 중인 관성 효과를 중지시킵니다.
  10. beginInteraction(_:withViewport:), continueInteraction(_:withViewport:sensitivity:), endInteraction(_:withViewport:velocity:):
    • 주어진 위치와 뷰포트(viewport)를 기준으로 상호작용을 시작, 계속 또는 종료합니다. 이 동작은 현재 설정된 상호작용 모드에 따라 달라집니다.

 

카메라 회전 제어 InteractionMode에 대해 알아보자

@available(iOS 11.0, *)
public enum SCNInteractionMode : Int, @unchecked Sendable {

    
    // Relative to up vector.
    case fly = 0

    case orbitTurntable = 1 // rotate around target with absolute orientation from angles accumulation.

    // Up vector not taken into account.
    case orbitAngleMapping = 2 // rotate around target by mapping 2D screen coordinates to spherical coordinates.

    case orbitCenteredArcball = 3

    case orbitArcball = 4 // rotate around target by mapping 2D screen coordinates to an half sphere.

    case pan = 5 // camera space translation on X/Y

    case truck = 6 // camera space translation on X/Z
}

 

 

기본적인 사용방법

   scnView.defaultCameraController.interactionMode = .truck
        // 1 orbitTurnable : 모델 좌표이동안됨, 중심축 기준으로 상하좌우 회전, z축 축소 확대
        // 2 fly : 모델 좌표이동가능, 카메라축을 기준으로 상하좌우 회전, z축 축소 확대
        // 3 orbitAngleMapping : 보델 좌표이동가능, 화면의 2D 좌표를 매핑해서 회전, 손가락 움직이는 방향에 따라 대상 회전
        // 4 orbitCenteredArcball : 모델 좌표이동 안됨, 특정 좌표에서 모델이 고정되게,
        // 5 orbitArcball : 2D 좌표를 반구에 매핑하여 회전 -> 모델 좌표이동 가능
        // 6 pan : 후라이팬 위에 물체가 올려져있는 것처럼 이동
        // 7 truck : X축과 Z축 기준으로 평행이동한다. 앞뒤로 이동함

 

1. orbitTurnable

모델 좌표이동안됨, 중심축 기준으로 상하좌우 회전, z축 축소 확대

 

 

2. fly

모델 좌표이동가능, 카메라축을 기준으로 상하좌우 회전, z축 축소 확대

 

 

 

3. orbitAngleMapping

모델 좌표이동가능, 화면의 2D 좌표를 매핑해서 회전, 손가락 움직이는 방향에 따라 대상 회전

 

 

 


4. orbitCenteredArcball

모델 좌표이동 안됨, 특정 좌표에서 모델이 고정되게

 

 

 

 

 

5. orbitArcball

2D 좌표를 반구에 매핑하여 회전 -> 모델 좌표이동 가능

 

 

 


6. pan

후라이팬 위에 물체가 올려져있는 것처럼 이동

 

 

 

7. truck

X축과 Z축 기준으로 평행이동한다. 앞뒤로 이동함