HEXA BLOG

プログラム

HEXA BLOGプログラム2019.6.21

C#で行こう

前回の投稿からほぼ3か月ぶりです。
お久しぶりです。
good sun🌅ことヤマグチです。
E3でまさかのDEATH STRANDINGが年内発売で大歓喜の中、
RyzenとRadeonの発表もありG20よりも盛り上がっております🎉🎉🎉

さて今回のblogでも3Dプリントの話はすることなく、
プログラムの話を少ししたいと思います。

今の時代は3Dのプログラムを書くとなっても無料で使えるゲームエンジンが台頭したおかげで、
ちょっとした検証すらもゲームエンジンで行った方が早い時代になってしまいましたね。
という事で思いっきり時代に逆行して、
自分でDrawを呼び出して🛠なんでも出来る(なんでもやらなければいけない)🛠環境を簡単に作る方法を紹介したいと思います。

とは言えC++でガリガリと書くのはちょっと大変です。
さらに実験アプリならばボタンとかスライダーとかちょっとしたGUIも付けたいです。
場合によっては複数のビューを自由に配置したいと考えたりします。

そんな希望も簡単に叶えてくれるソリューションがあります。
そうC#ですね。

まず具体的に実行するとこんな感じになります。

興味のある方は今回もGitHubでプロジェクトを公開していますのでご覧になって下さい。
https://github.com/hexagit/SandBoxWPF
免責事項としましてMITライセンスにて公開しますのでご自身の責任においてご利用下さいますようお願い申し上げます。

.Netアプリケーションは幸運な事にNuGetの力によって
大量の労力を肩代わりしてもらえる環境となっています。

今回はWPF+SharpDXを使ってWPFへ複数画面を描画する為のコントロールを作成しています。
多分AvalonDockを使えば着脱可能なウィンドウにも描画出来ると思います。
(SharpDXの開発停止については誠に残念であります😞。)

複数画面に書くためにはSwapChainをウィンドウハンドル毎に作成して、
その数分だけ描画を回したら出来上がりとなっています。
そしてウィンドウハンドルをいい感じに取得する為に、
各コントロールにWindowsFormsHostを作成して、
その子供として
SetStyle(ControlStyles.Opaque | ControlStyles.UserPaint, true);
を施したほぼ空のFormControlを作成してそこからハンドルを取得します。
その後3D描画結果を表示する為に
コントロール.Refresh();
を呼び出すという少しコツが必要ですが、
これだけでちょっとおしゃれな複数ウィンドウ描画の出来上がりです。

そしてWPFを使うとXAMLをつかったバインディングによる楽々GUI連携が書けます。
今回ReactivePropertyを試しに使ってみましたが、
INotifyPropertyChangedしないのはなんとなく新鮮で面白かったです。
バインディングが使えることで複雑なコントロールの管理も簡潔に書けるのは素晴らしいですね。

このサンドボックス🏜を基に拡張するとしたら、
・描画物毎にパラメーターを編集出来る様にする
・ボタンを追加して時間を動かしたり止めたり
・RXを使ってマウス操作を購読📰してカメラ🎥操作する
等々夢が広がりますね🌌
さぁみんなで時代に逆行しましょう!

とここまでは建前で本当は今回のブログではGDC2019のセッション
Disintegrating Meshes with Particles in ‘God of War’
が面白そうだったのでC#+DirectXで何か動くものを作ろうとしたところ、
ちょっと時間が足りなくなりまして…
仕方ないので簡単にWPF+DirectXネタに切り替えましてソースを整えようとしたところ、
なれないRiactivePropertyに手を出してまた右往左往😵した結果なのが今回のネタです。

次回迄興味が無くなっていなければそんなネタでお会いしましょう。
では👋

RECRUIT

大阪・東京共にスタッフを募集しています。
特にキャリア採用のプログラマー・アーティストに興味がある方は下のボタンをクリックしてください

RECRUIT SITE 

NEWS