3D그래픽2012. 6. 16. 10:39

이놈의 normal은 언제 마무리 하려나...

연속되는 회의와 각종 행사(?) 참석에 진행이 더디다. ㅜ.ㅜ

오늘은 토요일 이니 건드는 사람이 없어야 할텐데...!


Normal을 계산하려고 보니, 한가지 더 고려해야 할 사항이 생겼다.

바로 normal의 방향! normal은 면에 수직하는 vector 이므로, 당연히 triangle의 외부와 내부로(이렇게 구분하는게 적절한지 모르겠지만) 향하는 두 개의 normal을 갖게 된다.

그리고 triangle에 대해 normal을 계산할 때는 세 개의 vertex를 가지고 2개의 vector를 만들어 외적(cross product)를 해서 구하게 되는데, 어떤 벡터의 조합과 어떤 순서로 외적을 하느냐에 따라 이 normal의 방향이 결정된다. (즉 A x B != B x A)

그래서, vector들을 어떤 순서로 외적에 적용해야 할지가 고민이었다.

구글링을 해 보면, 순서가 중요하므로 외부로 향하는 normal을 계산해야 하며, 모든 triangle에 동일한 규칙을 적용해야 한다는 내용밖에 찾을 수 없었다. (검색능력의 부족 -_-;)


그래서, (머리가 나쁘면 손발이 고생하는 법!) 그냥 무식하게 두 개의 삼각형으로 사각형을 만들어놓고, 엑셀에서 vector들의 모든 순서 조합으로 외적을 구해 보았다.


그 결과에서 다음과 같은 결론(?)을 얻게 되었다.


하나의 vertex가 vector의 기준(출발?)점이 되는 두 개의 vector를 외적할 때, 오른손의 네 손가락을 하나의 vector 방향과 일치 시켰을 때, 엄지손가락이 가리키는 방향이 normal의 방향이다!


어설픈 그림으로 설명 해 보자면,

          A
        /
      /
    /
B  ------- C

BA x BC를 계산(외적) 한다고 생각하면,

네 손가락(혹은 손날?)을 BA와 나란히 놓고, 네 손가락의 끝을 A 방향으로 향하도록 하면, 엄지손가락은 모니터 안쪽을 가리키게 되고, 이것은 OpenGL의 좌표계에서 -Z 방향에 해당한다.

즉, -Z 방향으로 향하는 normal이 계산 된다는 이야기 이다.


반대로, BC x BA를 계산(외적)한다고 생각하면,

네 손가락(혹은 손날?)을 BC와 나란히 놓고, 네 손가락의 끝을 C 방향으로 향하도록 하면, 엄지손가락은 모니터 바깥쪽, 즉 내 눈을 가리키게 되고, 이것은 OpenGL의 좌표계에서 +Z 방향에 해당한다.

즉, +Z 방향으로 향하는 normal이 계산 된다는 이야기 이다.


학부 혹은 대학원의 컴퓨터 그래픽 강의에서 가르쳐주는 내용일 수 도 있고, 널리 알려져 있는 내용인지도 모르겠는데, (사실, 아직 항상 적용되는 맞는 내용인지에 대한 확신도 없는 상태 ^^;) 개인적으로 이러한 강의를 들어본 적이 없어서 이러한 삽질을 해야 한다. orz


그래서, 요즘 iTunes U에서 발견한 Harvard에서 제공하는 E234 강좌를 보고 있는데, 쉽지는 않지만 재미도 있고 도움도 많이 되는 것 같다. 이제 3분의 1정도 봤는데, 다 보고나면 컴퓨터 그래픽에 대한 윤곽이 좀 잡히려나? 아직 늦지 않았다고 생각 하지만, 직작다니면서 혼자 보고 공부하는게 쉽지는 않은듯. 그래도 재미있으니 다행이다.ㅋ

Posted by 세월의돌