2017년 11월 29일 수요일

Static 이란?

static 이란 무엇인가?

- 우선 메모리 영역에 대한 이해가 필요
 1. stack 영역 , heap(동적) 영역 , 정적 영역

 2.  static 키워드는 메모리에 해당 영역의 시작과 동시에 생성되었다. 프로그램이 끝나야 사라지는 정적 영역에 부여됨

static 변수
1. static 의 저장 기간을 가짐

  • 함수내에서 선언된 static 변수는 해당 함수를 처음 호출할때 메모리에 올라가 프로그램이 끝날때 사라짐
  • 전역 static 변수로 선언시에는 프로그램 시작시 메모리 영역(정적 영역)에 올라갔다 프로그램이 끝나면 사라진다.
  • c++ 에서 class 내에 선언했을 때 프로그램이 시작시 생성되어서 프로그램이 끝날때 제거됨

2 . scope의 영향을 받음

  • 전역변수 : file scope의 영향을 받으면 intenal linkage 라고 함
  • internal linkage란 내부 연결성이라고 함. 즉 전역 static 객체나 함수는 link 단계에서 외부 바인딩이 일어나지 않음, 외부 파일에서는 내부 전역 static 객체/함수를 참조하거나 호출이 불가
  • 지역변수 : block scope의 영향을 받는다.
  • 클래스 멤버 변수 : 클래스 이름 공간의 영향을 받는 전역 객체
static 함수
1.일반함수 : internal linkage 를 갖는다. 외부 파일에서 해당 함수를 호출하지 못한다.
2.클래스 멤버 함수 : this 포인터를 갖지 않는다. 객체 멤버 변수나 멤버 함수를 직접 참조/호출 할수 없다. 단. 같은 클래스의 static 멤버 변수나 static 멤버 함수는 직접 참조/호출이 가능하다.

2017년 11월 8일 수요일

Skinning Animation

스키닝 애니메이션(Skinning Animation)

내가 요새 제일 관심있는 분야는 3D 엔진을 만들어 보는 것이다.
그중에서 제일 해보고 싶은 것이 애니메이션 구조를 만드는 것이다.

캐릭터를 띄우고 그것을 움직이게 하는 일을 해야 하는데 그 개념에 대해 이곳에서 정리해 보기로 한다.

DirectX SDK (June 2010) 의 Sample Browser 를 보면 Skinned Mesh라는 예제가 있는데 여기에 있는 내용을 분석해 보겠다.

스키닝의 기본적인 개념을 설명하자면 연결점을 가진 Mesh들은 특별한 설정이 없을 시 애니메이션을 설정하면 각 연결점은 떨어져 있게 되있다. 그 떨어져 있는 부분의 어색함을 없애기 위해 스키닝이라는 개념이 나오게 되었다.

스키닝을 처리하는 방법은 Software 방식과 Hardware 방식으로 나눌 수 있는데 software 방식은 CPU에서 처리하고 Hardware 방식은 GPU처리를 할 수 있다.
GPU처리는 Vertex Shader 를 통해 처리하기때문에 Software 방식보다 빠른 처리가 된다.

스키닝 애니메이션에서 중요한 개념
1. 하나의 vertex는 4개까지의 가중치를 가진다. 이말은 하나의 vertex에 영향을 주는 bone 행렬이 4개까지 가능하다는 이야기다.
2. 본 행렬을 각 버텍스마다 가지고 있는것이 아니라 매트릭스 팔레트라는 곳에 행렬 정보를 가지고 있고 영향을 주는 본 행렬에 인덱스를 가지고 매트릭스 팔레트에 접근하여 사용할 수 있다.
3. vertex가 본 행렬에 의해 영향을 받기 때문에 월드에 있는 vertex를 본의 Local 영역으로 이동시켜서 계산해야 된다.
그러므로 Vworld = Vlocal * TM(본의 월드 행렬) -> Vlocal = Vworld * InvTM(본의 월드의 역행렬)을 곱해서 Bone의 Local 영역으로 이동시킨 후 Vworld(본에 로컬에서 월드로) = Vlocal * LocalTM(본의 로컬 행렬) * AniTM(애니메이션 시키는 행렬) * ParentTM(부모 본의 행렬) 로 애니메이션을 시켜야 한다.
여기서 계산해야 되는 것은 vertex 뿐만 아니라 해당 vertex에 있는 normal 값도 똑같이 계산해 줘야 한다.