//구글콘솔 광고 추가가
728x90
반응형

XR Interaction ToolKit개념과 핵심 기능 1


  1. HMD, Controller Tracking

new scene >> standard(URP) create >> 씬이름 만들어서 씬폴더에 저장 >> 하이어라키에 우클릭 >> xr >> xr origin(Action-based) 게임오브젝트 생성

xr origin(Action-based) 게임오브젝트

  • xr origin오브젝트에 붙어있는 xr origin컴포넌트는 hdm이나 컨트롤러등 연동된 장비의 기준이 되는 오브젝트. 주로 VR이나 AR세계의 중심이나 헤드셋의 기준 높이 등을 설정할 때 사용됨. 일반적으로 HDM과 연동된 메인 카메라 게임오브젝트와 양손 컨트롤러와 연동된 게임 오브젝트 등을 자식으로 배치함.
  • 메인 카메라 오브젝트에 붙어 있는 Tracked Pose Driver 컴포넌트== Unity XR의 컴포넌트 선택한 디바이스의 위치와 방향을 가져옴(여기서는 HMD의 pos를 가져와 Transform에 적용. 즉 HMD의 pos가 메인 카메라의 pos와 동기화되는 상태.)
  • LeftHand, RightHand Controller오브젝트에 붙어있는 XR Controller 컴포넌트 == Unity XR Interaction ToolKit의 주요 컴포넌트 중 하나. 컨트롤러의 pos를 동기화하고, 그립버튼이나 트리거버튼 등의 액션이 발생하는 것을 연결해 주는 기능.(왼손 오른손 preset 연결 잘 돼 잇는지 확인 필요)  

2. Custom Controller Model

  • XR Origin 오브젝트의 자식 오브젝트 왼쪽 컨트롤러와 오른쪽 컨트롤러의 XR Controller컴포넌트 안에 모델프리팹에 원하는 프리팹을 연결시켜주면 화면에서 뜸.

3. Interactor & Interactable

  • Interactor : 인터랙션을 시도하는 쪽
  • Interactable : 인터랙션이 되어지는 쪽
  • Interaction Manager: 이 기능들을 주관해서 실행해 줌.

Interactor

  1. XR Direct Interactor : 직접적인 상호작용을 할 수 있게 해주는 컴포넌트(컨트롤러를 대상에 가져다 대어 집거나 하는 등의 인터랙션을 시도할 수 있는 컴포넌트). HIde Controller On Select옵션 체크 >> 오브젝트를 집었을 때(Select 했을 때) 컨트롤러 모델을 비활성화해 주는 옵션. Select Action Trigger를 state에서 Toggle이나 Sticky로 변경하면 Grip키를 누르고 있을 때 집히는 게 아니라 누르는 순간 집히고 다시 눌렀다, 뗄 때 떨어짐.

Interactable

  1. XR Grab Interactable : 이 컴포넌트가 붙어있는 게임오브젝트들은 집을수 있음. 기본적으로 rigidbody와 collider가 붙어있어야 함. **오브젝트를 잡으면 interactor의 Attach Point(Interactor 쪽으로 당겨져 오는 기능)의 거리를 집을 당시의 위치 그대로 유지하고 싶을 때 XR Offset Grab Interactable를 만들어서 사용하면 됨.

혹시나 새로운 기능을 추가 하고 싶어서 interactor와 Interactable을 커스터 마이징 해야 한다면 XR Base Interactor나 XR Base Interactable 등 기존의 클래스들을 상속받아서 재정의 하는 것을 추천.

 

5. Events

  • 어떠한 상황이 되었을 때 실행할 수 있는 기능을 연결할 수 있음.

XR Grab Interactable의 컴포넌트에서 Interactable Events

  • First, Last이벤트 :
  • 퍼스트 이벤트들은 여러 인터랙터들이 순차적으로 인터랙터를 했을 때 가장 먼저 들어온 인터랙터만 처리하는 이벤트고 거꾸로 라스트 이벤트들은 가장 마지막에 나간 인터랙터만 처리하는 이벤트.
  • Hover이벤트 : Interactor와 Interactable이 Overlap 되는 상황을 의미
  • Select이벤트 : Overlap상태에서 Select제스처를 하면 일반적으로는 Grip키를 누르면 Interactor가 Interactable을 Select 하게 됨.
  • Activate이벤트 : Select상태에서 Grip키를 누르고 있는 상태에서 Activate제스처를 하게 되면 발새하는 이벤트. 일반적으론 Trigger 키로 설정돼있음.

