2013-08-31 6 views
3

스켈 레탈 애니메이션을 잃어 버렸습니다. 나는 이것에 관해 몇 가지 것을 읽었지 만 그것들은 여전히 ​​내가 이해하지 못하는 한 가지이다. 이것은 내가 가진 결론입니다. 나는 뼈와 메쉬를 애니메이션하는 3 가지 방법 보았다Directx 11 스켈 레탈 애니메이션

  • 내가 버텍스, 버텍스 버퍼, 인덱스 버퍼 및 텍스처 쉐이더를 포함하는 메쉬 클래스가 있고, 변환 행렬을. 나는 각 뼈에 대해 클래스를 사용하여 가중치를 추가 할 수 있으며, 모델을 애니메이션화하기가 쉽습니다. 그러나 저장된 것은 저장되어있는 한 번만 사용해야하기 때문에 너무 많은 메모리를 사용한다는 의미입니다.

  • 버텍스 쉐이더를 사용하십시오. 입력 버텍스 매개 변수에 가중치 및 뼈 인덱스를 추가하고 행렬 배열을 전역 변수로 사용하므로 쉐이더에서 뼈대의 매트릭스를 사용해야합니다. 이 솔루션은 나를 위해 더 효율적으로 보이지만 directx 11 튜토리얼 (Rastertek의)에서 그는 HLSL이 너무 빨랐다는 것을 기억합니다. 많은 시간이 소요 되었기 때문에 너무 무거울 것이라고 생각합니다. 어쨌든 이것은 시도해 볼만한 해결책입니다. 최소한 그것이 작동하는지 아닌지를 아는 것입니다.

  • 각 본에 대해 행렬 및 역행렬을 사용하십시오. 읽기에 관해서는, 이것이 방법입니다. 그러나 이것이 내가 이해하지 못한 방식입니다. 왜 여기서 역행렬을 사용하고 행렬을 정점에 "링크"시키는 지에 대해 설명합니다. 나는 오른손 뼈대를위한 행렬을 움직인다면, 오른손 버텍스 만 사용된다는 코드에서 말한 것은 무엇입니까?

그래서 제 질문은 다음과 같습니다

  • 두 번째 방법은 가능한인가? 또는 일부 메쉬와 애니메이션이있는 GPU에 너무 많이 사용됩니까?
  • 행렬이 정점에 연결되는 방식을 설명 할 수 있고 왜 역행렬을 사용합니까? 또는 이것에 관해 나에게 어떤 것을 링크해라.

내가 잘 설명했는지 확신 할 수 없기 때문에 당신이 나를 이해했기를 바랍니다. 그리고 제 영어를 용서해주십시오, 제가 할 수있는만큼 좋은 결과를 냈습니다. 미리 감사드립니다.

답변

5

첫 번째 방법은 모델에 단단한 부품 만있는 경우 작동 할 수 있습니다. 변형 가능한 부분이 생기 자마자 구멍이나 다른 인공물이 생깁니다. 예 : 팔의 모형이 있고 팔뚝을 돌리면 팔꿈치에 구멍이 있고 사기꾼에 겹치는 삼각형이 있습니다.

두 번째 방법은 - 음, 실제로 어떻게 할 지 모르겠습니다. 픽셀 쉐이더는 틀린 장소입니다. 수행해야 할 모든 작업은 정점 셰이더에서 수행 할 수 있습니다.

3. 내가 그 골격을 기반으로 애니메이션을 인정 접근하는 우리를 인도

이해하기 조금 까다로운 있습니다. 위의 예를 생각해 봅시다 : 상완과 팔뚝으로 구성된 팔 모형. 이 모델에는 두 개의 뼈가 필요합니다. 어깨에서 팔꿈치까지, 팔꿈치에서 손까지.

각 꼭지점은 적어도 하나의 본에 연결되어야합니다. 이것은 정점 가중치로 수행됩니다. 어깨의 영향을받는 어깨 꼭지점이 있다고 가정 해 봅시다. 팔꿈치 꼭지점은 두 뼈의 영향을받으며 손 정점은 팔 뼈만 영향을받습니다. 그러면 다음과 같은 가중치가 산출됩니다.

