Matrix(행렬)

Row(행)과 Column(열)로 이루어진 실수들의 사각 배열.

Row와 Column의 갯수에 따라 m×n Matrix라고 부른다.

이 때, m×n은 Matrix의 Dimension(차원)이라 부른다.

 

Square Matrix(정방 행렬)

Row와 Column의 수가 같은 Matrix.

Inverse Matrix(역행렬)이 존재한다.

 

Entry(성분)

Matrix를 구성하는 각각의 수들을 지칭. Element(원소)라고도 한다.

Matrix의 Entry를 지칭 할 때는 Matrix 이름에 아래첨자로 Column과 Row의 번호를 지정한다.

 

Row Vector(행 백터)
Matrix의 Column이 하나인 Matrix.

Vector라 부르는 이유는 이런 Matrix는 주로 Vector를 표현할 때 사용되기 때문이다.

반대로 Row가 하나인 Matrix는 Column Vector(열 벡터)라고 부른다.

이러한 Row/Column Vector를 지칭할 때는 아래첨자 하나만 사용한다.

 

간혹 Matrix의 Column이나 Row를 Vector로 간주하는 경우가 있다.

Matrix A를 Row Vector들로 표현한 것

이 때 각 Row Vector나 Column Vector를 지칭 할 때는 Column 번호나 Row 번호를 지칭 할 수 없다.

때문에 이 때는 '*'를 적어준다.

 

Matrix의 연산

기본적으로 Matrix간의 연산은 두 Matrix의 Column과 Row 수가 동일해야 한다.

Matrix간의 연산(=, +, -)는 같은 Element끼리 연산하기 때문이다.

Matrix와 Scalar간의 연산은 모든 Element에 동일하게 적용된다.

 

Matrix에 적용되는 연산법칙

  • 덧셈의 교환법칙
  • 덧셈의 결합법칙
  • Matrix에 대한 스칼라 값의 분배법칙
  • 스칼라들에 대한 Matrix의 분배법칙

 

Matrix간의 곱셈

두 Matrix A(m × n)와 B(n × p)가 있을 때, 이 두 Matrix의 곱은 AB로 정의된다.

Matrix AB를 C라고 정의 했을 때, C는 m × p Matrix이고,

이의 ij번째 성분은 Matrix A의 i번째 Row Vector와 B의 j번째 Column Vector의 Inner Production을 한 결과이다.

따라서 Matrix들 간에 곱 연산이 성립하기 위해서는 Matrix A의 Row 수와 Matrix B의 Column 수가 일치해야 한다.

다른 말로, A의 Row Vector의 Dimension과 B의 Column Vector의 Dimension이 일치해야 한다.

이 둘이 일치하지 않으면 두 Vector간의 Inner Production이 성립하지 않는다.

 

다음 Vector와 Matrix의 곱 연산을 보자.

uA가 1 × 3 Row Vector로 평가됨을 주목하며 다음 연산을 보자.

따라서

이 관계가 성립한다.

이는 Linear Combination(선형 결합)의 한 예로,

Vector·Matrix 연산인 uA가 Matrix A의 Row들의 Linear Combination에

Vector u에서 비롯된 Scalar x, y, z가 적용된 것임을 말해준다.

이는 어떤 1 × n Row Vector u와 n × m Matrix A 에해 항상 성립한다.

이 외에 Matrix간의 곱셈에서는 배분법칙결합법칙이 만족한다.

때문에 Matrix 곱 연산을 할 때에는 순서를 적절히 선택할 수 있다.

Transpose(전치)

Transpose Matrix는 주어진 Matrix의 행과 열을 맞바꾼 것을 말한다.

Transpose Matrix는 Matrix 이름에 윗첨자로 T를 붙인다.

Identity Matrix(단위행렬)

Main Diagonal Element(좌상에서 우하로의 주된 대각선에 있는 성분)이 모두 1이고,

나머지 Element들은 0인 Square Matrix.

Identity Matrix는 그 이름에서 알 수 있듯이 Matrix간의 곱셈에서 Identy Element(항등원) 역할을 한다.

때문에 Square Matrix와 Identy Matrix간의 곱셈은 교환법칙이 성립한다.

 

Determinant(행렬식)

Square Matrix를 받아서 실수 값을 산출하는 특별한 함수.

Square Matrix A의 determinant는 det A로 표기한다.

 

