2017年06月07日

四角ポリゴンの三角ポリゴン化

Oculus Mediumというソフトウェアを試してみたのですが、3次元空間でのお絵描きというのも新鮮でいいですね。MediumでObjファイルをStampとして空間に描くことができるのですが、少し前のバージョンでは四角ポリゴンがあったり法線ベクトルがなかったりするとエラーで読み込めませんでした。最新バージョンでは直したみたいです[1]。

以前他のレンダラ用の変換プログラムを作っていた気がしたので、それに四角ポリゴンを三角ポリゴンに変換する機能も入れました。やり方自体は簡単です。QUADの場合、indexに4頂点が指定されていますので、3頂点×2個の面に分割して追加するだけです。

quad2triangles_001.png

一応四角ポリゴンの.objを読み込んで出力してみましたが、きちんと三角ポリゴンになっていました。この変換プログラムは輪郭線の描画は画像処理でやっていたので、遅かったのでOpenMPを試してみました。parallel forしか使っていませんが、体感的には2倍ぐらい早くなった気がします。ついでに過去の記事でやっていたブルーム効果も追加してみました。

実行結果

render_blume_001.png
キューブマップを導入したら動くPCと動かないPCがあって謎です。キューブマップ単体のサンプルなら表示されるので、テクスチャ周りの使い方に何か問題があるんだと思うのですが…。

[1] Oculus Medium Updates

web拍手 by FC2
posted by シンドラー at 22:22 | Comment(0) | TrackBack(0) | OpenGL & Metasequoia | このブログの読者になる | 更新情報をチェックする

2017年05月18日

ボリュームデータのファイルフォーマットについてのメモ

ボリュームデータの表示ができるものとして、前回のKVSの他にもParaView[1]やVTK[2]などがあります。これらで使われているファイルフォーマットの一部についてメモしておきます。

ボリュームデータには、構造格子(格子状にデータが並んでいる)ものと、非構造格子(四面体の組合せなどデータ点が揃っていない)ものがあります。今回はとりあえず取り扱いやすい構造格子のデータについてです。

AVS FLD
サイバネットシステム株式会社のAVS[3]という可視化ソフトウェアで用いられているファイルフォーマットの一つです。最初に簡単なヘッダ情報が来て後はデータになります。詳細は参考サイト[4]を見てもらえればと思います。
  # AVS field file
  ndim = 3
  dim1 = 120
  dim2 = 120
  dim3 = 34
  nspace = 3
  veclen = 1
  data = byte
  field = uniform
  ※以下バイナリデータは省略
上記は3次元の構造格子120x120x34で、veclenが1なので1個のスカラー量をbyteで持っている例になります。拡張子は.fldです。

VTK
VTKにはレガシータイプとXMLを使ったファイルフォーマットがあるみたいです。まずはレガシータイプです。こちらはAVS FLDに似ている感じでしょうか。参考サイト[5]はchar型でしたが、unsigned_charに変更しています。
  # vtk DataFile Version 2.0
  Volume example
  ASCII
  DATASET STRUCTURED_POINTS
  DIMENSIONS 120 120 34
  ASPECT_RATIO 1 1 1
  ORIGIN 0 0 0
  POINT_DATA 489600
  SCALARS volume_scalars unsigned_char 1
  LOOKUP_TABLE default
  0 0 0 0 ...
こちらも構造格子120x120x34=489600点で、unsigned_char型のASCIIデータが並んでいます。たぶんバイナリ形式もあるんだとは思います。Originが原点(最小座標?)で、ASPECT_RATIOは各点の間隔でしょうか(未確認)。拡張子は.vtkです。

ParaViewではXMLの方に対応しているみたいですので、そちらのファイルフォーマットについてメモしておきます。
VTKでは、データタイプでファイルの拡張子が変わるようです。

ImageData (.vti) - Serial vtkImageData (structured).
PolyData (.vtp) - Serial vtkPolyData (unstructured).
RectilinearGrid (.vtr) - Serial vtkRectilinearGrid (structured).
StructuredGrid (.vts) - Serial vtkStructuredGrid (structured).
UnstructuredGrid (.vtu) - Serial vtkUnstructuredGrid (unstructured).
PImageData (.pvti) - Parallel vtkImageData (structured).
PPolyData (.pvtp) - Parallel vtkPolyData (unstructured).
PRectilinearGrid (.pvtr) - Parallel vtkRectilinearGrid (structured).
PStructuredGrid (.pvts) - Parallel vtkStructuredGrid (structured).
PUnstructuredGrid (.pvtu) - Parallel vtkUnstructuredGrid (unstructured).