XR Interactor컴포넌트의 Interactor Events

(사용할 수는 없고(Activate 할 수 없음) Hover와 Select계열의 이벤트들만 연결할 수 있는 걸 볼 수 있음)

  • Hover Entered, Hover Exited
  • Select Entered, Select Exited
728x90
반응형
728x90
반응형
vr 프로젝트 빌드 설정 방법

vr기기 사용해서 빌드하려면 >> 해당 컴퓨터에 vr장비가 연동되어 있어야 함.

안드로이드 기반 플랫폼에 독립형으로 설치하여 실행하고 싶다면 >> Android 플랫폼으로 빌드하듯이 설정하여 빌드하면 됨.

빌드셋팅 >> Android플랫폼 클릭 switch Platform 클릭 >>
player Settings >> Android탭 >> Other Settings >> Auto Graphics Api 체크 >> Identification에서 Minimum Apl Level을 Android 10.0버전으로 설정(자기가 가지고 있는 vr기기의 Android 최소버전으로 설정해두면 됨 == 오큘러스 퀘스트2는 Android 10.0버전) >>
XR Plug-in Management >> 안드로이드 모양 클릭 >> Plug-in Providers에 Oculus클릭.

빌드셋팅 >> Android >> Run Device >> 오큘러스퀘스트 장비 선택 >> 빌드엔 런클릭 >> APK파일 생성됨.

728x90
반응형
728x90
반응형
초기 설정 후 기본 설정 하기

메뉴바 edit >> Project Settings >> XR Plugin Management >> Oculus 체크 >>

(독립형으로 Oculus를 실행시키고 싶다면 안드로이드모양 클릭 >> Oculus체크 ==> PC버전이나 시뮬레이터로만 진행할거라면 체크할 필요 ㄴㄴ) >>

player탭 >> Resolution and Presentation 클릭 >> Run in Background 체크(시뮬레이터로 작업할 때 오작동 막기 위해)

프로젝트 매니저 >> XR Interaction ToolKit >> Samples >> 두개(Starter Assets, XR Device Simulator) 다 임포트

 

Starter Assets

  • XRI Default Actions 파일 >> HMD와 왼손, 오른손 컨트롤러의 기본적인 액션들이 설정되어 있는 Input Action파일들.
  • Starter Assets 파일 안 preset들(move,turn,controller등등)은 Add to ActionBasedContinuousTurnProvider default 클릭해줘서 나중에 컴퍼넌트들 사용할 때 자동으로 연결 되도록 해줌.

edit >> project settings 클릭 >> Preset Manager >> 위에서 추가해둔 preset들 중 ActionBasedController >>

오른손 컨트롤러엔 Right, 왼손 컨트롤러엔 Left 입력 >>Hierarchy창 +버튼 클릭 >> XR 메뉴 있는지 확인

 

XR메뉴 없거나, 콘솔창에 클리어 버튼을 클릭해도 버그가 있거나, 이외에 문제가 있으면 XR 제대로 깔리지 않은거니까

다시 깔아야됨. 패키지 버전이 문제 일 수 있으니 알아서 체크 

 

오큘러스 셋팅하기

oculus.com/setup url 페이지에서 자기 기기 소프트웨어 다운로드 클릭

오큘러스 소프트웨어 >> 헤드셋 추가 클릭해서 기기 연결

설정 탭 >> 일반 >> 알 수 없는 출처 활성화 >> OpenXR Runtime 클릭

728x90
반응형

'유니티' 카테고리의 다른 글

유니티 Post Processing 적용이 안되는 경우  (0) 2024.01.23
VR 프로젝트 빌드하는 방법  (0) 2023.12.28
VR 프로젝트 초기 셋팅  (0) 2023.12.28
유니티 UI버튼 클릭 안될 때  (0) 2022.09.13
Layer Mask 와 Layer Tag  (0) 2022.08.16
728x90
반응형
프로젝트 초기 설정


허브실행 >> 3D(URP)프로젝트 실행 >> read me에셋 파일 삭제 >> 윈도우 >> 패키지 매니저 클릭 >>

InputSystem (1.3.0) , XR Plugin Managerment (4.2.1) , Oculus XR Plugin (1.11.2) 설치 >>

좌측위 Add plackage from git URL버튼 클릭 >> com.unity.xr.interaction.toolkit 입력 add 클릭 (2.0.0)

728x90
반응형

'유니티' 카테고리의 다른 글