기하학적으로 2-Dimension Matrix의 Determinant는 넓이를, 3 Dimension Matrix의 Determinant는 부피를 나타낸다.

이를 이용해 Linear Transform 연산 하에 부피가 변하는 방식에 대한 정보를 제공함을 증명하는 것이 가능하다.

이에 대해서는 자세히 작성 된 링크로 대체한다.

https://twlab.tistory.com/44

 

[Linear Algebra] Lecture 20-(2) 행렬식(Determinant)의 기하학적 해석(Geometrical Analysis)

이번 강의는 행렬식(Determinant)에 관한 마지막 강의다. 이번에 알아볼 내용은 determinant가 기하학적(geometrical)으로 어떤 의미를 갖는지에 대해서 알아볼 것이다. 미리 결론부터 언급하자면 행렬식(d

twlab.tistory.com

또한 Determinant는 Cramer's rule(크라메의 법칙)을 이용해 1차 연립방정식을 푸는 데에도 사용된다.

Cramer's rule와 이를 이용한 1차 연립방정식을 푸는 방법 또한 링크로 대체한다.

https://twlab.tistory.com/43?category=668741

 

[Linear Algebra] Lecture 20-(1) 행렬식(Determinant)과 역행렬(Inverse Matrix), 그리고 크래머 공식(Cramer's Rule)

이번 시간에 다룰 내용은 행렬식(Determinant)과 역행렬(Inverse Matrix)의 관계, 그리고 크래머 공식(Cramer's Rule)에 관한 내용이다. 지난 Lecture 18, Lecture 19에 이어 행렬식을 다루는 세 번째 강의다. 앞..

twlab.tistory.com

http://www.mesacc.edu/~scotz47781/mat150/notes/cramers_rule/Cramers_Rule_3_by_3_Notes.pdf

하지만 우리가 지금 Determinant를 보는 이유는 Inver Matrix를 구할 때 쓰이기 때문이다.

 

Determinant를 이용하면 다음 명제를 증명하는 것도 가능하다.

Square MAtrix A는 오직 detA ≠ 0일 때에만 Invertible 하다.

이 명제를 이용하면 주어진 Matrix가 Invertible 한지 쉽게 알 수 있다.

 

Matrix Minor(부분행렬, 소행렬)

Determinant를 설명하기 위해서는 Matrix Minor가 요구되므로 짚고 넘어가겠다.

n × n Matrix A가 주어졌을 때, 특정 번호의 Row와 Column을 삭제한 (n - 1) × (n - 1) Matrix를 말한다.

Determinant의 Definition

Determinant는 재귀적으로 정의된다.

예를 들어 4 × 4 Matrix의 Determinant는 3 × 3 Matrix의 Determinant를 항으로 하여 정의된다.

3 × 3 Matrix의 Determinant는 2 × 2 Matrix의 Determinant로,

2 × 2 Matrix의 Determinant는 1 × 1 Matrix의 Determinant로 정의된다.

(1 × 1 Matrix의 Determinant는 그 Element의 값과 동일하다.)

n × n Matrix의 Determinant는 다음과 같이 정의된다.

Adjoint Matrix(딸림행렬, 수반행렬)

이를 설명하기 위해서는 몇가지 선행 정의가 필요하다.

n × n Matrix A에 대해, 각 Element들은 Cofactor(여인수)가 존재한다.

이 때 Matrix A의 각 Element들을 Cofactor로 대체 해서 만든 Matrix를 A의 Cofactor Matrix(여인수행렬)이라 부른다.

Adjoint Matrix는 이 Cofactor Matrix의 Tranpose Matrix이다.

뒤에 나오지만, Adjoint Matrix를 이용하면 Inverse Matrix를 구하는 공식을 구할 수 있다.

 

Inverse Matrix(역행렬)

Matrix간에는 나눗셈 연산은 없지만, Inverse에 대한 정의는 존재한다.

  1. 오직 Square Matrix만이 Inverse Matrix를 가진다.
    때문에 Inverse Matrix를 논의 할 때는 항상 Square Matrix라는 가정이 깔려 있다.
  2. n × n Matrix M의 Inverse Matrix 역시 n × n 이며, Matrix 이름에 윗첨자로 -1을 적어서 표기한다.
  3. 모든 Square Matrix에 Inverse Matrix가 존재하는 것은 아니다.
    Inverse Matrix가 존재하는 Matrix를 가르켜 Invertible Matrix(가역행렬)이라 부른다.
    반대로 Inverse Matrix가 존재하지 않으면 Singular Matrix(특이행렬)이라 부른다.
  4. Inverse Matrix가 존재할 경우, 그 Inverse Matrix는 고유하다.
  5. 어떤 Matrix M과 그의 Inverse Matrix를 곱하면 Identity Matrix가 나온다.
    이 연산은 교환법칙이 성립한다.

Inverse Matrix는 Matrix Equation을 풀 때 유용하다.

Inverse Matrix는 Adjoint Matrix와 Determinant로 구할 수 있다.

마지막으로 Matrix 곱 연산의 Inverse 에 대한 유용한 대수적 속성을 하나 소개하겠다.

 

'내용정리 > DirectX12' 카테고리의 다른 글

05. DirectXMath.h에서의 Vector 관련 기능  (0) 2020.05.22
04. 기초 필수 수학 - Transform  (0) 2020.05.22
02. 기초 필수 수학 - Vector  (0) 2020.05.08
01. DirectX 12 Project Setting  (0) 2020.05.08
00. 글쓰기에 앞서  (0) 2020.05.08

오늘은 Climb 상태 해제를 모든 조건에서 적용하고, 3개의 Trigger에 대한 Climb 상태 변화를 적용하였습니다.

 

우선 Climb 상태에서 다시 한번 상호작용을 하여 Climb 상태에서 벗어나는 작업은

동시에 처리해줘야 하는 Parameter 중 한가지가 누락되어 작동하지 않았습니다.

이를 적용해주자, 정상적으로 해결되었습니다.

 

이를 두어번 테스트 하는 도중, 공중에 떠있는 Climb를 오를 때 정상적으로 작동하지 않는 것을 확인했습니다.

이벤트 함수에서 문제가 발생하는거라 debug point가 정상작동하지 않아 log에 의지해서 debug 해야 했습니다.

꽤 오랜 시간이 걸렸지만, 알아본 결과 Interaction Key Released Event 부분에서 임시로 넣어 둔

Parameter 해제 코드가 문제였습니다.

또한 이를 해결하더라도 3개의 Trigger가 공유하는 Critical Section이 있어 같은 문제가 다시 발생할 여지가 있었습니다.

그래서 Parameter 해제 코드를 제거하고, Trigger가 공유하는 Parameter가 정확한 상황에서 바뀌도록 개선했습니다.

 

세번째로 각 Trigger의 Start/End Overlap, On Interaction Pressed 이벤트에 분포되어 있던 Climb 관련 기능들에

Trigger Parameter 값에 따른 상태 변화를 적용하였습니다.

이를 통해 Character가 Climb중 점프를 하거나, 재 상호작용을 통해서 Climb 상태를 해제하는 것뿐만 아니라

Climb의 정상이나 바닥에 닿았을 때에도 자동으로 Climb 상태가 해제되도록 하였습니다.

이후 이 부분에 적절한 Animation이 재생되면서, Character의 중심이 이동하면 완벽한 Climb 기능이 완성됩니다.

 

마지막으로 AnimInstance와 Character간의 Parameter Synchronize를 개선했습니다.
이전에는 Character에 각 Parameter별로 get 함수를 두고 있었습니다.

하지만 구조상 AnimInstance 내에서 Character 객체를 가지면서 어쩔수 없이 Coupling이 발생합니다.

때문에 반드시 Character 객체를 가지고 있기 때문에 Character 내부에 public으로 Synchronize 함수를 두었습니다.

공유해야 할 Parameter들이 많아 Category별로 3개의 함수로 분리하였습니다.

 

이 외에 구현중이거나, 발견한 버그들도 있었습니다.

 

첫번째. Puzzle에서 버그가 발생했습니다.

Attach Puzzle에서 Interaction을 할 때, 범위와 관계없이 가장 마지막에 Interaction한 Object가 반응합니다.

또한 Key를 Submit 할 때 Attach 위치가 원하는대로 되지 않고 있습니다.

Break Puzzle에서는 주먹을 휘두르는 걸로 파괴가 되지 않고 직접 부딛쳐야 파괴가 됩니다.

 

두번째. Multiplay 상에서 문제가 발생했습니다.

우선 Character의 Interaction, Melee Attack 애니메이션이 재생되지 않습니다.

변수명을 바꾸었는데 그 때문인지, 더 큰 문제가 있는지 확신이 없습니다.

다만 이 때문에 Break Puzzle에서 주먹이 나가지 않는 문제가 발생한 것 같습니다.

 

Climb에서도 문제가 발생했습니다.

Host가 Climb 할 때에는 테스트 할때와 같이 정상적으로 움직이는 반면,

Client가 Climb 할 때에는 가만히 멈춰있습니다.

Parameter 중 몇가지가 Replicated 안될 때 비슷한 현상이 있던 걸로 기억하는데,

만약 이게 아니라면 Climb 부분 기능을 다 뜯어 고치는 불상사가 발생할 것 같습니다.

 

개인적으로 Climb 기능을 금주 내에 구현하여 영상을 찍고,

이를 포트폴리오에 담아 일요일까지 마감인 회사 지원서에 포함하려 했습니다.

하지만 남은 일정으로 보아 하루 이틀 더 무리해서 하지 않는 한 시간 안에 마무리하지 못할 것 같습니다.

그래서 토요일에는 우선 Animation 문제부터 해결하여 기존에 구현했던 기능들에 대한 문제부터 해결하고,

Climb 부분은 그 뒤에 구현할 예정입니다.

그리고 일요일에도 쉬는 날 없이 개발을 하여 최대한 Climb 기능을 시연 가능할 정도로 구현해볼 예정입니다.

 

제출 날짜가 정확히 21일까지니, 토요일에 Animation 버그를 수정하여 최소한의 영상들을 촬영.

일요일에 자기소개서를 정리하고 남은 시간은 Climb 기능 구현에 투자하여 20일까지 최대한 개발을 해볼 생각입니다.

그리고 20일에 구현이 된다면, 영상을 촬영하고 그대로 제출. 

그렇지 못한다면 그대로 제출을 할 생각입니다.

'개발일지 > Treasure Hunter' 카테고리의 다른 글

20.05.18 개발일지  (0) 2020.05.18
20.05.16 개발일지  (0) 2020.05.16
20.05.13 개발일지  (0) 2020.05.13
20.05.11 개발일지  (0) 2020.05.11
20.05.09 개발일지  (0) 2020.05.09

오늘은 Climb 상태에서 이동 Climb 상태 해제 부분을 구현하였습니다.

 

이 부분도 알아본 결과 굉장히 사소한 실수로 인해 구현에 실패를 한 것이었습니다.

Climb 상태를 판단하는데에는 4가지 트리거가 요구됩니다.

MovementComponent 안의 MovementMode.

Character 안에 IdleType, MovementType, InteractionType.

 

MovementMode는 현재 Character의 이동이 어떤 이동인지를 내부적으로 판단합니다.

IdleType은 현재 Character가 어느 이동이 가능한 상태인지 외부적으로 판단합니다.

MovementType은 Character가 이동 중임과 어느 상태에서 이동중인지 판단합니다.

InteractionType은 이동과 관계가 있지는 않고 상호작용 종류와 상태와 관계 있지만,

Climb 상태가 상호작용으로 이루어지므로 반드시  필요합니다.

 

Clmib 상태 판단이 안되던 것은 이 중 IdleType 값을 바꿔주지 않아서였습니다.

이를 적용해주자, 이동과 관련된 모든 문제가 말끔히 해결되었습니다.

 

그리고 나서 한 작업은 Climb 상태 해제입니다.

Climb 상태 해제는 두가지 조건이 있습니다.

Climb 중 점프를 하는 것과 상호작용을 하는 것.

이 두가지를 모두 구현하였으나, 이 중 재 상호작용 부분은 정상적으로 작동하지 않았습니다.

 

내일은 이 재 상호작용을 통한 Climb 상태 해제를 구현하고,

Climb 속도 조절과 중력 상태 해제를 통해 정지 시 가만히 멈춰있도록 구현할 예정입니다.

Animation 부분은 쉽게 구현이 되나, Exit이나 Ledge 부분에서 자동으로 Character가

올라가는 부분 구현 방법을 아직 몰라 조금 시간이 오래 걸릴 것 같아 이 뒤에 구현 할 예정입니다.

'개발일지 > Treasure Hunter' 카테고리의 다른 글

20.05.16 개발일지  (0) 2020.05.16
20.05.14 개발일지  (0) 2020.05.14
20.05.11 개발일지  (0) 2020.05.11
20.05.09 개발일지  (0) 2020.05.09
20.05.07 개발일지  (0) 2020.05.07

+ Recent posts