Nanashi-softプログラマ専用DirectX11開発


◇DirectX11プログラミング -物体の上に物体を置きたい-

置けばいいじゃないかw と思われるかもですが(*'-')
森を作る時に,木を100本並べるとか,手作業でやっていられませんよね?
自動的に置かれるようにしたいのですよ

地面もポリゴンなので,その頂点に重ねて置けば,上に置けると考えました
置いてみた('-'*)
	//モデルデータの設置
{
//0番が地面用pmdモデルだとみなす
pmd *modeldata = new pmd(pmdfile[0]);

int start=40000 - 6;
for(int i=0; i < 5; i++){
//インデックスデータから,ポリゴンを取り出す
unsigned long idx1 = modeldata->face_vert_index[start*3 + i*3];
float pos1X = modeldata->vertex[idx1].pos[0];
float pos1Y = modeldata->vertex[idx1].pos[1];
float pos1Z = modeldata->vertex[idx1].pos[2];

unsigned long idx2 = modeldata->face_vert_index[start*3 + i*3 + 1];
float pos2X = modeldata->vertex[idx2].pos[0];
float pos2Y = modeldata->vertex[idx2].pos[1];
float pos2Z = modeldata->vertex[idx2].pos[2];

unsigned long idx3 = modeldata->face_vert_index[start*3 + i*3 + 2];
float pos3X = modeldata->vertex[idx3].pos[0];
float pos3Y = modeldata->vertex[idx3].pos[1];
float pos3Z = modeldata->vertex[idx3].pos[2];

//ポリゴンの頂点にモデルデータを設置
hModelData->setObjIdentity(2 + i);
hModelData->setObjScaling(2 + i, 10.0f, 10.0f, 10.0f);
hModelData->setObjTranslation(2 + i, pos1X, pos1Y, pos1Z);
hModelData->setObjIdentity(3 + i);
hModelData->setObjScaling(3 + i, 10.0f, 10.0f, 10.0f);
hModelData->setObjTranslation(3 + i, pos2X, pos2Y, pos2Z);
hModelData->setObjIdentity(4 + i);
hModelData->setObjScaling(4 + i, 10.0f, 10.0f, 10.0f);
hModelData->setObjTranslation(4 + i, pos3X, pos3Y, pos3Z);
}
}
地面のモデルデータから頂点データを取り出して,そこに別のモデルを置いてみました
↓それがコレ。右手前にある黒い物体が上に乗っているわけです


地面用モデルデータの頂点に,別のモデルを置いた場合の問題点
・頂点は重複している
 前の記事に置いた画像は,実は15コのモデルを上に置いているが,重なって5つしか見えていない
・間が結構あく
 地面のモデルデータは,そのサイズ的に1つ1つのポリゴンサイズが大きいです

ポリゴンの三角形の線上に置けば,それも表面上だよね?(よね?)
2点の座標を足して2で割ると,線上の中心がでます
(pos1X + pos2X) / 2
(pos1Y + pos2Y) / 2
(pos1Z + pos2Z) / 2
こういう感じで,全部の中間を取ると,3次元空間でも線の上に乗る(よね?)

あと,3座標全てを足して3で割った場所も,重心とかいう三角形の中心で,ここも表面上です(よね?)
(pos1X + pos2X + pos3X) / 3
(pos1Y + pos2Y + pos3Y) / 3
(pos1Z + pos2Z + pos3Z) / 3

そこに置いてみた
			//ポリゴンの頂点にモデルデータを設置
//頂点
hModelData->setObjIdentity(2 + i*7);
hModelData->setObjScaling(2 + i*7, 10.0f, 10.0f, 10.0f);
hModelData->setObjTranslation(2 + i*7, pos1X, pos1Y, pos1Z);
hModelData->setObjIdentity(3 + i*7);
hModelData->setObjScaling(3 + i*7, 10.0f, 10.0f, 10.0f);
hModelData->setObjTranslation(3 + i*7, pos2X, pos2Y, pos2Z);
hModelData->setObjIdentity(4 + i*7);
hModelData->setObjScaling(4 + i*7, 10.0f, 10.0f, 10.0f);
hModelData->setObjTranslation(4 + i*7, pos3X, pos3Y, pos3Z);
//中点
hModelData->setObjIdentity(5 + i*7);
hModelData->setObjScaling(5 + i*7, 10.0f, 10.0f, 10.0f);
hModelData->setObjTranslation(5 + i*7, (pos1X + pos2X) / 2, (pos1Y + pos2Y) / 2, (pos1Z + pos2Z) / 2);
hModelData->setObjIdentity(6 + i*7);
hModelData->setObjScaling(6 + i*7, 10.0f, 10.0f, 10.0f);
hModelData->setObjTranslation(6 + i*7, (pos2X + pos3X) / 2, (pos2Y + pos3Y) / 2, (pos2Z + pos3Z) / 2);
hModelData->setObjIdentity(7 + i*7);
hModelData->setObjScaling(7 + i*7, 10.0f, 10.0f, 10.0f);
hModelData->setObjTranslation(7 + i*7, (pos3X + pos1X) / 2, (pos3Y + pos1Y) / 2, (pos3Z + pos1Z) / 2);
//重心
hModelData->setObjIdentity(8 + i*7);
hModelData->setObjScaling(8 + i*7, 10.0f, 10.0f, 10.0f);
hModelData->setObjTranslation(8 + i*7, (pos1X + pos2X + pos3X) / 3, (pos1Y + pos2Y + pos3Y) / 3, (pos1Z + pos2Z + pos3Z) / 3);


わかりづらいので,ラスタライザーをワイヤーフレームにしてみる

きちんと,頂点と頂点の間と,中心に置かれているのがわかります


TOPプログラマ専用DirectX11開発