VR 프로젝트 빌드하는 방법  (0) 2023.12.28
VR 프로젝트 기본 설정  (0) 2023.12.28
유니티 UI버튼 클릭 안될 때  (0) 2022.09.13
Layer Mask 와 Layer Tag  (0) 2022.08.16
Raycast에 대해 알아보자. + Input.mousePosition  (0) 2022.08.12
728x90
반응형
게임 수학 이란!

크게 3가지로 나눌 수 있다. 

공간에 대한 수학 :

현실세계 vs 가상세계(게임 속 세계)

  • 컴퓨터로 만든 가상 세계는 수로부터 만든 명확한 시스템. == 벡터공간(게임이 사용하는 가상공간의 본질)
  • 물리학의 벡터(크기와 방향을 가진 대상)와 스칼라(크기만 있는 물리량)
  • 수학에서의 벡터(벡터공간의 원소)와 스칼라(체 집합의 원소)
  • 가상세계가 구축되는 원리를 파악해보자면 우리가 원하는 모습으로 가상세계를 변형해야 되는데 이것을 수학에서는 변환이라 한다(Transformation). 1초에 60프레임을 찍어내는 게임에서는 변환을 빠르고 단순하고 명료하게 이루어져야 한다. 이것을 선형 변환(Linear Transformation)이라 한다.
  • 보다 그럴듯한 모습을 화면을 보여주기 위해 나름의 공간변환체제를 만들어 둔게 렌더링 파이프라인.
  • 렌더링 파이프 라인 : 로컬공간 >>(모델링 변환) >> 월드공간 >> (뷰변환) >> 뷰공간 >>(원근 투영 변환)>> 사영공간
  • 이러한 체계가 만들어 졌으니 컴퓨터에 일을 시켜야 하는데 이 일을 지시하기 위한 도구가 바로 수학의 행렬.((Matrix) - 선형 변환을 수행하는 도구)
  • 행렬이란? 컴퓨터로 하여금 가상공간을 빠르게 변환시키도록 지시하는 일종의 명령어라 할 수 있음. 렌더링 파이프라인이 만들어져있는 만큼 행렬도 사용하는 행렬이 정해져 있지만 스스로 행렬을 설계할 수 있도록 기본원리를 이해하는 것이 중요함.
  • 이것들을 이해하고 나면 다음으로 평면의 방정식을 사용해서 여러 개의 평면을 사용해서 자신의 공간을 구축하는 방법을 알아야 된다. >> 카메라가 보는 영역 == 절두체(Frustum) - 6개의 평면으로 구성. 게임의 특징인 보이는 물체만 걸러내서 렌더링 하는 수학적인 메커니즘이 만들어 지게됨. 이렇게 해서 1초에 60프레임이라는 빠른 렌더링이 가능하게 된 것.
  • 가장 중요한 것 : 1) 수의 체계와 벡터 공간. 2) 선형 변환과 행렬
