3Dポリゴンの無限遠点について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
チルチル

3Dポリゴンの無限遠点について

#1

投稿記事 by チルチル » 16年前

この前のトビで知ったんですが
3Dポリゴンには無限遠点と言う物が
画面の中心にあるようなんです

でも実際はスコアボードが右の方にあるので
背景の中心は画面の中心からずれてるんです
これだと3D背景を描画した時に左右対称にならないので
無限遠点の位置を変更する方法はないでしょうか?

環境はDXライブラリです

Justy

Re:3Dポリゴンの無限遠点について

#2

投稿記事 by Justy » 16年前


>無限遠点の位置を変更する方法はないでしょうか?

 CreateViewportMatrix() / SetTransformToViewport()。

チルチル

Re:3Dポリゴンの無限遠点について

#3

投稿記事 by チルチル » 16年前

すみません、検索してみましたが使いかたが書いてあるサイトがありませんでした・・
CreateViewportMatrix()とSetTransformToViewport()の引数と使い方を教えていただけないでしょうか・・

Justy

Re:3Dポリゴンの無限遠点について

#4

投稿記事 by Justy » 16年前

 いいサンプルが過去ログにありました。

C言語何でも質問掲示板 - DrawPolygon3D関数について
ttp://www.play21.jp/board/formz.cgi?action=res&resno=26917&page=&lognum=85&id=dixq&rln=26993

 あとは実際にいろいろ試してみてください。

チルチル

Re:3Dポリゴンの無限遠点について

#5

投稿記事 by チルチル » 16年前

これはいいサンプルですね、
どうもありがとうございます

ところで他のトビを見て思ったんですが
DXライブラリで3Dポリゴンを使う時は
3D世界みたいな物が作られているのでしょうか?
そうだとすると極端な話、画面を裏側から見たような処理ができたりしますか?

Justy

Re:3Dポリゴンの無限遠点について

#6

投稿記事 by Justy » 16年前


>3D世界みたいな物が作られているのでしょうか?

 最終レンダリング結果こそ(ウインドウの中なので)2Dですが、計算は3Dで行われるので、
3D世界は作られています。



>そうだとすると極端な話、画面を裏側から見たような処理ができたりしますか?

 画面の裏側、というのはカメラを通して見ている対象の側からこちらを見た絵、
ということでしたら、DXライブラリでも可能です。

 カメラの位置と向きを変えれば複数のオブジェクトのどこでも好きなところを
見ることができます。

チルチル

Re:3Dポリゴンの無限遠点について

#7

投稿記事 by チルチル » 16年前

DXライブラリは3D機能は多くないと思っていましたが、
意外と色々できるんですね。

と言う事は画面に立体的な迷路を描画した後に、
カメラを動かして進んで行ったりとかもできるんでしょうか。

廊下を曲がる所などはそうでもしないと難しいし・・

普通の3Dゲームみたいに視点を回転させたり近づけたりとかもできますか?

仮にできるとしても、立体的なフィールドを一つ一つ構造体で宣言したり
視点を変えるたびにソートしたり座標をいじるのは大変ですよね・・

何か最初にフィールドの立体的な地図みたいな物を設定できないでしょうか?

Justy

Re:3Dポリゴンの無限遠点について

#8

投稿記事 by Justy » 16年前


>DXライブラリは3D機能は多くないと思っていましたが、
>意外と色々できるんですね。

 元が DirectXですからね。



>と言う事は画面に立体的な迷路を描画した後に、
>カメラを動かして進んで行ったりとかもできるんでしょうか。
>普通の3Dゲームみたいに視点を回転させたり近づけたりとかもできますか?

 それくらいなら問題なく出来ます。



>仮にできるとしても、立体的なフィールドを一つ一つ構造体で宣言したり
>視点を変えるたびにソートしたり座標をいじるのは大変ですよね・・

 大変、といえば大変ですが慣れでしょう。

 フィールドのデータは大抵は3Dのモデラーツールを使ってデータを作るので、
