11.11

신승빈·2022년 11월 11일
0

KGCA 수업

목록 보기
67/128

작성 중

Character Animation

Biped

인체공학 행렬이 적용된 Bone
생명체의 움직임을 묘사하기 위한 추가 연산이 들어있음

Reference : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=cscokr&logNo=120157191329

추가적으로 할만한 작업들

Constant Buffer로 넘기는 Bone Matrix를 현재는 255개를 미리 잡아놓고 사용하지만 필요한만큼만 사용할 수 있도록 변경
Animation만 있는 FBX의 경우 Mesh만 있는 FBX와 Mesh의 개수가 다를 수는 있지만, Bone의 개수는 동일. Bone의 이름이나 Index를 기반으로 두 file merge 작업
FBX Loader에서 처리하는 Animation Matrix연산을 미리 File로 저장해 둘 경우 Loading 과정 불필요
Character의 부위별로 다른 Object 병합 출력(장비 변경)
Character의 Object별로 다양한 Animation 존재 가능

Height Map Texture

Pixel을 Map의 Vertex와 Matching한 후, Color값을 통해 높이 계산

HRESULT hr = DirectX::CreateWICTextureFromFileEx(
			g_dxWindow->GetDevice(), (kHeightMapPath + fileName).c_str(), 0, D3D11_USAGE_STAGING, 
			0, D3D11_CPU_ACCESS_READ | D3D11_CPU_ACCESS_WRITE, 0, DirectX::WIC_LOADER_DEFAULT, 
			&textureResource, nullptr);

CPU에서 처리해야 하므로 Buffer를 D3D11_USAGE_STAGING, D3D11_CPU_ACCESS_RW로 설정

        // Pointer 형식으로 Buffer에 접근
        // pData, RowPitch, DepthPitch를 가지고 있음
        // RowPitch는 Texture의 Row크기
        // DepthPitch는 DepthSlice에서 사용
		D3D11_MAPPED_SUBRESOURCE MappedFaceDest;
		if (SUCCEEDED(g_dxWindow->GetDeviceContext()->Map(texture2D, D3D11CalcSubresource(0, 0, 1), D3D11_MAP_READ, 0, &MappedFaceDest)))
		{
			UCHAR* pTexels = (UCHAR*)MappedFaceDest.pData;
			minHeight = (float)pTexels[0] / 255.0f;
			maxHeight = (float)pTexels[0] / 255.0f;
			for (UINT row = 0; row < textureDesc.Height; row++)
			{
				UINT rowStart = row * MappedFaceDest.RowPitch;
				for (UINT col = 0; col < textureDesc.Width; col++)
				{
					UINT colStart = col * 4;
					UINT uRed = pTexels[rowStart + colStart + 0];
					float heightData = (float)uRed / 255.0f;
					_heightData[row * textureDesc.Width + col] = heightData;
					minHeight = fmin(minHeight, heightData);
					maxHeight = fmax(maxHeight, heightData);
				}
			}
			g_dxWindow->GetDeviceContext()->Unmap(texture2D, D3D11CalcSubresource(0, 0, 1));
		}

DeviceContext::Map(), DeviceContext::Unmap()으로 접근

Reference : https://learn.microsoft.com/en-us/windows/win32/api/d3d11/ns-d3d11-d3d11_mapped_subresource

이후 Face Normal을 통한 Vertex Normal 계산
VertexNormal=i=0nLinkedFaceNormal[i]nVertex Normal = \frac{\sum_{i = 0}^{n} {LinkedFaceNormal[i]}}{n}

Normal Vector 변환 공식

Object의 Mesh가 모두 동일한 동차변환을 수행한다면 Normal Vector역시 동일한 변환을 수행하면 되지만, Vertex의 일부만 변형된다면 Normal Vector는 다시 계산되야 한다

$N = N * (W^{-1})^T$

Height Map을 이용한 Object의 지형 이동

충돌 연산 없이도 Height Map을 조회하여 Object가 지형 위를 이동하게 만들 수 있음
이 때, 부드러운 이동을 위해 Vertex와 Vertex사이는 보간연산하여 처리
Height Map Texture만을 이용해서 Height를 계산하는건 2D방식으로 간단하지만 지형 한가운데에 구멍이 있다던가 한다면 사용할 수 없음(3D 방식 사용)

보간


셀 안의 정점 V가 어느 폴리곤 삼각형에 포함되는가?
BCˉ\bar{BC}t+s<=1t + s <= 1이므로 만약 1보다 크다면 아랫폴리곤에 1보다 작다면 윗 폴리곤을 기반으로 보간 연산 수행

profile
이상을 길잡이 삼아 로망을 추구합니다.

0개의 댓글