물체에 대한 수학 : 
  • 게임에서 사용하는 가상공간의 체계와 물체를 구성하는 데 사용하는 수학
  • 가상세계는 다차원으로 구성된 수의 데이터인 벡터 공간으로 구성되어 있다 하였는데 벡터공간은 어떤 대상의 성질을 표현하는 데 사용되는 데이터. 따라서 벡터 공간의 공간과 현실세계의 공간은 다른 공간. 하지만 벡터공간으로 현실세계의 공간을 만들어 내야 한다. >> 공간의 차원을 늘린다. ex>> 2차원 물체의 표현- 2차원 , 이동의 구현 - 1차원 == 총 3차원의 공간을 활용, 3차원의 물체를 이동하려면 - 3차원의 물체의 표현 -3차원, 이동의 구현 -1차원 == 총 4차원의 공간을 활용.
  • 수학의 벡터는 게임을 구현하기 위해 점 또는 (이동)벡터 중 하나로 사용된다.
  • 게임은 벡터 공간을 1) 물체를 표현하는 공간 = 아핀공간 2) 이동을 위한 공간으로 분리해 관리한다.
  • 아핀공간에 속한 요소들이 벡터이긴 하지만 이 요소들은 물체를 표현하는데 사용되고, 이 요소들을 구분 짓기 위해 별도로 점이라 하고, 따라서 가상공간의 물체는 점으로 구성되어 있다.
  • 벡터공간의 다른 부분 공간인 이동을 위한 공간에 속한 벡터 == 벡터(Vector) 또는 이동벡터
  • 수학적 벡터 : 벡터 공간의 원소. / 물리적 벡터 : 크기와 방향을 가진 대상. >> 이동벡터는 물리적 벡터에 해당.
  • 아핀공간의 점을 사용해서 물체를 만들면 이물체는 이동벡터가 가지고 있는 크기와 방향을 사용해서 이 점을 이동시키도록 구현되어 있다.(점 --->점 , 화살표 = 이동벡터) 수식: P1 + v = P2 , 두 점 사이에는 하나의 벡터가 대응된다. v = P2-P1 (= 이동벡터를 알 수 있음)
  • 정리하면, 게임은 벡터 공간을 1. 물체를 표현하는 공간. 2. 이동을 위한 공간.으로 분리하여 관리한다.
  • 게임에서 보이는 3차원 공간은 실제로는 4차원 공간
  • 게임공간 (움직일 일이 없기에 1차원(0,0,0)은 기본값으로 두고 3차원만 사용) = 월드공간
  • 물체를 배치하는 과정 >> 물체의 공간(아핀공간의 점들로 구성되어 있음, 이 역시 4차원 공간으로 구성되어있음(물체는 이동을 하기에 1차원공간 적극적으로 사용 ) ) = 로컬공간
  • 월드공간으로 로컬 공간과 점을 들고 겹쳐두는 거라 생각해야돼.
  • 정리하면 >> 4차원 공간을 생성하고, 3차원 공간으로 대상을 표현하고 확장한 1차원 공간으로 이동을 구현. 벡터는 용도에 따라서 물체를 구성하는 데 사용하는 점과, 물체를 이동하는 데 사용하는 (이동)벡터로 나누어진다. 그래서 우린 점에 대한 수학과 이동벡터를 다루는 수학으로 나누어 공부할 거임. 
    • <게임을 만들기 위해서는>
    • - 로컬 공간 : 개별 물체의 공간 (모델링 진행, 모델링한 결과물은 메시데이터로 변환되어 게임 엔진에 들어감. 게임엔진에서 메시 데이터는 세 개의 정점으로 구성된 삼각형으로 분해됨)
    • - 월드 공간 : 물체들이 모인 게임의 공간.(우리가 흔히 게임 스테이지라고 부르는 공간)
    • - 카메라 공간 : 플레이어가 보는 공간
    • - 최종 렌더링 진행
  • 게임이 시작되면 프레임마다 월드 공간이 사용자 입력과 지정된 로직에 따라 시뮬레이션되고(로컬공간 - 월드 공간의 변환) 이 프레임에 수행할 시뮬레이션이 완성되면 카메라에 보여지는 물체만 걸러내서 렌더링을 진행하게 됨.(월드 공간 - 카메라 공간의 변환)
  • 전자를 게임 로직( :물체의 배치 설정), 후자를 렌더링 로직(: 화면에 그릴 데이터 설정)이라 말한다. 앞서 설명한 공간에 대한 수학과 점에 대한 수학은 렌더링 로직에서 굉장히 중요하게 사용됨. 
      • 게임 로직 단계에서는 특수한 경우를 제외하고는 점에 대한 수학을 쓸 일이 별로 없음. 게임에서 물체가 이동하는 것은 물체를 구성하는 점이 이동하는 것이 아니고 물체를 담는 공간이 이동하는 것(벡터의 수학). 따라서 이때는 점을 다루지 않고 평행이동한 공간의 원점과 그 공간을 구성하는 중심축의 변환에 대해서만 신경 쓰면 됨.
      • 이렇게 공간의 변환을 설정하는 것을 트랜스폼이라 함.>> 트랜스폼(Transform) : 크기, 회전, 위치를 순서대로 조합한 변환. 트랜스폼의 최종 정보는 내부적으로는 행렬로 구성되어 있지만 게임 로직에서는 행렬의 정보를 사용하지 않고 크기, 위치, 회전의 3가지 데이터로 쪼개서 관리.
    1.  
    1.  
  • 벡터에 대한 수학이란, 개별 물체가 가지고 있는 크기, 위치, 회전에 대한 정보를 계산하는 데 사용하는 수학을 말함. 벡터의 연산을 통해 벡터와 스칼라가 상호 순환하는 시스템이 만들어진다.