手打ちすることは希です。

 視点の変更に伴う処理も確かにソートはなんだかんだで必要ですが
一度システム化してしまえばあとは自動ですし、座標をいじる云々も
大抵はオブジェクト毎の行列計算だけなので、慣れればどうということはないかと。



>何か最初にフィールドの立体的な地図みたいな物を設定できないでしょうか?

 ちょっとよく意味がわからないのですが……?

チルチル

Re:3Dポリゴンの無限遠点について

#9

投稿記事 by チルチル » 16年前

となりのトビに「ワールド行列」という言葉が出てきました
意味は分かりませんが、そんな感じじゃないでしょうか・・

つまり初期座標を最初に設定して
以降はカメラの位置を変更するたびに
カメラとの位置関係とかから
自動的にソートとかをしてくれる
機能はないかな~
って事です・・

ちなみにカメラの位置とか向きはどうやって変えればいいのでしょうか?

Justy

Re:3Dポリゴンの無限遠点について

#10

投稿記事 by Justy » 16年前


>以降はカメラの位置を変更するたびに カメラとの位置関係とかから
>自動的にソートとかをしてくれる機能はないかな~

 まぁ、ないですねぇ。
 
 不透明ものならZバッファを使って(ソートをしなくても)
きちんと正しく前後の重なり表現することができますが、透明ものは自分でソートして
描画する機能を作ることになりますね。

 一口にソートと言ってもどういうデータ構造でどういう判断基準でソートしてどう描画するのかが
状況によって変わるので、万人が使えるような汎用化はちょっと難しいですから。



>ちなみにカメラの位置とか向きはどうやって変えればいいのでしょうか

 DXライブラリで、ということであれば SetTransformToView()がそうです。
 この関数にカメラ行列を入れればそれで視点と向きを変えられます。
 
 先の「となりのトピ」でサンプルを出してます。
 あちらは、操作対象であるオブジェクトを後ろから追跡するようなカメラになっていますので、
それを参考にして頂ければと思います。

チルチル

Re:3Dポリゴンの無限遠点について

#11

投稿記事 by チルチル » 16年前

う~ん、難しそうですね・・

ちなみに「Zバッファ」と「カメラ行列」とは何でしょうか?

Justy

Re:3Dポリゴンの無限遠点について

#12

投稿記事 by Justy » 16年前


>Zバッファ

Zバッファ - ゲームプログラミングWiki
ttp://www.c3.club.kyutech.ac.jp/gamewiki/index.php?Z%A5%D0%A5%C3%A5%D5%A5%A1

 一口でいえば、今書かれている絵のZ情報を覚えておいて、これから描こうとしている
絵のZ情報と比較して手前にある部分だけ描こうとする機能です。

 これを使えば不透明なものに関してはソートしなくても、自動的に手前にあるものだけが
上書きされていくので、正しい前後関係が表現できます。

 DXライブラリでは SetUseZBufferFlag() / SetWriteZBufferFlag()の2つで設定できます。



>カメラ行列

 ビュー行列ともいいますが、カメラの位置、視線の方向などを行列で表したものです。
 もし行列、という言葉を聞いたことない場合はちょっと難しいかもしれません。

3D座標変換 - ゲームプログラミングWiki
ttp://www.c3.club.kyutech.ac.jp/gamewiki/index.php?3D%BA%C2%C9%B8%CA%D1%B4%B9

3Dプログラミングの前提知識
ttp://toshi104.odap.jp/cgi-bin/3Dprogram/

チルチル

Re:3Dポリゴンの無限遠点について

#13

投稿記事 by チルチル » 16年前

「Zバッファ」は 自分で何かするのかと思いましたが
設定しておけるんですね

ところで描画する画像が一部でも手前に来るべき画像に重なっていたら描画されないのでしょうか?
それだと背景が欠けてしまいますよね・・

それとも重なっている部分にはマスクのような物が働くのでしょうか?

サイトを見る限りポリゴン以外にも使えるようですが
「Zバッファ」は何に対して設定しておくものなんですか?

