
1. 오일러 각의 한계점에 대해 설명해주세요.
2. Unity 내에서 짐벌 락 (Gimbal Lock) 현상을 직접 유도해볼 수 있나요? 그 방법을 적어주세요.
짐벌 락 (Gimbal Lock): 세 개의 회전 축 중 두 축이 평행하게 align되면서, 하나의 자유도가 사라지는 현상입니다. 이로 인해 특정 회전이 불가능해지고, 원하는 방향으로 객체를 회전시키는 것이 어려워집니다.
비연속성 (Discontinuity): 오일러 각의 표현은 회전의 연속성을 보장하지 않아서, 작은 변화에도 큰 회전 변화를 일으킬 수 있습니다. 예를 들어, 각도가 0도에서 360도로 넘어가는 경계에서 문제가 발생할 수 있습니다.
회전 순서 의존성: 오일러 각은 회전 순서에 따라 다른 결과를 초래합니다. 즉, 회전 순서 (예: XYZ, YXZ 등)에 따라 동일한 각도 세트를 사용하더라도 다른 최종 회전 상태를 얻게 됩니다.
직관적이지 않은 표현: 특정 회전을 이해하고 제어하는 데 있어서 직관적이지 않으며, 특히 복잡한 회전을 다룰 때 문제가 됩니다.
Unity 내에서 짐벌 락 현상을 유도하는 방법은 다음과 같습니다:
새로운 3D 프로젝트 생성: Unity에서 새로운 3D 프로젝트를 생성합니다.
간단한 오브젝트 추가: 예를 들어, 기본 큐브(Cube) 오브젝트를 생성합니다.
큐브의 초기 회전 설정: 큐브의 Transform 컴포넌트에서 회전 값을 (0, 0, 0)으로 초기화합니다.
오일러 각을 이용한 회전:
큐브의 회전 값을 아래와 같이 설정합니다:
X 축을 90도로 회전시킵니다: (90, 0, 0)
이제 큐브는 X축을 중심으로 90도 회전되었으므로 Y축과 Z축이 동일한 평면에 있게 됩니다.
짐벌 락 유도:
이제 Y축 또는 Z축을 중심으로 회전을 시도합니다. 예를 들어, Y축을 90도로 회전합니다: (90, 90, 0)
이 상태에서 Z축을 중심으로 회전하려고 할 때, 큐브의 회전이 예상한 대로 이루어지지 않고, 회전 자유도가 하나 줄어드는 것을 관찰할 수 있습니다. 이는 짐벌 락이 발생한 것입니다.
실제 확인:
Unity 에디터 상에서 위의 회전 값을 직접 입력하고, 큐브를 회전시키면서 짐벌 락 현상을 확인합니다.
Transform 컴포넌트의 회전 값이 예상한 대로 반영되지 않는 것을 볼 수 있습니다.
위의 과정을 통해 Unity 내에서 짐벌 락 현상을 직접 유도하고 그 영향을 관찰할 수 있습니다.
1. 월드 스페이스 (World Space) 와 로컬 스페이스 (Local Space)의 차이에 대해 설명해주세요.
2. 벡터의 내적과 외적을 어느 상황에 사용할 수 있는지 설명해주세요.
3. 쿼터니언을 사용하는 이유에 대해 설명해주세요.
월드 스페이스 (World Space):
월드 스페이스는 전역 좌표계를 기준으로 객체의 위치, 회전, 스케일을 나타냅니다.
모든 객체는 같은 기준점을 공유하며, 이를 통해 씬 내에서 절대적인 위치와 방향을 정의합니다.
예를 들어, 게임 세계의 중심이 (0, 0, 0)인 좌표계에서 각 객체의 위치가 이 중심점을 기준으로 설정됩니다.
로컬 스페이스 (Local Space):
로컬 스페이스는 객체의 부모 객체 또는 자기 자신을 기준으로 위치, 회전, 스케일을 나타냅니다.
부모 객체의 변환을 기준으로 상대적인 위치와 방향을 정의합니다.
예를 들어, 팔을 기준으로 손의 위치를 정의할 때 손의 좌표는 팔의 로컬 스페이스를 기준으로 표현됩니다.
로컬 스페이스를 사용하면 객체를 구성하는 하위 객체 간의 관계를 쉽게 관리할 수 있습니다.
차이점 요약:
월드 스페이스는 전체 씬의 전역 좌표계를 기준으로 객체의 위치를 정의합니다.
로컬 스페이스는 객체의 부모 또는 자기 자신을 기준으로 상대적인 위치를 정의합니다.
벡터의 내적 (Dot Product)과 벡터의 외적 (Cross Product)은 벡터 간의 연산에서 사용되는 두 가지 주요 연산입니다. 각각의 사용 상황은 다음과 같습니다:
벡터의 내적 (Dot Product):
코사인 각도 계산: 두 벡터 사이의 각도를 구할 때 사용합니다. 내적의 결과를 통해 두 벡터 사이의 각도를 계산할 수 있습니다.
벡터 정렬: 두 벡터가 얼마나 평행한지 또는 직각인지 판단할 때 사용됩니다. 내적 값이 1에 가까울수록 벡터가 같은 방향, -1에 가까울수록 반대 방향, 0에 가까울수록 직각임을 나타냅니다.
빛의 조명 계산: 조명 계산에서 표면의 법선 벡터와 광선 방향 벡터의 내적을 사용하여 표면이 광원에 대해 얼마나 많이 노출되었는지 계산합니다.
프로젝션: 한 벡터를 다른 벡터 방향으로 투영할 때 사용됩니다. 예를 들어, 속도 벡터를 특정 축에 투영하여 속도의 성분을 구할 때 유용합니다.
벡터의 외적 (Cross Product):
직교 벡터 생성: 두 벡터가 이루는 평면에 수직인 벡터를 구할 때 사용됩니다. 결과 벡터는 두 입력 벡터와 직교합니다.
회전 축 계산: 회전 변환에서 회전 축을 구할 때 유용합니다. 특히, 두 벡터 사이의 회전 축을 정의할 때 사용됩니다.
면의 법선 벡터 계산: 3D 그래픽스에서 삼각형 면의 법선 벡터를 계산할 때 사용됩니다. 삼각형의 두 변의 외적을 통해 면에 수직인 벡터를 얻을 수 있습니다.
토크 계산: 물리 시뮬레이션에서 힘 벡터와 위치 벡터의 외적을 통해 회전력(토크)을 계산할 수 있습니다.
쿼터니언은 회전을 표현하기 위해 사용되는 수학적 구조로, 3D 그래픽스와 게임 개발에서 매우 유용합니다.
쿼터니언을 사용하는 이유는 다음과 같습니다:
짐벌 락 회피: 쿼터니언은 오일러 각에서 발생하는 짐벌 락 문제를 피할 수 있습니다. 쿼터니언은 네 개의 요소로 회전을 표현하므로, 회전 자유도를 잃지 않고 모든 방향에서 회전을 자유롭게 표현할 수 있습니다.
효율적인 보간 (Interpolation): 쿼터니언은 스피어리컬 선형 보간(SLERP)과 같은 방법을 통해 회전 간의 부드러운 보간이 가능합니다. 이는 애니메이션과 카메라 움직임에서 자연스러운 전환을 구현하는 데 유리합니다.
간단한 연산: 쿼터니언을 사용하면 회전을 결합하거나 역회전을 계산하는 연산이 비교적 간단합니다. 행렬 기반 회전보다 연산량이 적고, 누적 오차가 적습니다.
회전의 안정성: 쿼터니언은 누적된 회전에서 발생할 수 있는 오차를 줄여주며, 오랜 시간 동안 안정적인 회전을 유지할 수 있습니다.
메모리 절약: 쿼터니언은 네 개의 숫자로 회전을 표현하므로, 3x3 회전 행렬보다 메모리 사용량이 적습니다.