<벡터의 연산>

        1. 벡터와 벡터의 덧셈(기본) - 각축의 크기만큼 평행 이동
        2. 벡터와 스칼라의 곱셈(기본) -벡터가 가지고 있는 고유한 성질, 평면의 기울기로 볼 수 있음. 그 기울기를 그대로 유지한 상태에서 원점으로부터 크기를 쭉 조절해 주는 동작. ** 2의 스칼라의 짧은 정의: 사칙 연산이 가능한 수 집합의 원소를 의미( == 우리가 일상생활에서 사용하는 실수가 바로 스칼라)
        3. 벡터의 내적(응용)
        4. 벡터의 외적(응용)
      • 1,2의 연산을 벡터의 기본연산이라 하는데 이 두 개의 연산을 조합해서 사용하면 새로운 벡터를 생성할 수 있다. 이것을 선형 조합이라 하는데 평행하지 않은 두 벡터를 조합하면 평면에 있는 모든 벡터를 생성할 수 있다.( == 평면의 경우, 평행하지 않은 두 기저 벡터를 선형조합하면 평면상의 모든 벡터를 생성할 수 있다.)
      • 벡터의 두 기본 연산은 벡터의 생성 시스템에 사용하는 선형 조합을 구성하는 필수 연산임. 조합하는 데 사용하는 가장 기본적인 벡터 두 가지. >> x축에 해당하는 1.0과 y축에 해당하는 0,1 이 둘을 조합하면 공간에 속한 모든 벡터를 손쉽게 생성해 낼 수 있음. 이 두 가지를 표준 기저벡터라 부름.
        • 표준 기저벡터(Standard Basis Vector) : 평면의 모든 벡터를 생성할 수 있는 기저(Basis)에서 가장 기본적인 기저벡터. 
      • 벡터를 다양하게 응용할 수 있는 별도의 연산이 바로 내적과 외적. 벡터의 내적과 외적은 게임 제작과정에서 벡터를 응용하는 데 사용하는 유용한 연산들이다.
      1. 벡터의 내적 (백터 응용에 관련된 거의 대부분의 공식에 들어감.)
        • 벡터의 내적을 사용하면 두 벡터가 서로 직교하고 있는지 아니면 물체가 나의 앞쪽에 있는지 뒤쪽에 있는지 판별 가능, 어떤 시야각이 주어졌을 때 해당 시야각의 영역 안에 물체가 들어와 있는지 밖에 있는 지를 판단 할 수 있음.
        • 어떤 벡터를 다른 벡터에 투영시킬 때 주요 사용. 내적의 투영 공식에서부터 평면에 방정식이 유도되고 이 평면들이 모여 절두체 영역(카메라가 보여지는 영역)을 만든다. 여기서 그 카메라가 보는 영역 안에 있는 물체만 골라낼 수 있는 수학공식과 알고리즘이 만들어짐.
      2. 벡터의 외적 (벡터의 외적연산은 3차원에서만 가능)
        • 내적이 직교성을 판별하는 데 사용했다면 외적은 평행성을 판별하는 데 사용.
        • 내적은 앞뒤를 판별하는데 사용한다면, 외적은 좌우를 판별하는데 사용.
        • 벡터의 외적은 내적의 부족한 부분을 보충해 주는 성질이 있음. (상호 보완적인 성질)
        • 평행하지 않은 두 벡터의 조합은 평면을 만든다면, 여기에 수직인 벡터, 즉 평면의 방향을 외적을 통해서 파악할 수 있음. >> 이러한 과정을 계속 거치면 3차원 공간을 구성하는 세 가지 축을 모두 다 외적을 사용해서 계산할 수 있음.
3. 회전에 대한 수학

 