SetUseZBufferFlag()とSetWriteZBufferFlag()の引数と戻り値と使い方を教えて下さい

行列は知らなかったですが、この場合は係数を決まった順番で並べた物・・かな?

よく考えたらブロックを描画する時なんかはポリゴン12枚必要って事ですよね・・

Justy

Re:3Dポリゴンの無限遠点について

#14

投稿記事 by Justy » 16年前


>それだと背景が欠けてしまいますよね
>それとも重なっている部分にはマスクのような物が働くのでしょうか?

 判定はピクセル単位で行われますので、後から描こうとしたものが
奥にあると判定されたら(※)その部分は描き込まれません。

 なので、結果的にマスクのようになると考えていいと思います。

※手前だったら等判定方法は変更可能
 


>サイトを見る限りポリゴン以外にも使えるようですが
>「Zバッファ」は何に対して設定しておくものなんですか?

 ポリゴン、というかプリミティブ描画(点、ライン、トラアングルなど)全般に使えます。
 設定は・・・・・・ライブラリと GPUに対してですね。



>SetUseZBufferFlag()とSetWriteZBufferFlag()の引数と戻り値と使い方を教えて下さい

 TRUEで有効、FALSEで無効です。

チルチル

Re:3Dポリゴンの無限遠点について

#15

投稿記事 by チルチル » 16年前

あ、以外に引数一つなんですね
ではSetUseZBufferFlag()とSetWriteZBufferFlag()の違いはなんでしょうか?

プリミティブ描画全般に使えるって事は
特に設定が必要ってわけではないんですか?

と言う事は3Dポリゴンは構造体にZ座標が入っていますから
それで勝手にマスク的なものをかけてくれるのでしょうか?

それなら3D背景を描画する時に遠い方から順番に描画する必要も無いんでしょうか?

ピクセル単位って事は今まで無理だと思っていた
クラッカーの中身が出る所みたいな物が描画できるんですか?
全方位に円弾幕を撃つと最後に登録した弾だけ目立っちゃうじゃないですか・・

Justy

Re:3Dポリゴンの無限遠点について

#16

投稿記事 by Justy » 16年前


>ではSetUseZBufferFlag()とSetWriteZBufferFlag()の違いはなんでしょうか?

 前者はZバッファを使用して比較を行うかどうかの設定で、後者は判定が合格した場合、
Zバッファを更新するかどうかの設定です。

 概念的には DirextXや OpenGLと同じなので、詳しくは 3Dプログラミング系の
書籍なり Webなりを調べてみてください。
 


>それで勝手にマスク的なものをかけてくれるのでしょうか?

 その時点で設定されていたワールド行列やカメラ行列にもよるので、
指定したZ値そのもので比較が行われるわけではないですが、そうです。



>それなら3D背景を描画する時に遠い方から順番に描画する必要も無いんでしょうか?

 不透明ものならそうです。

 逆に言えば、透明ものは必要があります。

Zバッファと半透明の相性問題 - Selene
ttp://selene-lue.halfmoon.jp/index.php?%EF%BC%BA%E3%83%90%E3%83%83%E3%83%95%E3%82%A1%E3%81%A8%E5%8D%8A%E9%80%8F%E6%98%8E%E3%81%AE%E7%9B%B8%E6%80%A7%E5%95%8F%E9%A1%8C



>クラッカーの中身が出る所みたいな物が描画できるんですか?
>全方位に円弾幕を撃つと最後に登録した弾だけ目立っちゃうじゃないですか・

 今ひとつニュアンスが読み取れないのですが、前者は可能でしょう。
 後者は最後に描画したものが目立つのはまだ別問題だと思いますが・・・。

チルチル

Re:3Dポリゴンの無限遠点について

#17

投稿記事 by チルチル » 16年前

Zバッファを更新ってどういうことでしょうか?

まあ、別問題ですができない事もないでしょうね・・
うまく交差するか分かりませんが・・

Justy

Re:3Dポリゴンの無限遠点について

#18

投稿記事 by Justy » 16年前