今回は構造格子のデータですので、StructuredGrid (.vts)になります。こちらはCellとかがよくわかりませんが、参考サイト[6]のサンプルを使う分には問題なさそうです。PointDataのDataArrayにスカラー値、PointsのnDataArrayに3次元の点座標を羅列すればよさそうです。ただ、PointsのDataArrayに全ての座標を指定しないといけないのかどうかなどよくわかっていません。ちゃんと仕様書[7]はあるのですがよく読んでいませんので。
  <?xml version="1.0"?>
  <VTKFile type="StructuredGrid" version="0.1" byte_order="LittleEndian" compressor="vtkZLibDataCompressor">
    <StructuredGrid WholeExtent="0 1 0 2 0 3">
    <Piece Extent="0 1 0 2 0 3">
      <PointData Scalars="Scalars_">
        <DataArray type="Int16" Name="Scalars_" format="ascii" RangeMin="0" RangeMax="6">
          0 1 1 2 2 3
          1 2 2 3 3 4
          2 3 3 4 4 5
          3 4 4 5 5 6
        </DataArray>
      </PointData>
      <CellData>
      </CellData>
      <Points>
        <DataArray type="Float32" Name="Array 0x85412e8" NumberOfComponents="3" format="ascii" RangeMin="0" RangeMax="3.7416573868">
          0 0 0 1 0 0
          0 1 0 1 1 0
          0 2 0 1 2 0
          0 0 1 1 0 1
          0 1 1 1 1 1
          0 2 1 1 2 1
          0 0 2 1 0 2
          0 1 2 1 1 2
          0 2 2 1 2 2
          0 0 3 1 0 3
          0 1 3 1 1 3
          0 2 3 1 2 3
        </DataArray>
      </Points>
    </Piece>
    </StructuredGrid>
  </VTKFile>
こちらは2×3×4=24点のデータです。非構造格子の場合はCellDataで形状の指定なども必要なようです。

実行結果

lobster_paraview.png

lobster.fldをlobster.vtsに変換してParaViewで表示してみました。この辺りのファイル変換はおそらく自分で書かなくてもVTK使えばできると思います。

[1] http://www.paraview.org/
[2] http://www.vtk.org/
[3] http://www.cybernet.co.jp/avs/
[4] http://tsubame.gsic.titech.ac.jp/docs/guides/isv-apps/avs_express/html/avs_express5.html
[5] http://stackoverflow.com/questions/28323373/vtk-structured-point-file
[6] http://public.kitware.com/pipermail/paraview/2007-September/005781.html
[7] http://www.vtk.org/wp-content/uploads/2015/04/file-formats.pdf

web拍手 by FC2
posted by シンドラー at 18:20 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2017年04月30日

KVSに関するメモ

Kyoto Visualization System(KVS)[1]という可視化ライブラリがあるようなので、使ってみることにします。今回は環境設定などが楽そうなのでVirtualBox上[2]のUbuntu[3]で試してみたいと思います。細かい設定など面倒なので、Ubuntu DesktopのISOを使って、開発に必要そうなものなど色々インストールしました。

VirtualBox上でマウス操作する際、画面外に出られなかったり使いにくいのですが、Guest Additionsのインストールを行えば普通に使えるようになるそうです[4]。その他、WindowsとUbuntuでデータ共有もしたかったので、その方法も調べてみました。VirtualBox上で設定して後はUbuntu上でマウントすればいいみたいです[5]。

使い方と環境設定ですが、Wikiの内容が最新かと思います[6]。まずはGLUTとGLEWのインストールです。
  sudo apt-cache search glut
freeglut系が見つかりましたので、とりあえずそれを入れます。
  sudo apt-get install freeglut3-dev
次はGLEWです。
  sudo apt-cache search glew
  sudo apt-get install libglew-dev
続いて必要なのが環境変数KVS_DIRの設定です。これはWikiの通り.bashrcを編集しました。

次はインストールです。[1]からデータをダウンロードして解凍します。後はmakeとmake installで問題がなければうまくいくと思います。今回はWikiの通りKVS_DIRに~/local/kvsを指定しましたので、そこにinstallされます。

コンパイルについてですが、kvsmakeというプログラムが用意されていますので、それを使用します。
  kvsmake -G lesson1
  kvsmake
テストデータもWikiの通りです。
  git clone https://github.com/naohisas/KVS.data.git

付属のデータ以外でも試してみようと思いましたので、ボリュームデータというわけではありませんがMagicaVoxelのサンプルをKVSで用いられている.kvsmlに変換して表示してみました。

実行結果
kvsview_biome.png

動作確認は終わりましたので、次は実際にプログラミングしてみたいと思います。

[1] Kyoto Visualization System
[2] Oracle VirtualBox
[3] Download Ubuntu Desktop
[4] http://clubsepc.seesaa.net/article/229489943.html
[5] http://qiita.com/HirofumiYashima/items/6044cfc64cfa3e84f97c
[6] 入門KVS

