プロフィール

Na-7

Author:Na-7
SE(システムエンジニア)として約15年間システム系ソフト会社を勤めあげ、2008年3月退社。現在、ゲーム制作会社設立を目指して活動中。


アクセスカウンター


最新記事


最新コメント


最新トラックバック


月別アーカイブ


カテゴリ


DATE: CATEGORY:スポンサー広告
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
DATE: CATEGORY:三国志軍記開発
物理のかぎしっぽ
物理のかぎしっぽ
共同執筆体制で構築された理数系解説サイト。初心者向けに図入りでわかりやすく解説している。



◎頂点フォーマットの項目順序

最初はVertexPositionNormalTextureでサンプル地形の頂点データ取得を試みましたが、出力結果を確認すると、法線とテクスチャ座標の値が入れ替わっているようです。そのまま読み替えることも可能ですが、一応カスタム頂点フォーマットを定義して再取得したら…推測通りでした。

データの項目数は同じでも、項目順序が異なると値が入れ替わっちゃいますね。危険性は覚悟してましたが、ホームページのやり方は、ちょっと強引過ぎたかなぁ?先頭はPositionから始まることが多いので、いいやり方だと思ったんですけどね…。



◎頂点データの格納順序

サンプル地形の頂点データのxz座標を確認すると、格納順序が不規則であることに気付きました。自作地形はイメージ通り直線的に格納されてました。

サンプル地形の頂点データ(PDF形式)
(後半の表は、後で使います)

自作地形の頂点データ(PDF形式)

サンプル地形の頂点データが何でこんな順番で格納されているのか不思議ですが、モデル表示時の見た目には影響しないと思うので無視します。



◎もう一度ベクトル

自作地形とサンプル地形の頂点データの値を比較したら、法線データが異なることがはっきりしました。では、サンプル地形はどのような計算をしているのでしょうか?

「値が取得できたのだから、逆算して計算式を導くことはできないか?」と思ったものの、そもそもベクトルの商(割り算)って可能なんでしたっけ?

