외적
벡터 곱(cross product)로 두 벡터에 수직인 다른 벡터로 나오며 오른손 법칙에 의해 수직 방향이 결정된다.
계기
외적을 사용하던 중 생각했던 것과 다르게 나타나는 것을 알게 되었다. 이 문제가 왜 일어나게 되었는지 어떻게 해결하면 좋을까 싶어 조사를 하였다.
void ASCharacter::UpdateMouseVector()
{
LastForward = GetActorForwardVector();
//1: (액터의 정면 x축) X (액터의 위 z축)
StrafeVector = FVector::CrossProduct(LastForward,GetActorUpVector());
//2: (액터의 위 z축) X (액터의 정면 x축)
StrafeVector = FVector::CrossProduct(GetActorUpVector(),LastForward);
//Debug
const float DrawScale = 1000.f;
const float Thickness = 10.f;
FVector LineStart = GetActorLocation();
LineStart += GetActorRightVector()*100.f;
FVector ActorDirection_LineEnd = LineStart + (LastForward*100.f);
DrawDebugDirectionalArrow(GetWorld(),LineStart,ActorDirection_LineEnd, DrawScale,FColor::Red,false,0.f,0,Thickness);
FVector ActorUpDirection_LineEnd = LineStart+(GetActorUpVector()*100.f);
DrawDebugDirectionalArrow(GetWorld(),LineStart,ActorUpDirection_LineEnd, DrawScale,FColor::Blue,false,0.f,0,Thickness);
FVector CrossVec_LineEnd = LineStart + (StrafeVector*100.f);
DrawDebugDirectionalArrow(GetWorld(),LineStart,CrossVec_LineEnd,DrawScale,FColor::Purple,false,0.f,0,Thickness);
}
1번 형식 외적 | 2번 형식 외적 |
2번 형식이 원하는 방향이었다. x축 X z축 = -y축이 나오는것(1번)을 볼 수 있었으며, 아무리 손가락을 굴리고 뒤집어 봐도 절대 2번 형식이 나오지 않았다.
이에 대해 몇가지 가설을 세워 보았다.
- 외적의 결과에 대해 잘못 알고 있었다.
- Unreal에서는 다르게 적용된다.
- 좌표계에 따라 다르게 적용된다.
고찰
외적은 앞서 말한 것과 같이 오른손 법칙을 사용한다.
이유는 선형대수학에서 오른손 법칙을 사용하기 떄문이다.
오른손 좌표계 시스템
Opengl과 같이 오른손 좌표계를 갖는 경우는 동일한 법칙을 적용하면 된다.
//3: Right
glm::vec3 cameraRight = glm::normalize(glm::cross(up, cameraDirection));
왼손 좌표계 시스템
다이렉트X는 왼손좌표계를 사용한다.
이 때는 외적이 왼손법칙을 적용하게 된다. 아래의 그림과 같이 u x v = w가 나올 수 있게 된다.
결과
Unreal,Unity는 다이렉트X와 같은 왼손 좌표계를 사용한다. 그 의미는 다이렉트X와 동일하게 왼손 법칙을 적용한다는 것을 알 수 있다.
외적의 법칙은 각 시스템의 좌표계에 따라 법칙이 변경된다는 점을 알게 되었다.
외적에 대해 배울 때, 대부분이 “외적은 오른손 법칙”을 따른다라는 것을 배웠다.
오른손 법칙에 따라 코드 작성을 하였으나, 나오지 않아 혼란스러움을 가졌었지만 이번 계기로 외적에 대한 지식을 좀 더 얻을 수 있었다.
외우는 것이 아닌 이해를 하기 위해 나처럼 3시간 넘게 왜 그런지를 찾아보지 않기를 바라며 이 글이 도움이 되었으면한다.
참고
- Introduction to 3D Game Programming with DirectX 11
- https://learnopengl.com/
- Why does the "right-hand-rule" for vector cross-products work? : r/askscience (reddit.com)
- Righthanded and Lefthanded Systems of Coordinates and the Cross Product with POV-Ray - Analytical Geometry with POV-Ray (f-lohmueller.de)
'Graphics' 카테고리의 다른 글
[Shader] Step, Mix, SmoothStep (0) | 2024.04.03 |
---|---|
[Shader] Unifrom, Varying, Attribute 차이 (0) | 2024.03.28 |
Mesh란 무엇일까? (0) | 2022.04.01 |
댓글