특정 벡터에 수직인 임의의 벡터

반응형

벡터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
TAGS.

Comments