昔はベクトル得意だったはずなんですが、20年経った今となっては全然覚えてません。(^^;
仕方がないので、冒頭のサイトで再勉強しました。


…ははぁ…外積ってつまり法線のことですね。やっと理解しました。あれ?ベクトルの商は無いの?それじゃ逆算できないなぁ。う~ん、どうしよう…。



◎2組のベクトルから法線を求める

1つの頂点に隣接する頂点は、上下左右で4つ、斜めを含めると8つあります。

記憶違いかもしれませんが、昔どこかで「斜めを組み合わせると良い」という記事を読んだような気がするので、サンプルは斜めの頂点を使って計算してるんじゃないかなぁ…。

そう思って適当な組み合わせを試したら、法線の値は変化するものの、サンプルの値とは一致せず、見た目もサンプルに近付いた気がしません。

考えてみると、8方向のうち2方向を組み合わせるパターンは8×7=56通りあります。いちいちプログラムを修正実行するのが面倒になってきたので、最後はExcelで一括計算しました。

2組のベクトルから法線を求める(PDF形式)

組み合わせ可能なパターンを総当たりで算出し、サンプル地形の法線に一致する値を探したのですが、存在しませんでした。あらら…。

つまり、2組のベクトルから単純に算出したのではない、ということですね。算出した値をさらに補正したか、3つ以上のベクトルを利用した可能性が高そうです。



◎8組の面法線から頂点法線を求める

もし3つ以上のベクトルを利用するとしたら、やはり全方向じゃないでしょうか?

しかしそれを求める計算式に自信がありません。全部足して正規化すれば良いような気がしますが…。

一応こちらの記事で確認したら、考え方は間違っていないようなので、Excelで算出してみました。

隣接する全ての面法線を求め、頂点の法線を算出する(PDF形式)

…サンプル地形の法線とは一致しませんでした。え~これも違うの?



◎次回予告

結局今回は数学の復讐で終わってしまいました。一応法線の考え方は理解したつもりですが、サンプルの計算式を解き明かせなかったので、いまいち自信が持てません。

ちょっと行き詰ってきたので、見た目の違いは保留にして、先に川モデル作ろうと思います。

スポンサーサイト

テーマ : ゲーム製作 関連 - ジャンル : ゲーム

コメント

はじめまして

はじめまして、seb2008と言います。
私はXNAで作っているのではないのですが
いつもこっそり拝見しています。

最近私も法線について学習して挫折し妥協したのですが
記事を拝見し見本の数値があるのに合わせて
同じ数値になるかどうかで確認する方法で
やればいいのかと思い私も挑戦しました。

一番単純そうな、Xは最も左でZは一番手前の
0番で試しました。
インデックスバッファから012と031のポリゴンに
使われているので
いろいろ試しましたが合わないです

一つ疑問なのですがリンク先の
vv1 = v1 - v0;
vv2 = v2 - v1;
の所なんですが引くのはどれからどれを引くのでしょうか?
どれかわからないのでいろいろ試しましたが、
計算時、法線のYがマイナスになる時があるのですが
マイナスだと面が下向きとなり、ありえないと思うのですが・・・
三角形を構成する3頂点のもっともXが小さく、かつZも小さいものを、
他の頂点から引くでいいのでしょうか?
今回のサンプルではその条件を満たすのがあるのですが
そうでない場合どれからどれをひくのでしょうか。

初めてのコメント書き込みで質問してしまって
申し訳ありません。






ありがとうございます

はじめまして、seb2008さん。
コメントありがとうございます。
(XNA以外の方も見て頂いていたのですね!)
今後ともよろしくお願いします。


>インデックスバッファから012と031のポリゴンに
>使われているので
>いろいろ試しましたが合わないです

この部分がよく理解できなかったのですが、012や031というのは何の番号でしょうか?


>一つ疑問なのですがリンク先の
>vv1 = v1 - v0;
>vv2 = v2 - v1;
>の所なんですが引くのはどれからどれを引くのでしょうか?

これは「v0、v1、v2にポリゴンのどの頂点を当てはめれば良いのか?」という疑問と解釈してよろしいのでしょうか?
だとすると、答えは「どの頂点をどこに当てはめても良い」だと思います。


>どれかわからないのでいろいろ試しましたが、
>計算時、法線のYがマイナスになる時があるのですが
>マイナスだと面が下向きとなり、ありえないと思うのですが・・・

仰る通りですね。
マイナスになった場合は、符号を反転すれば良いと思います。
具体的には、xとyとzにそれぞれ-1を掛ける、ということです。

マイナス判定を省略したい場合は、前述の頂点v1、v2、v3を「左回り(反時計周り)」に当てはめると、マイナスにならないと思います。


>初めてのコメント書き込みで質問してしまって
>申し訳ありません。

いえいえ。コメントがあると嬉しいです(^^)

ただ、私も法線は勉強したてで、回答に自信が持てません。もし間違っていたらごめんなさい。

返答ありがとうございます

>この部分がよく理解できなかったのですが、012や031というのは何の番号でしょうか?
頂点配列の番号です

頂点のXZ座標値から

2 1 4
0 3 5
と並んでいてインデックスバッファの0は
012のポリゴンと031のポリゴンにしかないので
その二つに使われている頂点で法線を計算しました

>答えは「どの頂点をどこに当てはめても良い」
ありがとうございます。これについてずっと悩んでいました。

http://msdn.microsoft.com/ja-jp/library/bb892827.aspx
↑にもXNAではないですが法線の計算のコードが
ありましたので試しましたが値は違うものになりました。

もう少しいろいろ試してみようと思います
ありがとうございました。




情報ありがとうございます

こんばんわ~

>>この部分がよく理解できなかったのですが、012や031というのは何の番号でしょうか?
>頂点配列の番号です

なるほど、理解しました。


>と並んでいてインデックスバッファの0は
>012のポリゴンと031のポリゴンにしかないので
>その二つに使われている頂点で法線を計算しました

私もExcelで計算してみましたが、サンプルの法線と一致しませんでした。


>↑にもXNAではないですが法線の計算のコードが
ありましたので試しましたが値は違うものになりました。

コードをXNAに移植して試してみたのですが、計算結果は一致しませんでした。

…あれ?法線の計算式をよく見ると、「右」や「上」のように1頂点へのベクトルではなくて、「左右」「上下」のように軸頂点のベクトルで計算してますね?
これは私にとって新しい発見です!

もう一度、このやり方で考え直してみます。
情報ありがとうございました。

コメントの投稿


管理者にだけ表示を許可する

トラックバック


この記事にトラックバックする(FC2ブログユーザー)



copyright © ゲーム制作の舞台裏 all rights reserved.Powered by FC2ブログ
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。