忍者ブログ

Memeplexes

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

[PR]

×

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


XNA火の玉

XNA Creators Clubのサンプルを参考にして火の玉を作ってみました。
これはポイントスプライトを使っていて、
各頂点(?)にサンプルから拝借したfire.pngを貼り付けています。

fireball1.jpg

おもうに、公式のサンプルは長すぎて難しいですね。

Fireball.zip(ソースコード)

拍手[0回]

PR

XNA Game Studio 2.0

XNA Game Studio 2.0の予告の解説みたいなのはひにけにXNAさんででているようなので、
ここではリンクを貼るだけにします。(全部英語ですが)

Microsoft XNA Developer Presentations(英語)

Xnaに関する動画があります。
英語ですが、時々デモがあって、雰囲気を味わうことが出来るかもしれません。
ここに、Xna Game Studio 2.0の解説みたいなのがあります。

Gamefest 2007: What's New in XNA Game Studio 2.0

Xna Game Studio 2.0で新しいこと

Networking with the XNA Framework

2.0で新しく出るネットワーク機能のデモみたいです。

拍手[0回]


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

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

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

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

量子化学とは?

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

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

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

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

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


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

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

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

門外漢には拷問です。

球面調和関数

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

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

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

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

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

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

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

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

拍手[0回]


アジャイルでXNAゲーム開発

"XNA Game Programming"を2章読んだのですが、(全部で14章)
著者のベンジャミンさんはかなりアジャイルをプッシュしているようです。

しょっぱなの簡単なゲームのサンプル(Pongゲーム)から
ユニットテストを行っています。

ユニットテストといってもNUnitなんかを使うわけではなく、
ただ単にある動作をさせるメソッドを作って目で直接チェックします。
(まぁグラフィックスが絡むと自動テストはかなり難しくなりますからね。)

例えば、画面にメニューを表示させたいのなら、
メニューを出すTestMenuSpritesというメソッドを作り、
それをMainメソッドから通常のコードの代わりに呼び出します。
上手くメニューが表示されたかどうかは自分の目でチェックします。

この方法が単に行き当たりばったりプログラミングよりも優れているのは、
テストしたいことを直接テストできると言う点です。
この本ではボールの衝突チェックのユニットテストの時に真価が発揮されています。

もし行き当たりばったりのプログラミングをしていたのなら、
メニューからスタートし、ゲームを始め、
実際にラケットでボールを弾いて衝突が
上手くいっているか確かめることになるでしょう。
しかしこれでは面倒です。

ここでチェックしたいのはボールの衝突だけであって、
メニューやゲームの開始ではないからです。
それに衝突と一口に言ってもラケットとの衝突、横壁との衝突、縦壁との衝突など
色々あります。
ボールがきちんとチェックできる状態になるまで時間がかかるかもしれません。

この本では、ユニットテストを行うメソッドの中で、
ゲームを直ちにテストできる状態にしています。
メニューを初めに表示するのではなく、もう既にゲームが始まった状態にし、
そしてボールの位置は、キーボードの状態によって
壁の近くに配置できたりするのです。

これなら比較的簡単に結果を確かめることが出来るでしょう。

グラフィックスが絡むと自動テストは難しくなりますが、
自動テストと同じくらい簡単なテストを作ることは出来るのです。

拍手[0回]


RenderStateのプロパティ

どうも紛糾してきたのでMicrosoft.Xna.Framework.Graphics.RenderStateのプロパティについてまとめたいと思います。

1.Alpha Blending
        public bool AlphaBlendEnable { get; set; }
        public Blend SourceBlend { get; set; }
        public Blend DestinationBlend { get; set; }
        public BlendFunction BlendFunction { get; set; }
        public Color BlendFactor { get; set; }

        public bool SeparateAlphaBlendEnabled { get; set; }
        public Blend AlphaSourceBlend { get; set; }
        public Blend AlphaDestinationBlend { get; set; }
        public BlendFunction AlphaBlendOperation { get; set; }

2.Alpha Testing
        public bool AlphaTestEnable { get; set; }
        public CompareFunction AlphaFunction { get; set; }
        public ReferenceAlpha { get; set; }


3.Point Sprite
        public bool PointSpriteEnable { get; set; }
        public float PointSize { get; set; }
        public float PointSizeMax { get; set; }
        public float PointSizeMin { get; set; }

4.Culling
        public CullMode CullMode { get; set; }

5.Depth Buffering
        public DepthBufferEnable { get; set; }
        public CompareFunction DepthBufferFunction { get; set; }
        public bool DepthBufferWriteEnable { get; set; }

        public float DepthBias { get; set; }
        public float SlopeScaleDepthBias { get; set; }

6.Fog
        public bool FogEnable { get; set; }
        public float FogStart { get; set; }
        public float FogEnd { get; set; }
        public Color FogColor { get; set; }
        public float FogDensity { get; set; }
        public FogMode FogTableMode { get; set; }
        public FogMode FogVertexMode { get; set; }
        public bool RangeFogEnable { get; set; }
        
7.Outline and Fill
        public FillMode FillMode { get; set; }
        
8.Stencil Buffer
        public bool StencilEnable { get; set; }
        public int ReferenceStencil { get; set; }
        public StencilOperation StencilDepthBufferFail { get; set; }
        public StencilOperation StencilFail { get; set; }
        public CompareFunction StencilFunction { get; set; }
        public int StencilMask { get; set; }
        public StencilOperation StencilPass { get; set; }
        public int StencilWriteMask { get; set; }
        public bool TwoSidedStencilMode { get; set; }
        public StencilOperation CounterClockwiseStencilDepthBufferFail { get; set; }
        public StencilOperation CounterClockwiseStencilFail { get; set; }
        public StencilOperation CounterClockwiseStencilFunction { get; set; }
        public StencilOperation CounterClockwiseStencilPass { get; set; }

9.Scissor Test
        public bool ScissorTestEnable { get; set; }

10.MultiSample
        public bool MultiSampleAntiAlias { get; set; }
        public int MultiSampleMask { get; set; }

11.Color Write Channels
        public ColorWriteChannels ColorWriteChannels { get; set; }
        public ColorWriteChannels ColorWriteChannels1 { get; set; }
        public ColorWriteChannels ColorWriteChannels2 { get; set; }
        public ColorWriteChannels ColorWriteChannels3 { get; set; }

12.Texture Wrapping
        public TextureWrapCoordinates Wrap0 { get; set; }
        public TextureWrapCoordinates Wrap1 { get; set; }
        public TextureWrapCoordinates Wrap2 { get; set; }
        public TextureWrapCoordinates Wrap3 { get; set; }
        public TextureWrapCoordinates Wrap4 { get; set; }
        public TextureWrapCoordinates Wrap5 { get; set; }
        public TextureWrapCoordinates Wrap6 { get; set; }
        public TextureWrapCoordinates Wrap7 { get; set; }
        public TextureWrapCoordinates Wrap8 { get; set; }
        public TextureWrapCoordinates Wrap9 { get; set; }
        public TextureWrapCoordinates Wrap10 { get; set; }
        public TextureWrapCoordinates Wrap11 { get; set; }
        public TextureWrapCoordinates Wrap12 { get; set; }
        public TextureWrapCoordinates Wrap13 { get; set; }
        public TextureWrapCoordinates Wrap14 { get; set; }
        public TextureWrapCoordinates Wrap15 { get; set; }


む・・・・・・{ get; set; }はいらなかったかな・・・・・・
セットできないRenderStateに意味は無いわけですし、
セットできてゲットが出来ないプロパティと言うのもあまりないですからね。

       

拍手[0回]