특정 벡터에 수직인 임의의 벡터
벡터A에 수직인 B를 구하는 방법은?
수직이란 말은 내적값이 0 이라는 것을 이용한다.
A Dot B = 0
1. A(x,y,z) 일 때 B(-y, x, 0) 인 경우를 생각해 보자.
A dot B = -xy + xy + 0 = 0
두 벡터는 수직이다.
하지만 만약 A가 A(0, 0, 1)이었다면 어떠한가?
A(0, 0, 1) , B(0, 0, 0) 이 되어 B 벡터가 0벡터가 되버린다.
2. A(x,y,z) 일 때 B(0, -z, y) 인 경우를 생각해 보자.
A dot B = 0 -yz + yz = 0
두 벡터는 수직이다.
하지만 만약 A가 A(1, 0, 0)이었다면 어떠한가?
A(1, 0, 0) , B(0, 0, 0) 이 되어 B 벡터가 0벡터가 되버린다.
3. 위 두 방식을 합쳐보면 어떨까?
A(x,y,z) 일 때 B(-y, x-z, y) 인 경우를 생각해 보자.
A dot B = -xy + y(x-z) + yz = 0
두 벡터는 수직이다.
이제 문제는 해결 되었을까?
만약 A가 A(1, 0, 1)이었다면 어떠한가?
A(1, 0, 1) , B(0, 0, 0) 이 되어 B 벡터가 0벡터가 되버린다.
그럼 어떻게 해야 하는가?
내가 사용한 방식은 각 요소의 절대값을 비교하는 것이다.
abs(v.x) > abs(v.z) ? vec3(-v.y, v.x, 0.0) : vec3(0.0, -v.z, v.y)
절대값 x가 절대값 z 보다 크다는 말은 x 또는 y의 절대값이
벡터내에서 가장 큰 값이라는 말이다.
그래서 벡터를 만들 때 x와 y를 사용한다.
반대로 절대값 x가 절대값 z보다 작거나 같다는 말은 벡터에서
가장 큰 값은 y거나 z란 말이 된다.
그래서 벡터를 만들때 y와 z를 사용한다.
이렇게 하면 구해지는 결과벡터가 영벡터가 되지 않는다.
Reference
- http://www.gpgstudy.com/forum/viewtopic.php?p=102833
- http://mathworld.wolfram.com/PerpendicularVector.html
- http://lolengine.net/blog/2013/09/21/picking-orthogonal-vector-combing-coconuts
- pbrt 책 63page.
'Study > Mathematics & Physics' 카테고리의 다른 글
라디안(호도법)을 사용하는 이유 (0) | 2011.09.02 |
---|---|
오일러의 문제점과 쿼터니온에 관한 동영상 (0) | 2009.12.09 |
음수의 비트연산 (0) | 2009.07.27 |
1의 보수 (0) | 2009.07.17 |