ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Matrix Methods
    Programing/XNA 2008. 8. 19. 11:22

    XNA의 Matrix Methods들에 대해서 정리해 보자...

    1. CreatePerspectiveFieldOfView 함수
     
    - 시야를 만들어 투영 해주는 함수이다.

    Matrix.CreatePerspectiveFieldOfView
    (MathHelper.PiOver4, aspectRatio, 0.0001f, 1000.0f, out projection);


    오버로딩된 함수로 총 4개 또는 5개의 매개변수를 가지게 되는데...
    첫번째 매개변수는 각도를 나타낸다. 위 예제에서의 MathHelper.PiOver4는 45도를 나타내는 상수값이다.
    두번째 매개변수는 종횡비를 나타낸다. 종횡비란 화면의 가로 / 세로 를 말하는 것으로 예를 들어 다음과 같이 종횡비를 계산 할 수 있다.
    float aspectRatio = (float)graphics.GraphicsDevice.Viewport.Width / (float)graphics.GraphicsDevice.Viewport.Height;

    세번째와 네번째 매개 변수는 각각 근거리와 원거리 클리핑을 나타내는 것이다.
    어디서 부터 어디까지를 보여 줄 것인지를 말한다.
    마지막 매개변수는 이 함수의 결과인 투영 행렬이 저장될 Matrix변수이다.



    2. CreateLookAt 함수

     - 뷰 행렬를 작성해 주는 함수이다. 카메라가 보는 곳!!

    Matrix.CreateLookAt
    (ref cameraPosition, ref cameraTarget, ref cameraUpVector, out view);

    위와 마찬가지로 오버로딩된 함수로 3~4의 인자를 받을수 있다.
    첫번째 매개변수는 카메라의 위치이다. Vector3형 인자로 만약
    Vector3 cameraPosition = new Vector3(0.0f, 0.0f, 3.0f); 라 설정한다면 지금 카메라는 화면의 정중앙에서 Z축으로 3의 위치에 놓여져 있다는 것이다.

    두번째 매개변수는 바로 카메라가 바라보고 있는 타켓이다. 마찬가지로 Vector3형이며 이 값을 Vector3.Zero로 설정하게 된다면 (0,0,0)을 바라보게 되는 것이다.

    세번째 매개변수는 카메라의 Up벡터이다. 보통 y축방향벡터인 (0,1,0)의 값 Vector3.Up 을 사용하여 전달하게 된다.

    마지막 매개변수는 이 함수의 결과인 투영 행렬이 저장될 Matrix변수이다.




    3. CreateTranslation 함수

    - 월드 행렬의 좌표값을 바꾸어 주는 함수이다. 어떤 물체가 있다면 그 위치를 옮겨준다.

    예를 들어 위의 1,2처럼 투영행렬과 뷰행렬을 설정한 후에 월드 행렬을 다음과 같이 설정하고 그림을 그리게 되면 아래 그림과 같이 보여진다.

    월드행렬 world = Matrix.Identity; (이 값은 항등행렬(0,0,0)을 나타내는 값이다.)

    사용자 삽입 이미지

    world = Matrix.Identity


    위의 그림을 보면 누런 사각형이 파란화면의 중심(0,0,0)에 위치하고 있다. 이 사각형의 위치를 옮기기 위하여 CreateTranslation 함수를 사용한다.

    만약 월드행렬을 아래와 같이 설정하면 사각형의 위치는 오른쪽으로 2만큼, 위쪽으로 1만큼, 화면의 안쪽으로 5만큼 움직여 질 것이다.

    world = Matrix.CreateTranslation(new Vector3(2.0f, 1.0f, -5.0f));

    사용자 삽입 이미지

    Matrix.CreateTranslation(new Vector3(2.0f, 1.0f, -5.0f))


    화면의 안쪽으로 밀어넣었기 때문에 마치 사각형이 작아진것 처럼 보인다. 이는 실제로 작아진 것이 아니고 사각형이 멀어진 것이다.




    4. CreateScale 함수

     
    - 확대 및 축소를 시켜주는 함수이다.

    만약 위의 3의 첫번째 그림처럼 사각형이 화면 중앙에 큼직하게 자리 잡고 있다고 가정하면 혹시나 그림이 너무 큰 나머지 z축으로 화면의 안쪽에 있는 물체가 가려져 보이지 않게 될 경우가 생길 수도 있다. 어쨌든 이 물체를 약 50%정도 축소를 해보도록 하자!
    축소를 하기 위하여 CreateScale 함수를 사용한다.

    world = Matrix.CreateScale(0.5f) * Matrix.Identity;
    (위 월드 행렬의 값은 물체를 50% 축소 후에 (0,0,0)에 위치시키고 있다)

    사용자 삽입 이미지

    Matrix.CreateScale(0.5f) * Matrix.Identity


    이 물체 역시 작아져 보이는데 이것은 실제로 물체가 작아진 것으로 위처럼 물체가 멀어진 것은 아니다. (0,0,0)에 위치하고 있다.



    5. CreateRotationX 함수

    - 물체를 회전 시켜주는 함수로 어느 축으로 회전을 시키느냐에 따라 CreateRotationX, CreateRotationY, CreateRotationZ 함수를 각각 사용하게 된다.

    만약 X축을 기준으로 30도 정도 회전 시켜보도록 하자!
    이 함수는 라디안을 매개변수로 사용하는데 이 라디안 값은 MathHelper 클래스를 이용해서 쉽게 구해낼 수 있다.
    MathHelper.ToRadians 메서드가 바로 그것이다.

    자 이제 위의 4번의 예제 그림에서 X축으로 30도 만큼 회전된 그림을 그려보자!

    world = Matrix.CreateScale(0.5f) * Matrix.CreateRotationX(MathHelper.ToRadians(45.0f)) * Matrix.Identity;
    (함수는 일단 50% 축소 시키고, X축으로 30도 회전시키고, (0,0,0)에 위치 시킨것이다.)

    사용자 삽입 이미지

    Matrix.CreateScale(0.5f) * Matrix.CreateRotationX(MathHelper.ToRadians(45.0f)) * Matrix.Identity;



    이제 물체를 자유롭게 위치 시키고, 회전 시키고, 확대, 축소 시킬수 있게 되었다.


    'Programing > XNA' 카테고리의 다른 글

    SpriteBatch.Draw 메서드  (0) 2009.04.10
    ElapsedGameTime, ElapsedRealTime  (0) 2009.04.09
    XNA 카메라 설정  (0) 2009.04.02
    게임 서비스 만들기  (0) 2009.03.30
    VertexPositionNormalTexture 구조체  (0) 2008.09.09
    XNA 프레임워크의 로직 흐름  (0) 2008.08.19
    XNA 이펙트  (0) 2008.08.13
Designed by Tistory.