반응형

import pygame, sys
from pygame.locals import *

pygame.init()
DISPLAYSURF = pygame.display.set_mode((400,300))
pygame.display.set_caption('Hello World!')
while True: #main game loop
    for event in pygame.event.get():
        if even.type == QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.update()

 

 

Python & Pygame 무료온라인북
http://inventwithpython.com/pygame/chapters/
반응형
반응형

외적 연산(Cross Product)란?

- 임의의 두 벡터와 직교를 이루는 벡터

EX) Cross(A , B)란? A가 B 를 감싸는 형태가 될때 직교가 되는 벡터

- 오른손 손가락 두개를 피고 검지를 A라 하고 중지를 B라 했을때, 왼손 끝을 오른손 검지에 반대로 맞닿고 감싸쥐는 형태

 

EX) Cross(B, A)란? B가 A를 감싸는 형태가 될때 두 벡터와 직교가 되는 벡터

- 왼손을 중지에 맞닿고 감싸쥐는 형태 

 

- 문제 풀이

임의의 두 벡터 A[5,2,3] B[8,1,-4]의 외적을 구해보자. Cross A B를 구해보자.

A x B = [(a2b3 - a3b2) (a3b1 - a1b3) (a1b2 - a2b1)]

계산 순서가 헷갈릴땐 아래 그림을 참고하여 순서를 기억하자.

 

=[((2x -4) - (-3 x 1))  ((-3 x 8) - (5 x -4))  ((5 x 1) - (2 x 8))

= [-5 . -4  ,  -11]

Cross A B 의결과는 [-5 -4 -11] 이라는 새로운 벡터이다. 

 

- 외적의 결과로 두 벡터 사이의 각도도 알 수 있게 된다.

내적으로 코사인을 알수 있게 됬다면 외적으로는 사인 각도를 알 수 있다.

||A X B|| = ||A|| ||B|| sin

먼저 A X B 의 크기와 ||A||  ||B||를 각각 구합니다. 다시 말해 Cross A B 의 크기를 구한다.

||A X B|| =

 ||A|| =

||B|| =

위에서 구한 값을 공식에 대입한다.

||A X B|| = ||A|| ||B|| sin

 

0.23 = sin

sin -1(0.23) = 13.2971

 

 

 

 

- 외적을 알면 어디에 도움이 될까?

EX) 나와 적의 위치를 알때 직교하는 UPVector를 알수 있도록 해준다. 그것이 UpVector가 될수도 있고,  RightVector가 될수도 있기에 상당히 유용하게 사용할 수 있게 된다.

 

 

 

EX) 폴리곤의 법선 벡터 정보를 알려준다.

폴리곤의 직교되는 법선 벡터정보를 알게 되면서 라이트 정보라든지 오브젝트 충돌등에 유용하게 사용할수 있다. 

     

 

반응형

 

반응형
반응형

내적(Dot Product)이란?

-      정규화된

한 벡터가 다른 벡터에 투영된 길이 값을 나타낸다.Ex) Dot(A , B) ? BA위치로 회전했을 때 투영되어 직교되는 위치만큼의 크기 값

 

EX2) Dot(B,A)는?

    

 

 

각 벡터를 Normalize한 후의 스칼라 곱의 결과값이며 그 값은 두 벡터의 코사인의 값과 일치한다. 그러므로 음수 인지 양수 인지 그리고 각도의 크기 값도 알아 낼 수 있다.

 

 

1.    먼저 3D맥스상에서 임의좌표를 가지는 두 개의 벡터를 만든다.

C = [5 , 2, -3]

D = [8, 1, -4]

    

2.    먼저 AB의 크기를 구한다.

 

3.    벡터의 크기 값을 활용하여 정규화(Normalize)를 한다.

 

||Normalize A|| = 1 이어야 한다! 

||Normalize B|| = 1 이어야 한다!

 

 

4.    두 벡터의 내적  A

B 을 구해 보자

A B = a1b1 + a2b2 + a3b3

= [(0.811 x 0.889) + (0.32 x 0.11) + (-0.487 x -0.444)]

= 0.72 + 0.035 + 0.216

= 0.971

 

 

 

5.    이제 내적의 결과값으로 여러가지 결과를 도출할 수 있게 됬음.

         내적의 결과 값으로 알게 된 결론은?

Dot(A,

B) > 0이면

 세타 값은 90도 이하

이므로 BA로부터 90도 각도 안에 있음을 알게 됐다.

 

è

이 결과는 게임로직에서 상당히 많이 사용될수 있다. A가 카메라이고 B가 오브젝트일경우 내적의 결과값이 양수라는 것은 BA의 시야안에 들어옴을 의미하고, 음수라는 것은 BA의 시야안에 들어오지 않음을 의미한다.

 

è

이 결과값을 토대로 디렉셔널 라이트와 오브젝트의 법선 벡터를 고려 했을 때 오브젝트가 빛을 얼마만큼 받고 있는지도 알 수 있게 됐다.

 

A가 디렉셔널 라이트이고 B가 법선 벡터를 가지고 있는 오브젝트라고 했을 때

 

이 정도의 빛을 받는 오브젝트임을 알 수 있다.

 

하지만, Dot(A, B)  = 1이라고 한다면

복사량이 최대치가 되어 가장 많은 빛을 받는 상황이 된다. 12시에 떠있는 태양이라고 생각하면 이해가 빠를 듯~

 

Dot(A, B) 

= 0이라면..

빛을 전혀 받지 않는 연산임을 알 수 있게 됐다. 12시가 되겠다.

 

 

코사인 각도와 노멀라이즈 된 내적의 각도 값은 일치하므로              코사인 각도는 맥스의 Listner 창을 활용해서 쉽게 알 수 있다.

          

           두 벡터 사이의 각도가 13.832도 라는 사실도 알게 됐다.

 

내적연산은 가볍다보니 셰이더 프로그램이나 물리 스크립트 에서도 굉장히 자주 쓰이는 기본적인 연산입니다~^^

 

 

 

Cg언어에 내장된 기본적인 Dot 공식- 두 벡터에 대해 -1 ~ 1 범위의 float 값을 얻을 수 있다. -1은 평행하며 나에게서 멀어지는 벡터, 1은 평행하며 나를 향해 다가오는 벡터, 0은 나와 완전히 수직인 벡터를 의미한다.

 

 

 

 

위에서 힘들게 구한 공식을 맥스 리스너(Max Listner)에서 쉽게 확인 할 수 있다.

 

반응형

 

반응형
반응형

 

 

 

 

 

반응형

'Study' 카테고리의 다른 글

PYTHON 기본 창 띄우기 "Hello World!"  (0) 2016.06.24
외적 연산(Cross Product) 쉽게 이해하기  (0) 2015.12.31
내적 연산(Dot Product) 쉽게 이해하기  (2) 2015.12.30
삼각비의 기본  (0) 2015.12.18

+ Recent posts