ページ 11

3Dで、奥にあるはずのモノが手前に描画される

Posted: 2012年7月16日(月) 01:52
by sn
こんばんわ。

3D空間での描画処理において、視点に近いオブジェクトは、遠くのオブジェクトよりも優先されて描画されるものと思いますが、
先ほど作ったプログラムでは、どういうわけかそれが逆転して、遠くのオブジェクトが優先して(画面手前側に)表示されます。
(大きい画像の上に、小さい画像が次々と乗っかっているような状態で表示されます。)

コードが煩雑になってしまったので一部掲載となりますが、大まかには以下のような処理を行なっています。
画面正面を向いた画像が、depthの回数だけZ軸奥方向に次々と表示されていくようなものです。

コード:

void Test(){
	//カメラポジション
	SetCameraPositionAndAngle(VGet(0,0,0), 0,0,0) ;	

	//描画(テクスチャの枚数分ループ)
	for(int depth = 0; depth < 5; depth++){
		//テクスチャの位置と向きの計算
		CalcObject(depth);
		//テクスチャ1枚分を描画
		DrawPolygon3D( Object[0].Vertex, 2, Object[0].Img, TRUE );
	}
}

void CalcObject(int depth){
	for(int i=0;i<6;i++){
		Object[0].Vertex[i].pos.x = Object[0].x + Object[0].LargeX * VtPm[i].x ;    
		Object[0].Vertex[i].pos.y = Object[0].y + Object[0].LargeY * VtPm[i].y ;
		Object[0].Vertex[i].pos.z = Object[0].z ;
	}
	//テクスチャの中心座標設定
	Object[0].x			= 0;
	Object[0].y			= 0;
	Object[0].z			= 600 + 800 * depth;
}
奥の画像が画面手前に表示されてしまう原因がイマイチわかりません。
下例のように、画面奥から画像を表示させるようとしても改善されませんでした。

コード:

void Test(){
	//カメラポジション
	SetCameraPositionAndAngle(VGet(0,0,0), 0,0,0) ;	

	//描画(テクスチャの枚数分ループ)
	for(int depth = 4; depth >= 0; depth--){
		//テクスチャの位置と向きの計算
		CalcObject(depth);
		//テクスチャ1枚分を描画
		DrawPolygon3D( Object[0].Vertex, 2, Object[0].Img, TRUE );
	}
}
分かる方いらっしゃいましたら、よろしくお願いします。

Re: 3Dで、奥にあるはずのモノが手前に描画される

Posted: 2012年7月16日(月) 10:39
by nullptr
コード読んでませんが、まずZバッファをオンにしていますか?
そして、問題のあるテクスチャに半透明要素はありませんか?

Re: 3Dで、奥にあるはずのモノが手前に描画される

Posted: 2012年7月16日(月) 11:30
by softya(ソフト屋)
出来れば簡単に再現できるコンパクトなコードを掲載して頂けると助かるのですが。

Re: 3Dで、奥にあるはずのモノが手前に描画される

Posted: 2012年7月16日(月) 12:21
by sn
バッファはOFFです。半透明要素もあります。

質問しておいてすみませんが、もう少し自分で考えてみます。
いよいよ根が尽きたら実行可能コード載せてみますので、その時はよろしくお願いします。

Re: 3Dで、奥にあるはずのモノが手前に描画される

Posted: 2012年7月16日(月) 12:31
by softya(ソフト屋)
sn さんが書きました:バッファはOFFです。半透明要素もあります。

質問しておいてすみませんが、もう少し自分で考えてみます。
いよいよ根が尽きたら実行可能コード載せてみますので、その時はよろしくお願いします。
ZバッファがOFFな場合は、自分でZ管理しなくてはいけません。
つまり奥のものから先に描画されるように自分で描画順番を制御する必要があります。
これらのために必要な処理を俗にZソートといいます。

Re: 3Dで、奥にあるはずのモノが手前に描画される

Posted: 2012年7月16日(月) 13:41
by sn
そうだったんですか!全然知りませんでした。なるほど・・・。
アドバイス参考にしてもう一度作りなおしてみます。
ありがとうございました。