bone:    | upper arm bone | forearm bone 
--------------------+----------------+-------------- 
shoulder vertices: |  1  |  0 
elbow vertices:  |  0.5  |  0.5 
hand vertices:  |  0  |  1 

먼저 모든 뼈대의 위치와 방향을 계산해야합니다.이것은 각 본에 대한 행렬로 수행됩니다. 일반적으로 애니메이터는 이러한 매트릭스를 계산해야합니다. 이 행렬은 어떤 기준 위치에서 현재 위치로 뼈대를 배치합니다. 기준 위치는 모든 뼈에서 동일하며 자유롭게 선택할 수 있습니다.

그 다음으로 수행 할 작업은 결과 정점 위치를 계산하는 것입니다. 꼭지점이 뼈와 함께 움직이는 것을 압니다. 따라서 우리는 뼈의 로컬 좌표계에서 정점 위치가 필요합니다. 그러나 일반적으로 정점 위치는 바인드 포즈에서 월드 좌표로 지정됩니다. 이것이 바로 역행렬입니다. 그것은 정점을 세계 공간 (바인딩 포즈)에서 뼈의 로컬 공간으로 변환합니다. 각 뼈에 대해 하나의 역행렬이 있습니다.

뼈의 로컬 시스템에 정점이있을 때 뼈의 움직임에 따라 정점을 변형해야합니다. 어깨 꼭지점과 손 꼭지점의 경우이 작업은 간단합니다. 뼈의 행렬을 사용하여이를 역 행렬에 곱할 수 있습니다.

팔꿈치 꼭지점의 경우 이것은 쉽지 않습니다. 실제로 변환을 계산하는 다양한 방법이 있습니다. 우리는 두 개의 뼈의 변형을 주어진 가중치와 혼합해야합니다. 이를 수행하는 가장 쉬운 방법은 행렬에 가중치를 곱하여 함께 더하는 것입니다. 이것은 정점 위치를 변환하는 데 사용할 수있는 최종 변환을 제공합니다.

단계는 (하나만 영향 뼈) 위치 :

  1. 로컬 골 시스템 바인드 포즈에서 정점 위치 변환.
  2. 애니메이터로 뼈 변환 행렬을 계산하십시오.
  3. 로컬 뼈 시스템에서 뼈대 매트릭스가있는 애니메이션 위치로 정점 위치를 변환합니다.

영향을 미치는 뼈가 둘 이상인 경우, 매트릭스를 혼합해야합니다. 뼈와 정점의 연결은 정점 가중치를 사용하여 수행됩니다. 일반적으로 정점은 모든 뼈에 대한 가중치를 저장하지 않습니다. 대신 영향을 미치는 최대 본 수는 예를 들어 4. 그런 다음 정점에는 가장 영향을 미치는 처음 4 개의 뼈와 해당 가중치의 인덱스가 저장됩니다.

+0

두 번째 방법은 픽셀 쉐이더가 아니라 버텍스 쉐이더를 사용하여 포스트 편집을하는 것입니다. 그러나 나는 그 문제를 이해했다고 생각한다. 정적 모델을 렌더링하고 싶을 때, 쉐이더 클래스의 렌더링 함수를 한 번만 사용합니다. 그러나 애니메이션 모델을 사용하면 각 뼈에 대해이 변환 함수를 뼈 변환으로 곱한 세계 행렬을 사용해야합니다. 세계 행렬 매개 변수가 맞습니까? Btw는 설명에 감사드립니다. – Aulaulz

+1

아니요, 매트릭스 및 정점 가중치를 포함하여 필요한 모든 정보를 제공하는 그리기 호출을 하나만 발행합니다. –

+0

그렇다면 나는 여전히 팔뚝의 픽셀이 팔뚝 행렬과 관련되어 있다는 것을 셰이더가 어떻게 알지 못합니다. – Aulaulz

관련 문제