회전에 대한 수학 (삼각함수와 회전 행렬)

  • 게임에서 변환은 물체가 움직이는 것이 아니고 물체를 담은 공간이 움직인다.
  • 벡터공간을 집이라 하면 이를 떠 받들고 있는 주춧돌로 표준기저벡터(평면의 모든 벡터를 생성할 수 있는 기저에서 가장 기본적인 기저벡터)를 설명할 수 있다. 벡터공간의 모든 벡터는 표준기저벡터의 선형조합으로 만들어지기 때문.
  • 표준기저 벡터를 변경시키면 어떻게 될까??
    • 벡터 공간에 속한 모든 원소들이 표준기저벡터가 변화된 그 모습에 따라 모두 재배치 >> 공간 변환의 원리(>> 원 공간을 떠 받들고 있었던 표준기저벡터터를 변경시켜 새로운 공간을 창조하는 작업.)
  • 회전 변환의 원리
    • 회전 변환을 적용해 변환된 물체는 외형이 변하지 않는다.
    • 표준기저벡터가 가지고 있던 성질을 그대로 유지시켜 변환시켜준다.
  • 2차원 공간에서 크기가 1인 두 표준기저벡터가 가지는 (직교하는(직각)) 성질을 유지시켜주면 회전 변환을 만들 수 있음.
  • 삼각함수 :
    • 빗변, 높이, 밑변을 가진 삼각형 - 세 가지를 조합해서 만든 비를 삼각비라 한다. (높이/빗변, 밑변/빗변, 높이/밑변 >> 여기서 파생된 것이 삼각함수 : 높이/빗변을 싸인 함수, 밑변/빗변을 코사인 함수, 높이/밑변을 탄젠트함수라 한다.)
     
  •  2차원 평면의 회전 행렬(Rotation Matrix)-- [ cos -sin ]- sin cos- 첫 번째 기저벡터가 변화된 값 두 번째 기저벡터가 변화된 값]
  • 3차원 공간에서의 회전은 더 까다로움.
    • 축- 각 회전 : 대표적인 방식 : 로드리게스 회전공식 >> 단점 : 행렬로 변환하기 어렵기 때문에 렌더링 파이프 라인의 중간에 위치힌 파이프라인 흐름이 끊기게 됨.
    • 오일러 각 회전 (x, y, z 표준기저벡터를 총 세 번 돌려주는 방식) : 직관적이기 때문에 대부분의 3차원 그래픽 툴에서 사용하며 적은 양의 데이터로 3차원 회전을 표현할 수 있다. >> 단점: 한 번의 회전을 3번으로 끊어서 표현하기에 임의의 축에 대해 부드럽게 움직이는 회전을 계산하기 어려움(매움직임마다 3번씩 끊어서 회전하기 때문), 가끔 한 축의 회전이 증발해 버리는 짐벌락현상이 발생하기도 함.
    • >> 3차원 회전을 안정적으로 구현하기 위해 다차원의 수체계를 사용해서 해결 >> 사원수(쿼터니언)

쿼터니언(사원수에 대해)

사원수(Quaternion) - 네 개의 원소(하나의 실수와 3개의 허수)로 구성된 수

실수 : a

사원수 : a + bi + cj + dk

수란 무엇인가 : 집합의 개념에서 수를 관리하고 있음.(집합이란 원소의 묶음을 의미) 수에는 연산이 존재하기 때문에 단순 집합과 차별점을 가진다. 수는 구조(시스템)를 가진 집합이다.

연산에 대한 공리(Axiom)

  1. 교환 법칙
  2. 결합 법칙
  3. 분배 법칙
  4. 항등원
  5. 역원

덧셈과 곱셈 연산에 대해 위 공리를 가지는 집합은 수가 될 수 있다.

복소수 - 두 개의 원소로 구성된 수 a + bi

사원수 - 실수부와 허수부로 구성

모든 회전이란 크기가 1인 수와의 곱이다.

크기가 1인 복소수의 곱은 평면에서의 회전 변환과 동일하다.

크기가 1인 사원수와의 곱은 4차원 공간에서의 회전을 의미한다.

사원수의 활용

  • 사원수를 사용해 빠르게 벡터를 회전시킬 수 있다.
  • 축-각 방식이고 절반의 각으로 파생되기 때문에 일반인들이 직관적으로 사용하기는 어렵다.
  • 게임 제작에서 고정된 각을 지정하기 위해서는 오일러 각은 여전히 유용하다.
  • 사원수는 행렬로 변환이 용이.

쿼터니언과 오일러는 인프런 강의로는 제대로 이해되지 않았다.

자세하게 나온 블로그 참고 : https://luv-n-interest.tistory.com/805

728x90
반응형
728x90
반응형

코딩 테스트를 풀다가 알게 된 튜플 자료형.

프로그래머스 방문 길이를 풀면서 어떻게 좌표를 저장할지 고민하던 찰나에 리스트에 좌표값 x, y를 저장하고 싶어 구글링 하다가  stackoverflow에서 나와 같은 궁금증을 가진 사람의 질문을 발견했다.

답변을 통해 List<(int, int)> 로 좌표를 저장해 두고 풀었다가 테스트 케이스만 통과되고 틀렸기에 접근 방법을 다시 바꿨다. 간선을 지나왔는지를 체크하는 bool 2차원 배열을 가로, 세로로 나누어서  해결했다.

그래도 이 문제를 통해 새로운 튜플 형식을 찾게 됐기에 기억해 두기 위해 정리해 둔다. 

튜플 형식