>Zバッファを更新ってどういうことでしょうか?

 Zバッファを使って手前にあるか奥にあるかを判定して、手前にあるなら
そのピクセルを描画するわけですが、その際新しく上書きするピクセルのZ情報を更新しないと、
次に描画するときに古いZ情報を元に判定・描画することになってしまいます。

 その更新処理をするかどうか、です。

チルチル

Re:3Dポリゴンの無限遠点について

#19

投稿記事 by チルチル » 16年前

Z座標が変化していく場合とかですか?

Justy

Re:3Dポリゴンの無限遠点について

#20

投稿記事 by Justy » 16年前


> Z座標が変化していく場合とかですか?

 たとえばZバッファが奥行き10(数字が大きいほど奥にあるとして)だったときに、
奥行き5で絵を描いたらZバッファを更新しなかった場合10のままとなり、
次に奥行き7の絵を描いたら5の時の絵が消えてしまうのを防ぐために、
5を描いたらZバッファも5に更新する、為のものですね。

チルチル

Re:3Dポリゴンの無限遠点について

#21

投稿記事 by チルチル » 16年前

あ~なるほど

ところで更新はいつやればいいのでしょうか?
フラグを立てておけば何か描画するたびに更新されるんですか?

ちなみに更新しても7の絵で10の絵は消えてくれるのでしょうか

Justy

Re:3Dポリゴンの無限遠点について

#22

投稿記事 by Justy » 16年前


>フラグを立てておけば何か描画するたびに更新されるんですか?

 ええ、設定しておけば勝手に更新されます。


>更新しても7の絵で10の絵は消えてくれるのでしょうか

 10の上に7で描けば10の絵は上書きされて消えます。
 5で更新されたところに、7で描こうとしても描かれないので5の絵は消えません。


 なお蛇足ですが、DXライブラリのヘッダを「比較モード」検索すると幾つか定義があります。
 この定義と SetZBufferCmpType関数を使って比較の方法を決めることができますので、
反対に奥にあったときだけ描く、といった使い方もできます。

チルチル

Re:3Dポリゴンの無限遠点について

#23

投稿記事 by チルチル » 16年前

なるほどそういう使い方もあるんですね

SetTransformToView()はこの前のサンプルでも使われていた気がしますが
カメラ行列はどういう内容でしょうか?
ちなみにどこが原点でどこが初期位置ですか?

あとやっぱりブロックを描画する時なんかはポリゴン12枚必要ですよね?

Justy

Re:3Dポリゴンの無限遠点について

#24

投稿記事 by Justy » 16年前


>カメラ行列はどういう内容でしょうか?

 カメラの位置と姿勢(向き)を表す4X4の行列になっています。



>ちなみにどこが原点でどこが初期位置ですか?

 原点は [X, Y, Z] = [0, 0, 0]でしょう。
 ただ、DXライブラリのカメラの初期位置は2D座標系に合わせて
z = 0.0 の時に画面全体が写る位置と方向を持つカメラになるように
なっていたと思うので、原点とは少しずれた位置にあったはずです。



>あとやっぱりブロックを描画する時なんかはポリゴン12枚必要ですよね?

 ブロックというのは四角柱のことですか?
 三角形ポリゴンなら2×6ですので、12で合ってます。

チルチル

Re:3Dポリゴンの無限遠点について

#25

投稿記事 by チルチル » 16年前

4X4と言う事は16個の数値を引数にすると言う事ですか?

ちなみに16個の数値の内容はどうなっていますか?

Justy

Re:3Dポリゴンの無限遠点について

#26

投稿記事 by Justy » 16年前


>4X4と言う事は16個の数値を引数にすると言う事ですか?

 そうなのですが、これはヘッダを見ればすぐに解決する問題ですよね。



>ちなみに16個の数値の内容はどうなっていますか?

2.ビュー変換
ttp://homepage2.nifty.com/skimp-studio/htm/crawl/1_9_transform4.htm#1-9.2
 こういう内容になっています。

閉鎖

“C言語何でも質問掲示板” へ戻る