Bulletでぬいぐるみを作ってみる Part1 簡易形状によるスキニング

投稿日:

SoftBodyを使って、ぬいぐるみを再現しみます。SoftBodyのポリゴン数に制限があるようなので、ローポリモデルをソフトボディーで動かし、その動きをハイポリモデルに反映するという方法を採用します。これでSoftBodyの制限回避と計算負荷を軽減しつつ、見た目の良いハイポリモデルを動かすことが可能になります。
今回、解説動画を作成しました。大まかな説明は動画で行って、ここではローポリとハイポリモデルの連動について解説します。

SoftBodyぬいぐるみ
SoftBodyぬいぐるみ

続きを読む Bulletでぬいぐるみを作ってみる Part1 簡易形状によるスキニング

法線ベクトルの生成とスムージング

投稿日:

次は光源計算にいきたいところですが、メタセコイアのデータには法線ベクトルが含まれないためポリゴン形状から法線ベクトルを計算で求め、スムージングを行います。
メタセコイア以外の法線ベクトルが出力されるモデリングツールを使えばいいのですが、今後必要になるかもしれなので計算処理を作っておきます。

法線ベクトルの生成とスムージング
法線ベクトルの生成とスムージング

続きを読む 法線ベクトルの生成とスムージング

DirectXMath

投稿日:

DirectX11のプログラムができるようになったので、次は3Dグラフィックスの表示といきたいところですが、その前に3DCGで必要になるベクトルや行列の計算を行うライブラリを準備します。
DirextX9や10に含まれる計算関数、XNAMath(マイクロソフトが提供するゲーム作成環境XNAの計算ライブラリ)などを使う予定でしたが、DirectXMathという計算ライブラリがあるようなので、これを使うことにしました。

DirectXMath Programming Guide (Windows)を参考に。
DirectXMath (Windows)からだと日本語のページがなくXNAMathのページへ、仕方なく英語で。
DirectXMathの特徴
・DirextX9、10、XNAMathに代わる計算ライブラリ
・インライン定義のみ(ヘッダファイルのみリンクなし)
・SSE/SSE2やARM-NEONなどのCPU命令を使用(ベクトル計算を高速に)
・CPU毎に実行ファイルを用意する必要がある(インライン定義なので)
最後が少し気になるけど、SSE/SSE2対応CPUに限定してプログラミングするので問題なし。
DirectXMath.hは現在インストールしているWindowsSDKに含まれているので、使用するにはDirectXMath.hをincludeするのみ。

検証用ソースコード(CPU判定と意味のない計算をするだけ)

#include 

	if(DirectX::XMVerifyCPUSupport()){
		using DirectX::XMVECTOR;
		using DirectX::XMMATRIX;

		XMVECTOR v0 = DirectX::XMVectorReplicate(0.0f);//v0=(0,0,0,0)
		XMVECTOR v1 = DirectX::XMVectorSet(1.0f,2.0f,3.0f,1.0f);//v1=(1,2,3,1)
		XMMATRIX m0 = DirectX::XMMatrixIdentity();
		XMMATRIX m1 = DirectX::XMMatrixScaling(1.0f,2.0f,3.0f);
		XMMATRIX m = DirectX::XMMatrixMultiply(m0,m1);
		XMVECTOR v = DirectX::XMVector4Transform(v1,m);
		float vx = DirectX::XMVectorGetX(v);
		float vy = DirectX::XMVectorGetY(v);
		float vz = DirectX::XMVectorGetZ(v);

		MessageBox(NULL, L"DirectXMath対応CPU", L"DirectXMath", MB_OK);
	}

まず最初に、DirectX::XMVerifyCPUSupport()でCPUが対応しているか調べ、未対応の場合プログラムを実行できないので、強制終了などのエラー処理が必要なります。XMVerifyCPUSupportを使用するときは、DirectXMath.hのincludeの前にwindows.hをincludeする必要があります。
あとはDirectXMath Programming Guide (Windows)を参考にベクトルや行列の計算を試してみました。デバッガでの確認ですが計算は正しく行われているようです。

これで計算ライブラリの準備完了。
使い方は必要に応じて調べていきます。

DirectXMath (Windows)
DirectXMath Programming Guide (Windows)