web拍手 by FC2
posted by シンドラー at 03:47 | Comment(0) | TrackBack(0) | Rendering | このブログの読者になる | 更新情報をチェックする

2017年03月30日

ライフゲームのテスト

油断すると1か月以上更新していなくて困ったものです。今回はリハビリということで簡単なライフゲームを実装してみました。アルゴリズム的には下記3点のみです。

1. 3x3近傍の8マスに3個生物がいれば増える
2. 3x3近傍の8マスに2個生物がいれば現状維持
3. それ以外の時は減少

実行結果

面白いパターンになるグライダー・ガンで動作確認してみました。想定通りのパターンになっているので問題ないと思います。見つけた人はすごいですね。

web拍手 by FC2
posted by シンドラー at 02:15 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2017年01月15日

麻雀プログラムの作成 その8

寒いですね。チャンタ系(清老頭、純チャン、チャンタ)とトイトイ系(対々和、三暗刻、四暗刻、三槓子、四槓子)の判定を実装しました。後は混一色系と、三色同順など順子系の判定を実装すれば、大体の役判定は終わりです。七対子判定はバグがありますが…。

実行結果

副露が多いと右にはみ出します…。

mj_result_012.png

mj_result_013.png
web拍手 by FC2
posted by シンドラー at 15:46 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2017年01月07日

麻雀プログラムの作成 その7

前回の続きです。とりあえず親の連荘と得点計算を実装しました。点数表示も付けたので後は役判定を実装していけばとりあえず一人で四人打ちは完成で、後はAIなどをどうするか考えたいです。

実行結果

mj_result_011.png

画像で見ると小さいですが、一応東とか南とかの自風の下に得点を表示しています。
web拍手 by FC2
posted by シンドラー at 03:52 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2017年01月04日

麻雀プログラムの作成 その6

明けましておめでとうございます。冬休みがもう終わってしまいました。年始も一応コツコツ作ってはいて、3割ぐらいの役判定と得点計算を実装しました。まだまだ残りの役判定もバグもいっぱい残っています。麻雀プログラムの作成は大変ですね。

実行結果

mj_result_010.png

メンタンピンツモで20符判定なども一応はうまくいっているようです。点数は表示しているだけで反映していないので、その辺も実装しないといけないですね。
web拍手 by FC2
posted by シンドラー at 22:58 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2016年12月31日

麻雀プログラムの作成 その5

大晦日ですね。昨日の続きで国士無双の判定と、日本語文字の表示を行いました。国士無双に関しては、么九牌13種全て揃っているということと、頭1つで14枚揃っているという二つの条件が必要です。そのため、完成までの牌数の計算にちょっと迷いました。

日本語表示に関しては、画像の読込みにOpenCVを使用していましたので、そのままOpenCV使ってやることにしました。ただ、OpenCVも2系の段階では日本語表示に対応していないようでしたので、[1]のヘッダファイルを使用させていただきました。

実行結果

mj_result_009.png

国士無双は4人打ちで揃えるのは大変ですので、1人打ちにしてデバッグしました。日本語表示するとかなりましになった気がしますね。特殊な判定が必要な国士無双と七対子が終わりましたので、後はその他の役を少しずつ追加していきたいと思います。

[1] OpenCV で日本語を出力しようパート2
web拍手 by FC2
posted by シンドラー at 18:50 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

麻雀プログラムの作成 その4

もう年末ですね。テレビを見ながらゆっくり実装です。今回は七対子の判定を追加しました。七対子は、名前の通り対子が7個ですので、それぞれの種類の牌の数を数えて、2個のものが7個あれば完成となります。分割したパターンでは、槓子を対子2つと区切る場合もありますが、4枚使いの七対子は無しの方針なので、そこの判定にだけ注意が必要です。

後は[1]の背景画像を使用させていただき、上がった時に表示される画面を追加してみました。次は他の役判定と点数計算です。今使っているビットマップフォントはアルファベットのみなので、役の表示とかどうしましょうかね。

実行結果

mj_result_007.png

[1] 4K バックグラウンド 無料素材
web拍手 by FC2
posted by シンドラー at 00:32 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2016年12月28日

麻雀プログラムの作成 その3

続きです。リーチ判定ができるようになっていたので、ツモ及びロン判定はすぐできました。ツモの時は手牌の14枚、ロンの時は手牌13枚+捨て牌の組を作成し、それの待ちが1個(対子)のみであれば上がれるという判定です。七対子と国士無双は後回しです。

実行結果

mj_result_006.png

これで後は役判定ができれば、一人で四人打ち麻雀ができるようになります。役判定も基本的には力押しで組み合わせパターンを列挙して一番役数が多いものを採用になると思います。
web拍手 by FC2
posted by シンドラー at 03:31 | Comment(0) | TrackBack(0) | 日記 | このブログの読者になる | 更新情報をチェックする