튜플 기능 간단한 데이터 구조에서 여러 데이터 요소를 그룹화하는 갈결한 구문 제공.  소괄호로 데이터를 묶음
튜플 형식 값 형식이며 튜플요소는 공용 필드 >> "변경 가능한" 값 형식.    
튜플 구조 (자료형, 자료형) 변수이름 = (자료형 값, 자료형 값);
튜플의 가장 일반적인 사례 메서드 반환형식. out메서드 매개변수를 정의하는 대신 메서드 결과를 튜플 반환형식으로
그룹화 할 수 있음.
(예제 참고 : 
https://learn.microsoft.com/ko-kr/dotnet/csharp/language-reference/builtin-types/value-tuples#tuple-assignment-and-deconstruction)

 

 

선언 방식

튜플 필드의 기본 이름 (int, string) player = (4 , "Nam"); 
// player.Item1 = 4, player.Item2 = "Nam"
튜플 필드의 이름 지정 (int level, string name) player = (4 , "Nam");
// player.level = 4, player.name = "Nam"
튜플 형식의 별칭 지정 using 사용
global using BandPass = (int Min, int Max);
BandPass bracket = (40, 100);
// bracket.Min = 40, bracket.Max = 100

 

 

튜플 할당 및 분해

튜플 형식간에 할당을 위해서는 일단 두 튜플형식의 요소수가 동일해야 되며, 요소의 형식이 동일하거나 암시적 변환 가능해야 됨.

 

할당 (int, double) t1 = (17, 3.14);
(double First, double Second) t2 = (0.0, 1.0);
t2 = t1;
Console.WriteLine($"{nameof(t2)}: {t2.First} and {t2.Second}");
// Output:
// t2: 17 and 3.14

(double A, double B) t3 = (2.0, 3.0);
t3 = t2;
Console.WriteLine($"{nameof(t3)}: {t3.A} and {t3.B}");
// Output:
// t3: 17 and 3.14
튜플 요소값의 튜플 요소의 순서에 따라 할당, 튜플 필드의 이름은 무시되며 할당되지 않는다.
분해 대입연산자를 사용하여 튜플 인스턴스를 개별 변수로 분해 가능. 
var t = ("post office", 3.6);
(string destination, double distance) = t;
Console.WriteLine($"{destination}, {distance}");
// Output:
// post office, 3.6
특정 필드가 필요없다면 _를 입력하여 무시하고 분해 가능.
var t = (name: "Nam" , level: 100);
var (Name , _) = t; // level 무시
Console.WriteLine($"{Name}"};
//Output:
//Nam

 

 

연산자 != , == 지원

튜플 요소 순서에 따라 왼쪽 피연산자의 멤버와 오른쪽 피연산자의 해당 멤버를 비교할 수 있다.

이에 따른 bool값을 사용할 수 있다.

단, 두 튜플의 요소 수가 동일해야 된다.

 

튜플과 System.Tuple 은 다르다!

  지금까지 말한 튜플형식 == System.ValueTuple System.Tuple
형식 값 형식(값 변경 가능) 참조 형식(변경 불가능)
(그럼에도 형식 내의 개별 요소들은 모두 변경 가능한 타입이 될 수 있음.
>>
이런 특성은 마치 readonly필드처럼 변경 가능의 여지를 일부 남겨두고 있다 생각하는 것이 좋음.)
데이터 멤버 필드 속성
참고링크 위의 예제 참고 링크 https://codingcoding.tistory.com/18

 

728x90
반응형

'c#' 카테고리의 다른 글

c# 다차원 배열과 가변배열  (0) 2023.12.15
Invoke 와 BeginInvoke의 차이점  (1) 2023.12.14
async 와 await 키워드(비동기 함수)  (0) 2023.04.07
TCP VS UDP  (0) 2023.03.08
객체지향 프로그래밍  (0) 2023.03.08
728x90
반응형
사용할 때 마다 헷갈려서 다시 한번 공부 해보는 다차원 배열과 가변 배열.
c#에서 배열은 참조형! 
배열의 장점 : 연속된 메모리 공간에 데이터가 저장되므로 속도가 빠름.
배열의 단점 : 할당된 배열의 크기는 변경 X >> 메모리 사용 비효율적.
즉, 한번 메모리를 할당 해두면 데이터를 저장하지 않아도 메모리가 사용됨. 

다차원 배열
  • 1차원 배열: 가로로 쭉 값이 들어가는 나열형식.
자료형 배열이름[가로크기(열)] int[] scoreArr = new int[5] {60, 50, 40, 70, 30}; //1행 5열
  • 2차원 배열 : 1차원 배열이 n개 있는 것.  가로, 세로 나열형식. ex>> 평면이 사각형 모양
자료형 배열이름[세로크기(행), 가로크기(열)]
int[,] scoreArr = new int[2,3]
{
   //2행 3열
   {90,30,50},
   {20, 80,100}
}; 
 for (int i = 0; i < 2; i++)
 {
      for (int j = 0; j < 3; j++)
      {
           Console.Write($"{twoArray[i, j]}\t");
      }
 }
  • 3차원 배열 : 2차원 배열이 m개가 있는 것. 2차원 배열에서 더 나아가 한 종류의 배열을 더 가진 배열. 가로, 세로, 높이 나열형식. ex>>3차원 3D로된 사각형 모양
자료형 배열이름[높이(면),세로크기(행),가로크기()]
int[,,,]scoreArr = new int[2,3,5] { 
   { 
      {99, 90, 95, 93, 91}, 
      {85, 89, 81, 83, 87},
      {72, 74, 76, 77, 78}
   }, 
   { 
      {60, 64, 62, 67, 68}, 
      {52, 53, 57, 58, 56}, 
      {42, 44, 46, 47, 48} 
   } 
};
for (int i = 0; i < 2; i++)
{
     for (int j = 0; j < 3; j++)
     {
          for (int k = 0; k < 5; k++)
          {
               Console.Write($"{threeArray[i, j, k]}\t");
          }
     }
}

 

가변배열
  • 다차원 배열과 비슷하지만 비슷하지 않음. 다양한 1차원 배열들을 가지고 있는 배열.
  • 행과 열을 가지는 가변배열.
  • 가변배열의 요소는 다양한 차원과 크기를 가질수 있어 "배열의 배열" 이라 함.
자료형[][] 배열이름 = new 자료형[n][]; n은 1차원 배열들의 갯수를 말하고 그뒤 대괄호는 표기 X.(1차원 배열의 길이 다 다를 수 있음)
int[][] array = new int[3][];

array[0] = new int[2];
array[1] = new int[3];
array[2] = new int[4];
int[][] array = new int[3][];

array[0] = new int[2]{1, 2};
array[1] = new int[3]{3, 4, 5};
array[2] = new int[4]{6, 7, 8, 9};

int[][] array = new int[][]
{
new int[]{1, 2, 3},
new int[]{4, 5, 6},
new int[]{7, 8, 9}
};
int[][] array =
{

new int[]{1, 2, 3},
new int[]{4, 5, 6},
new int[]{7, 8, 9}
}
728x90
반응형

'c#' 카테고리의 다른 글

튜플(Tuples) 자료형 - 튜플 형식에 대해  (0) 2023.12.19
Invoke 와 BeginInvoke의 차이점  (1) 2023.12.14
async 와 await 키워드(비동기 함수)  (0) 2023.04.07
TCP VS UDP  (0) 2023.03.08
객체지향 프로그래밍  (0) 2023.03.08
728x90
반응형

invoke멈춤 현상이 궁금해져서 자료 조사하던 중 BeginInvoke를 알게 되었다.

그래서 찾아본 invoke와 BeginInvoke의 차이점.

 

Invoke는 컨트롤의 본인 스레드가 아닌 다른 스레드를 이용하여 해당 컨트롤 객체를 동기식으로 실행하는 방법.

BeginInvoke는 컨트롤의 본인 스레드가 아닌 다른 스레드를 이용하여 해당 컨트롤 객체를 비동기식으로 실행하는 방법.

 

두가지중 무엇을 사용해야 될지 고민이라면

계속 진행하기 전에 ui업데이트를 완료하려면 invoke. 요구사항이 없으면 BeginInvoke

 

BeginInvoke에 대해 더 자세하게 알고 싶다면

>> https://www.codeproject.com/Articles/10311/What-s-up-with-BeginInvoke

 

시간될때 비동기 프로그래밍을 편리하게 사용하도록 나온 async await 에 대해서도 깊이 알아두자.

728x90
반응형

'c#' 카테고리의 다른 글

튜플(Tuples) 자료형 - 튜플 형식에 대해  (0) 2023.12.19
c# 다차원 배열과 가변배열  (0) 2023.12.15
async 와 await 키워드(비동기 함수)  (0) 2023.04.07
TCP VS UDP  (0) 2023.03.08
객체지향 프로그래밍  (0) 2023.03.08

+ Recent posts