忍者ブログ

Memeplexes

プログラミング、3DCGとその他いろいろについて

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


かんたんXNA その27 ステンシル・バッファ

このページは古いです
最新版はこちら


ステンシル・バッファ

3Dの映像を描画する時には、
描画する部分を限定したい時があります。
例えば水や鏡にモデルが映りこんでいるときです。

そういうときにはモデルを鏡に対して反転してもう一回
描画するというやり方がありますが、
それでは鏡をはみ出してしまうかもしれません。

出来るなら鏡の領域の中でだけ
描画できるようにしたいものです。

あるいは物体の影を描く時も、そのように描画する
領域を制限したくなる場合があります。
影で暗くなる所だけ描画するようにして
半透明の黒で描画するのです。
(ここで言っているのは、
面が斜めになっていることによって出来る「陰」ではなくて、
他の物体によって光がさえぎられることによって出来る「影」です。)


こういったときに描画する領域を限定するために使うのが、
ステンシル・バッファです。
(ステンシルというのは、何か模様の形をした穴の開いた型があって、
そこにスプレーをプシューとやるとその模様が写るあれです。)


使い方は深度バッファやアルファ・テストに似ています。
とくに深度バッファとはかなり似ているので
ひとくくりにされることもあるくらいです。
深度バッファと同じように、各ピクセルにステンシルの値を表すデータがあって、
そのデータに基づいて描画するかしないかを制御することが出来るのです。
(ちなみに最初の値は深度バッファと違って0です。
深度バッファの最初の値は1でした。)


例えばあるモデルを四角形の中でだけ描画されるようにしたいとしましょう。
まず「型」を作るようにステンシル関連の設定をして、とりあえず四角形を描画します。
そうするとその四角形の形の「型」ができます。
四角形のそれぞれのピクセルのステンシル値が書き換えられたのです。

その後ステンシルの設定を「スプレーのプシュー」が出来るようにします。
そしてモデルを描画すると、きれいに「型」の中でだけ描画されるのです。
四角形の外には描画されません。

拍手[0回]

PR

XNAで量子化学 球面調和関数の表示

意味不明なタイトルですが、書いてる
ぼくにもよくわからないので問題ありません。

実は7月30日までに量子化学とか言う学問を
理解しなければならなくなったのですが、
それでXNAの助けを借りようというわけです。
(念のためことわっておくと、ぼくは化学が大の苦手で、
どのくらい苦手かと言うと大学受験に生物と物理を
使ったくらいです)

ソースコードのダウンロードはこちら

量子化学とは?

量子化学
というのは、最先端の化学だそうで、
バイオテクノロジーやナノテクノロジーなんかでは
良く使うとか何とかだそうです。

では高校で習うようなフツーの化学と何が違うのかと言うと、
高校での化学は化学現象を、分子がH-Hみたいに
「結合のための手」をもっていると考えるのに対し、
量子化学は、化学現象の本質が
「原子の一番外の電子殻にある価電子」(表面軌道)
とやらであると考えるのだそうです。
(何でもこのほうが厳密にキチっと行くそうです)

例えば、
原子が化学結合をするのはお互いの価電子が作用しあうから。
分子がどんな構造になるかを決めるのは価電子の相互作用で、
分子は相互作用が最も安定になる構造になる。
物質の化学反応は分子の価電子の相互作用が重要。

果ては物質の沸点や融点、物質の色から溶解性まで
価電子が決めるのだそうです。

ともかくその価電子とやらがとても重要だと言うことです。
(たぶん進化生物学でいうなら淘汰の単位としての
遺伝子のポジションにあるのでしょう。
現代のプログラミングで言うとオブジェクトと言ったところでしょうか?)


で、決まってそういう重要な概念には(困ったことに)
いろんな表現の仕方があるものです。

例えば、この価電子というのは、表面軌道とも言われます。
価電子は原子や分子の表面を周っているからでしょうか。

さらに、それが原子の価電子である場合は、
とくに外殻原子軌道(アウター・アトミック・オービタル)と言い、
一方、それが分子の価電子である場合には、
とくに外殻分子軌道(フロンティア・オービタル)と言うそうです。

門外漢には拷問です。

球面調和関数

で、そのとてもとっても大切な価電子を扱うには、普通の理屈は通用しません。
これは量子力学の領分です。
粒子としての性質と波としての性質の両方を持つとか言うやつです。

価電子はシュレディンガー方程式という波動方程式で表されるのです。

量子力学は何がどこにあるかは確率でしかいえないとか言いますが、
この方程式に出てくる波動関数の絶対値を二乗することによって
その確率が出てくるのです。

で、その波動関数というのはある2つの関数をかけたもので表せるのですが、
そのうちの1つが、この記事のタイトルを意味不明なものにしている、
球面調和関数(スフェリカル・ハーモニクス)です。
これをXNAで表示してみることにしました。

これには複数の種類があるので一部だけをのせましょう。
(Tabキーで表示する種類を変えます)
6a2df85d.JPG5ea3e5e6.JPG
この球面調和関数なるものは、
中心からの方向(Z軸となす角度とZ軸周りの角度)の関数なので、
この関数の値を中心からの距離と言うことにして描画しました。
ただこれだと値がマイナスになっていた時困るので、
その時は色を青にしました。(プラスの時は赤)

関数の形を良く見えるようにと言うことで
アルファ・ブレンディングで半透明にしたのですが、
逆効果だったかもしれません。

せっかくなので、スペースキーを押すと
ワイヤーフレームがその上に表示されるようにしました。
これで少しは立体的な感覚がつかめるようになったと思います。
90d5369b.JPG※UpキーやLeftキーを押すとモデルが回転してさらに立体的に把握しやすくなります。

ソースコードのダウンロードはこちら

拍手[0回]


かんたんXNA その26 アルファ・テスト

このページは古いです
最新版はこちら

XNAでは(やっぱりXNAに限ったことではありませんが)、
これから描画するピクセルの色のアルファの値によって
描画を制限することが出来ます。

たとえば、これからアルファが(255中)30以上の時しか
描画しない設定にすれば、色のアルファの値が20の三角形は
全く描画されなくなります。
アルファの値が40ならいつも通りに描画されます。

拍手[0回]


かんたんXNA間違い訂正 grahpics → graphics

どうしようもないタイポを見つけました。

どうも「かんたんXNA その18」から紛れ込んでいたようです。

GraphicsDeviceManagerの変数名が
grahpicsになっていました。
正しくはgraphicsですね・・・・・・。

うう・・・、インテリセンスに頼りすぎだったかもしれません。
気付いたのは自分で一度だけ"graphics"と打ったときです。
エラーが出てそんな変数はないと教えてくれるんですね。

そんなバカなと思って見直してみるとgraphicsが全部grahpicsになっていました!
さっそく修正します。

拍手[0回]


C# 3.0 のObject InitializerでWPF

.Net 3.0のグラフィックス技術である
Windows Presentation Foundation(WPF)は
その前のWindows Formsよりも良い設計で柔軟なのですが、
「柔軟すぎて使うクラス数が増えすぎてイヤ」
ということもあるかもしれません。

また、コンストラクタに引数を摂るクラスがなんとなく少なめなので
コンストラクタに引数を渡せたら1行で済むところが
何行にもわたってしまうこともあるでしょう。

そんなときにはC# 3.0のObject Initializerです。

拍手[0回]