今年は4月ネタは行いません

冬月 エイプリルフールネタは誰も期待してないでしょうねぇ
まあ、今のブログ、3月31日に更新予定だった内容なんで
ネタも考えてないです。ハイ。

というかね
今作ってるゲームがAXLさん全面協力
というのを、去年やったらほんとうに信じてくれた人がいて……
冬華

ただ、今日の午前中までには有効らしいので
ネタが浮かべば
やると思います。
設子

冬月 ということで、平常通りの
ゲーム製作過程度をお伝えします
つまらないとか言わない。



冬月 坊主になって後方に髪の毛が取り残されてます。
どうぶつの森、マインクラフトみたいなキャラの方向へ首を曲げる処理を試している段階です。

こんな感じね。
体位はそのままで顔だけこっち向けてるの
ボーンの仕組みさえわかってしまえばすぐにできることなんだけど、意外と躓くんだよね。
冬華

//--------------------------------------------------------------------------------
//スキンメッシュの場合
if(pMeshContainer->pSkinInfo != NULL) {
// ボーン合成バッファのポインタを取得する。
LPD3DXBONECOMBINATION pBoneCombination =
(LPD3DXBONECOMBINATION)pMeshContainer->pBoneBuffer->GetBufferPointer();
//--------------------------------------------------------------------------------
// 見つからないときのためにUINT_MAXにしておく。
DWORD dwPrevBoneID = UINT_MAX;
for (DWORD i = 0; i < pMeshContainer->dwNumBones; i++) {
//--------------------------------------------------------------------------------
// 合成する行列の数を調べる。
DWORD dwNumBlendMatrices = 0;
for (DWORD j = 0; j < pMeshContainer->dwWeight; j++) {
if (pBoneCombination[i].BoneId[j] != UINT_MAX) {
dwNumBlendMatrices = j;
}
}
//--------------------------------------------------------------------------------
// 頂点ブレンドのレンダリングステートを設定する。
m_d3dDevice->SetRenderState(D3DRS_VERTEXBLEND, dwNumBlendMatrices);
for (DWORD j = 0; j < pMeshContainer->dwWeight; j++) {
UINT iMatrixIndex = pBoneCombination[i].BoneId[j];
if (iMatrixIndex != UINT_MAX) {
//--------------------------------------------------------------------------------
// 行列スタックにボーン用の変換行列を設定する。
D3DXMATRIX matStack = pMeshContainer->pBoneOffsetMatrices[iMatrixIndex] * (*pMeshContainer->ppBoneMatrix[iMatrixIndex]);
//--------------------------------------------------------------------------------
//合成
if(m_IsSetBorn == true){
for(int nn = 0; nn < 10; nn++){
if(strcmp(m_SetBorn_Name[nn], pMeshContainer->Name) == 0){
matStack = ChangeRotToMatrix(m_SetBornRot[nn]) * pMeshContainer->pBoneOffsetMatrices[iMatrixIndex] * (*pMeshContainer->ppBoneMatrix[iMatrixIndex]);
break;
}
}
}
//--------------------------------------------------------------------------------
// ボーンの変換行列を設定する。
m_d3dDevice->SetTransform(D3DTS_WORLDMATRIX(j), &matStack);
}
}

少しでもページを稼ぐためにソースを投下しました。
変数名ぐちゃぐちゃなのは学生の頃から継ぎ足し使っているからだそうですが
ラーメン屋のタレですか……
設子

冬月 ぐぬぬ、まじめに解説すると、
上のソースは、展開したアニメーションメッシュのボーンを実際に適応する部分になります
……まあ、サンプルソースのままなので見比べてもらうとわかりやすいかもしれません

//--------------------------------------------------------------------------------
//合成
if(m_IsSetBorn == true){
for(int nn = 0; nn < 10; nn++){
if(strcmp(m_SetBorn_Name[nn], pMeshContainer->Name) == 0){
matStack = ChangeRotToMatrix(m_SetBornRot[nn]) * pMeshContainer->pBoneOffsetMatrices[iMatrixIndex] * (*pMeshContainer->ppBoneMatrix[iMatrixIndex]);
break;
}
}
}

で、今回追加したのはたったこんなけになります。
【(m_IsSetBorn】で自前でボーン操作しているかどうかを判断し

冬華


【strcmp(m_SetBorn_Name[nn], pMeshContainer->Name)】で動かすボーンのジョイント名を見つけて

設子

冬月
【matStack = ChangeRotToMatrix(m_SetBornRot[nn]) * pMeshContainer->pBoneOffsetMatrices[iMatrixIndex] * (*pMeshContainer->ppBoneMatrix[iMatrixIndex]);】で適応させる角度(行列)で追加しました
文字列でボーンの場所を見つける、CPUには優しくない設計です。

そして、適当なボーンを動かしたのがこちらになります
首がグキッってます。

冬華

本来なら、元を動かせば、その先につながるボーンも変化させるのが道理なんでしょうが
それをやると結構なソースになってしまうので今回は、適応させる分のボーンを自前で動かすように設定しています

設子

冬月 で、こちらが調整したもの
適当な値を突っ込んでいるのでとりあえず【首がグキッってます】
痛そう。

で、実は、被写界深度というエフェクトも入れたんですが、どうも綺麗に適応されないため今は使ってません。
被写界深度っていうのは、ピントの合っていない部分をぼかすエフェクトです

冬華

冬月さんの表現したいものがほとんど実現できるようになって来ました。
あとは、物理演算を使ったスカート(ボーン)のアニメーションを実装することでしょうか。
今のソースを流用すればできそうな気がしますが、どうやって表現しましょうか……
設子

気軽にコメントをどうぞ!

この記事に関すること冬月に聞きたいこと等、小さいことでもコメントしていただける嬉しいです。
冬月に直接連絡したい方は下のお問合せフォームをお使いください。(メール送信されます)

内容に問題なければ、下記の「コメントを送信する」ボタンを押してください。
※メールアドレスは公開されることは有りません。


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

ゲーム製作の関連記事