Beziex自由曲面バーチャル研究室
(C)1999-2016 EISHIN, All Rights Reserved.

Beziex Ts (Home)
 & ダウンロード


Beziex Pcc
Beziex Pcc C# (New!!)

リンクページ
Eishin's Lab Room
[メールフォーム]




Beziex LG (初代Beziex)

Beziex AT プレリリース版
(改良型Beziex)

        -->[開発中止]



Copyright 1999-2016 EISHIN,

Beziex自由曲面バーチャル研究室
(C)1999-2016 EISHIN, All Rights Reserved.


BeziexLab は、自称 CG理論アーキテクトの EISHIN が運営する私設バーチャル研究室です。この研究室は自由曲面理論の研究を目的としており、本サイトでは現時点までの成果である
「Catmull-Clark → 曲面変換ライブラリ」 & 「確認用ビューワ」
のダウンロード (FREE) などを行っております。
なおこのページでは 「Beziex Pcc C#」 について説明します。




■■■ Beziex Pcc C# ■■■



注) 上記キャプチャ画面に表示されている初音ミクは、zima さん作成の3Dモデルを変換したものです。貴重なオリジナルモデルの使用を許可していただいた zima さんに感謝します。
オリジナルモデルの URL:
http://uurou.blog99.fc2.com/blog-entry-149.html

なおこのオリジナルファイルを元に「Beziex Pcc (C#)」用に変換したファイル(patchesファイル:独自フォーマットファイル)を、(本ページよりダウンロード可能な)ダウンロードファイル内に付属させています。
また現時点にてBeziex Pcc C#で表示されるこの初音ミクの品質はあまり良くありませんが、これは主にBeziex Pcc C#のバグによるものです。けっしてオリジナルモデルの品質が悪いわけでは無いことをお断りしておきます。


1. 概要

Beziex Pcc C# は、「Beziex Ts」の "パッチ型Catmull-Clarkサブディビジョン"機能 に特化し、大幅に拡張した
「Catmull-Clark → 曲面変換ライブラリ」 & 「確認用ビューワ」
で、C# で書かれている。
「Catmull-Clark サブディビジョン」は現在、数多くの 3DCGソフトで採用されており、これを活用している3Dデザイナーも多い。つまりデザイナーが慣れ親しんだ方法で作成された3Dデータを利用出来るわけである。
ところでダウンロードファイルの中には、そのまま動作可能な実行ファイルは含まれていない。プロジェクトファイル&ソースファイル という形で入っているので、各自ビルドする必要がある。
なお C++ 版である「Beziex Pcc」では、
・  BxPccSDK
・  BxPccWxWithDx
のうち、"BxPccSDK" は一部のヘッダファイル以外をソース非公開としていたが、「Beziex Pcc C#」では、すべてのソースを公開している。
ただし C++ 版に比べてかなり遅いので、

Beziex Pcc (C++) : 実行速度を確認する
Beziex Pcc C# : 「基本アルゴリズム」の実装(ソースコード)を見てみる

ためのモノだと考えてほしい。 なおこの Beziex Pcc C# の内容は、大きく分けると
・  BxPcsSDK
・  BxPcsWpfWithSdx
の2種類となる(どちらもフリー)。


2. BxPcsSDK

以下の処理を行うプログラムで、Beziex Pcc C# そのものと考えてよい。
1)  「Catmull-Clarkサブディビジョン」の元となるポリゴン(ケージ)を読み込み、内部的に細分割したポリゴン頂点の情報を利用し、境界曲線(ベジェ曲線)と「ソース境界横断導関数(ソースCBD)」を作成する。
2)  境界曲線とソースCBDから「CBD用境界曲線投影平面」を作成する。
3)  境界曲線、ソースCBD、CBD用境界曲線投影平面から「Beziexパッチ(2009版)」用のパラメータを求める。なおこの「Beziexパッチ(2009版)」は2009年に公開した、独自アルゴリズムの自由曲面である。
4)  「Beziexパッチ(2009版)」をテセレーションし、分割したポリゴンとして出力する。

またこれを図式化したものが下図である。




ここでなぜ「Catmull-Clark サブディビジョン」で細分割したポリゴンをそのまま使用しないのかについて、理由を以下に述べる。

a)  Beziex Pcc C# では現在はまだテセレーション処理をCPU側で行っているが、今後 テセレーション処理の一部(またはほぼ全て)をGPU側に移したいと考えている。これにより今よりかなり高速でテセレーションが可能となるであろう。
それに対しサブディビジョンの手法自体は、現在のGPUで効率的に処理を行うのはかなり難しい。これがサブディビジョンを一旦、Beziexパッチに変換する理由である。
具体的には、Beziexパッチに変換後のデータをファイル化(本プログラムでは "patchesファイル") しておき、データ利用時にそのファイルを読み込むようにすれば、高速で大量のポリゴンを生成出来るわけである。

b)  Catmull-Clarkサブディビジョンは基本的に、1辺を2の階乗(2,4,8,...)でしか分割出来ない。しかし一旦曲面化すれば、任意の分割数でテセレーション可能で、しかも(4角パッチの場合)縦横で分割数を変えることも出来る。
つまり、これにより無駄に多いポリゴンをレンダリングする必要は無くなる。


3. BxPcsWpfWithSdx

「BxPcsSDK」の上位に位置しており、具体的には以下の処理を行うプログラムである。

a)  「BxPcsSDK」によってテセレーションされたポリゴンモデルを表示し、さらにこのモデルに対し回転させたり、分割数を変えたりする。

b)  patchesファイルの読み書き、cageファイルの読み込みを行う。ちなみに現時点では、(ダウンロードファイル内に) cageファイルの添付は行っていない。


4. BxPccSDK テクニカルガイド

本ページには技術的なことはあまり記述されていない。「BxPcsSDK(BxPccSDK)」に関する技術的な内容は、下記のリンクにある「BxPccSDK テクニカルガイド」という PDF ファイルに収めてある。




5. 開発/実行環境

5-1. OS/解像度

5-1-1. 稼動OS

Beziex Pcc C# をビルド&実行できるOSは Windows のみである。Windows のバージョンは「5-3. 開発/実行環境のダウンロード」の環境が動くものであれば大丈夫だと思うが、現在のところ Windows 7 SP1 32bit版 上でしか試していないのでご容赦願いたい。


5-1-2. 解像度

解像度は「1024×768」以上でなければならない(縦横ともこの解像度を下回らないこと)。また色数は「True Color (32 or 24ビット)」以上が望ましい。


5-2. 使用技術

Beziex Pccでは以下のような開発/実行環境を使用している。

1) C# コンパイラ
「Microsoft Visual Studio Community 2015」を使用 (v0.5.5b までは「Microsoft Visual C# Express 2010 SP1」) 。

2) .NET Framework
「.NET Framework」は C# と密接な関係にある。「Visual Studio Community 2015」をインストールすると「.NET Framework 4.0」もインストールされるようだが、場合によっては別途インストールしたり、.NET Framework 2.0, 3.0, 3.5 もインストールする必要があるかもしれない。

3) WPF(Windows Presentation Foundation)
ユーザーインターフェイス開発/実行用環境である。なお Visual C# にはユーザーインターフェイス開発環境として「Windowsフォーム」と「WPF」の2種類があるが、WPF の方が "構造が自分好み" なので (主に) コレを採用している。
ちなみに WPF を使用するためには「.NET Framework 3.0」以上が必須。

4) Windowsフォーム
残念なことに「Visual Studio Community 2015」に付随する WPF には、スピンコントロールと言われるUIが入っていない(おそらく2015年5月現在の WPF では、どれにも入っていないはず)。
「Beziex Pcc (C++)」ではスピンコントロールを使っているので、C# 版でも使用したい。そのためこの部分は「Windowsフォーム」で代用することにした (v0.5.3a までは、サードパーティ製のWPF拡張である「Extended WPF Toolkit」を使用)。

5) DirectX(Direct3D)
PC で 3D を表示させる際には、OpenGL もしくは DirectX の技術を用いることが多い。開発環境として C# を採用し、その上で 3D表示を行う場合は通常、「WPF の3D機能」「C# 用 DirectX」「XNA」「C# 用 OpenGL」のいずれかを使用する。このうち「WPF の3D機能」「C# 用 DirectX」「XNA」は DirectX系 、「C# 用 OpenGL」は OpenGL系である。
その中で「C# 用 DirectX」は選択肢が一番多く、Microsoft が提供する「Managed DirectX」やサードパーティ製などが存在する。

6) SlimDX
サードパーティ製「C# 用 DirectX」では、「SlimDX」と「SharpDX」が有名である。Beziex Pcc C# ではこのうち「SlimDX」を使用している。なお「Managed DirectX」は既に開発が中止されているので、使わないことにする。

7) Json.NET
Beziex Pcc C# では、Debug用に任意の直線/点を追加して表示出来るようになっている(ただし条件有り)。そしてこの情報の追加は、JSON形式で記述されたファイルによって行う(詳細は後述)。
Json.NET は、このJSON書式を解釈するために用いている。


5-3. 開発/実行環境のダウンロード

5-3-1. Microsoft Visual Studio Community 2015

Beziex Pcc C# は
Microsoft Visual Studio Community 2015 - 日本語版
を用いてビルドを行なった。このツールは無料でダウンロード可能である。
なお有料版 Visual Studio 2015 ではビルドをしたことは無いので、各自で試してもらいたい。ちなみに Community 版のダウンロード先は、
https://www.visualstudio.com/ja-jp/products/visual-studio-community-vs.aspx
である。このページの「Community 2015 のダウンロード」をクリックし、ダウンロードすればよい。

なお Beziex Pcc C# は、Visual Studio だけを用意してもビルドできない。以下の3種類のライブラリを追加ダウンロードする必要がある(有料版 Visual Studio 2015 には、DirectX SDK の方は入っている可能性があるが)。


5-3-2. June 2010 DirectX SDK

「DirectX SDK」は以下のサイト
http://www.microsoft.com/en-us/download/details.aspx?id=6812
からダウンロードすればよい(英文)。「DXSDK_Jun10.exe」というファイルが
赤い「DOWNLOAD」ボタン
から取得出来るので、ここからダウンロードする。
なお「DirectX SDK」をダウンロードする際は、下記の「SlimDX SDK」に対応しているものをダウンロードすること。ちなみに「June 2010 DirectX SDK」には、
SlimDX SDK (January 2012).msi
SlimDX SDK (September 2011).msi
SlimDX SDK (March 2011).exe
SlimDX SDK (June 2010).exe
が対応している。
すなわち「DirectX SDK」のバージョンの中で、SlimDX SDK に対応しているものを選ばなければならない。


5-3-3. SlimDX SDK (January 2012)

最新の「SlimDX SDK」は以下のサイト
http://code.google.com/p/slimdx/
からダウンロードすればよい。「Featured」→「Downloads」の項に
「SlimDX SDK (???? ????).msi」のリンク
が存在するので、ここからダウンロードする。ちなみに「(???? ????)」の部分には、DirectX SDK と同じく "リリース年 & 月" が記述されており、(January 2012) のようになっている。
なお過去の「SlimDX SDK」は
http://slimdx.org/releases.php
からダウンロードする。ここに「Beziex Pcc C# で使用している日付の SlimDX SDK」のリンクがあるはずなので、それをクリックする。そして "Developer SDK" の項に
「Install Developer SDK」ボタン
があるので、それを押してダウンロードすればよい。
ちなみに Beziex Pcc C# では、「SlimDX SDK (January 2012).msi」を用いてビルドした。


5-3-4. Json.NET 6.0.8

「Json.NET 6.0.8」は以下のサイト
https://github.com/JamesNK/Newtonsoft.Json/releases/tag/6.0.8
の「Json60r8.zip」をダウンロードし、保存しておく。


5-4. ビルド

開発/実行環境のインストールが終わったら、本ページ下部にある「ダウンロード」リンクから「Beziex Pcc C#」のダウンロードを行う。そしてその後、以下の操作を実行すること。


5-4-1. Json.NET のコピー

最初のビルドの前に、一度だけ下記の操作を行うこと。

・  "Beziex_Pcs\DLL\JsonNET" 内に、「Json60r8.zip」の中身(Binフォルダ、Sourceフォルダ、license.txt、readme.txt)をコピー。


5-4-2. 「BxPcsSDK」のビルド

1)  以下のslnファイルをダブルクリックする。
Beziex_Pcs\BxPcsSDK\BxPcs_SDK.sln

2)  「スタートアップ プロジェクト」を「BxPcs_SDK」にする。

3)  「ソリューション プラットフォーム」が「x86」であることを確認。

4)  「ソリューション構成」を
Release
Debug
にして、それぞれビルドする。


5-4-3. 「BxPcsWpfWithSdx」のビルド

1)  以下のslnファイルをダブルクリックする。
Beziex_Pcs\BxPcsWpfWithSdx\BxPcs_WpfWithSdx.sln

2)  「スタートアップ プロジェクト」を「BxPcs_WpfWithSdx」にする。

3)  「ソリューション プラットフォーム」が「x86」であることを確認。

4)  以下のサードパーティ製ライブラリ
DirectX
SlimDX
のインストール先やバージョンによっては、
Visual C# から「サードパーティ製ライブラリ」がうまく見つけられない
場合も有り得る。その時は、プロジェクトファイル
BxPcsSdx
BxPcsWpfSdxSub
の「参照設定」内にある
SlimDX
を入れ替え、正常に参照できるようにしなければならない。なお入れ替えるファイルは、「SlimDX」を右クリック→「プロパティ」によって開かれるダイアログ内の「パス」を参考にすると良い。

5)  「ソリューション構成」が「Release」であることを確認し、ビルドを行う。

6)  以下のslnファイルも同様に行う。
Beziex_Pcs\BxPcsWpfWithSdx\BxPcs_WpfWithSdx_D.sln


6. BxPcs_WpfWithSdx.exe の使い方

BxPcs_WpfWithSdx.exe の使用方法は、以下の通りである。


6-1. 「全般」タブ

6-1-1. サンプル・オブジェクト

1) リストボックス
サンプルの中から表示したい形状を選択する。

2) 「サンプル表示」ボタン
通常はディセーブルであるが、後述する「カスタム・オブジェクト」の読み込みを行うとイネーブルになる。その時点でこのボタンを押すと、リストボックスのサンプルが表示される。


6-1-2. カスタム・オブジェクト

1) 「読み込み」ボタン
「pachesファイル」「cageファイル」の読み込みを行う。なおダウンロードファイルに添付されているカスタム・オブジェクト(ファイル)は、
Beziex_Pcs\_demo\mikuA.patches
のみである(cageファイルは無し)。

2) 「書き出し」ボタン
「pachesファイル」の書き出しを行う。


6-1-3. 表示種別

注: 「面モード」(後述)では、表示種別は無視される。

1) 「シェーディング」ラジオボタン
形状をシェーディング表示にする。

2) 「シェーディング+境界曲線」ラジオボタン
形状をシェーディングおよび境界曲線(ワイヤー)で表示する。なお境界曲線の色は青または黄となるが、この詳細については "3) 「ワイヤーフレーム」ラジオボタン" で説明する。

3) 「ワイヤーフレーム」ラジオボタン
形状をワイヤーフレーム表示にする。なおポリゴンの辺の色は、以下のような意味を持つ。

青: ケージから変換された曲面の境界曲線であり、且つ境界が折れ曲がっているか、片方に面が無い場合
黄: ケージから変換された曲面の境界曲線であり、且つ境界が滑らかに繋がっている場合
赤: 境界曲線では無いポリゴン辺

ちなみに「境界を折れ曲げる」ためには、「"BxPcsSDK"のAPIをコールしているプログラム」(例:BxPcsWpfWithSdx)上から、(BxPcsSDKに対し)明示的に設定してやれば良い。しかし「境界が折れ曲げる」のはそれだけでは無く、「BxPcsSDK」内部で "滑らかに繋げたまま曲面化するのは困難" と判断された時も、自動的に「折れ曲がった」状態に設定されることになる。

4) 「すべて3角形にする」チェックボックス
ON にすると、ワイヤーフレーム表示時に "ワイヤーフレームで囲まれた図形(ポリゴン)" がすべて3角形になる。


6-1-4. 「ケージを表示」チェックボックス

ON にすると、ケージ(Catmull-Clark サブディビジョンの元ポリゴン)を表示する。なおケージの色は、以下のような意味を持つ。
緑: 境界が折れ曲がっているか、片方に面が無い場合
白: 境界が滑らかに繋がっている場合


6-1-5. 表示モード

1) 「全体モード」ラジオボタン
このラジオボタンをONにすると、形状全体を表示する。

2) 「面モード(選択前)」 & 「面モード」
「面モード(選択前)」ラジオボタンをONすると、表示種別に関わらず「シェーディング+境界曲線」となる。ここで "形状のどれかの面(境界曲線で囲まれた内部)" をクリックすると、ラジオボタンが「面モード」に変わり、その面だけが表示されるようになる。

3) 「ワイヤーも表示」チェックボックス
ON にすると、「面モード」のとき(「選択前」では無い)にワイヤーフレームも表示する。このワイヤーフレームは通常 黄色であるが、境界曲線No.0 (プログラム内部で使用)の箇所だけは青で表示される。またさらに頂点No.0 (これもプログラム内部で使用)の箇所には、小さな正八面体を表示する。

4) 「再選択」ボタン
「面モード」のとき(「選択前」では無い)、有効となるボタンである。このボタンをクリックすると、「面モード」 → 「面モード(選択前)」になる。これにより形状全体が表示される状態に戻り、再び面が選択できるようになる。

5) 「選択面No.」表示欄
「面モード」のとき(「選択前」では無い)、選択された面の番号が表示される。この番号は通常 Beziex Pcc C# のプログラム内でのみで使われている。しかし(この面No.を)「Debug用JSONファイル」内に記述することで、その選択面(のみ)が表示された場合に「追加の直線/点」も表示されるようになる。


6-1-6. 分割数

1) 「初期分割数」ボタン
各オブジェクトのデフォルト分割数に戻す。なおこのデフォルト分割数は、各オブジェクトの頂点数によって決まる。

2) スライダ&スピンコントロール
オブジェクトの分割数に変更する。ちなみに最大分割数は、各オブジェクトの頂点数によって決まっており、頂点数がごく少ない場合は 64 である。


6-2. 「回転等」タブ

6-2-1. 「回転」

1) 「横スライダ」
Y軸(縦軸)まわりに回転させる。動かすと「縦スライダ」、「Z軸回転」スライダは中心位置に戻る。

2) 「縦スライダ」
X軸(横軸)まわりに回転させる。動かすと「横スライダ」、「Z軸回転」スライダは中心位置に戻る。

3) 「Z軸回転」スライダ
Z軸(中心軸)まわりに回転させる。動かすと「縦スライダ」、「横スライダ」は中心位置に戻る。

4) 「初期方向」ボタン
最初の向きに戻す。


6-2-2. 「移動」

1) 「横スライダ」
X方向(横方向)に移動する。

2) 「縦スライダ」
Y方向(縦方向)に移動する。

3) 「初期位置」ボタン
最初の位置に戻す。


6-2-3. 「スケール」

1) 「スライダ」
拡大縮小を行なう。

2) 「初期スケール」ボタン
最初の大きさに戻す。


6-3. Debug用JSONファイル

6-3-1. 概要

Beziex Pcc C# では、以下のような条件の時に追加の直線/点を表示することが出来る。
a)  「カスタム・オブジェクト」に対してのみ可能。
b)  例えばカスタム・オブジェクトのファイルが "abc.patches" だった場合、JSONファイルは同フォルダ内に "abc.patches.json" という名前で置く。
c)  「面モード」のとき(「選択前」では無い)のみ、追加の直線/点が表示される。ただしファイル内に記述した面No.以外の時は表示されない。

またファイルの中身は、下記のように記述する。
{
    "surfaceNo" : 123,
    "data" : [
        [ "point",  1.0, 2.0, 3.0 ],
        [ "line",   1.0, 2.0, 3.0, 4.0, 5.0, 6.0 ],
        [ "vector", 1.0, 2.0, 3.0, 1.0, 2.0, 3.0 ]
    ]
}

6-3-2. 各要素の説明

1) "surfaceNo"
選択面No.を記述する(必須)。

2) "data"
追加する直線/点の情報を記述する。最低限 "point"、"line"、"vector" のどれか一つは記述すること。また各 "point"、"line"、"vector" は複数記述しても良い。

2-1) "point"
"point" から始まる配列リテラル。"point" の後に、x、y、z 値を記述する。

2-2) "line"
"line" から始まる配列リテラル。"line" の後に、x0、y0、z0、x1、y1、z1 の値を記述する。これにより、(x0, y0, z0)と(x1, y1, z1)を結ぶ直線が表示できる。

2-2) "vector"
"vector" から始まる配列リテラル。"vector" の後に、xp、yp、zp、xv、yv、zv の値を記述する。これにより、点(xp, yp, zp)からベクトル(xv, yv, zv)が延びた形の直線が表示できる。


7. 履歴

7-1. 履歴 (プログラム)

2013/09/20
v0.5.1 プレリリース。

2013/10/07
v0.5.1c バグをいくつか修正。

2013/10/09
v0.5.1d バグをいくつか修正。

2013/10/14
v0.5.1e バグをいくつか修正。

2013/12/28
v0.5.1f ライセンスを変更。

2014/09/13
v0.5.2 ソースコードを少し整理した (表示&操作等は変更無し)。

2014/09/21
v0.5.2a ワイヤーフレーム関連のデータ構造を変更。

2014/09/28
v0.5.2b ワイヤーフレームの複数色およびオール3角形の表示を復活。また分割数が 1 または 2 の場合も複数色になるようにした。

2014/10/13
v0.5.2c ワイヤーフレーム表示時に「すべて3角形にする」か否かを選択出来るようにした。

2014/11/09
v0.5.2d 表示種別に「シェーディング+境界曲線」を追加。

2014/11/24
v0.5.3 「表示モード」を追加。

2015/01/31
v0.5.3a 表示モードに「ワイヤーも表示」チェックボックスを追加。

2015/05/09
v0.5.4 「Extended WPF Toolkit」を使わないようにした。スピンコントロールは「Windowsフォーム」で代用。

2015/08/16
v0.5.5 「Debug用JSONファイル」機能を追加。

2015/08/17
v0.5.5a バグをいくつか修正。

2015/09/23
v0.5.5b バグをいくつか修正。

2015/11/23
v0.5.5c 開発環境を Visual Studio Community 2015 に更新。

2016/05/07
v0.5.5d Windows10で、「テキスト、アプリ、その他の項目のサイズを変更する」が100%以外の場合にも対応。


7-2. 履歴 (BxPccSDK テクニカルガイド)

2013/07/02
v0.5.1 初版。

2013/07/04
v0.5.1a 誤字を修正。

2013/07/11
v0.5.1b 『6-5-3. 頂点上の微分値の向きの補正』『6-6-3. 「ソース境界横断導関数」の補正』に追記。

2014/08/31
v0.5.1c 『9. N 角ケージポリゴンの改良』を追記。


8. ライセンス

8-1. 「BxPcsSDK」のライセンス

「BxPcsSDK」のライセンスは LGPL である。


8-2. 「BxPcsWpfWithSdx」のライセンス

「BxPcsWpfWithSdx」のライセンスは「二条項BSDライセンス (2-clause BSD license)」である。


9. ダウンロード



[参考]  ダウンロードファイルは "ZIP形式" でアーカイブされている。これをNTFSフォーマットのディスクにダウンロードした場合は、まず最初にZIPファイルを右クリックして「プロパティ」メニューを選択し、「プロパティ」ダイアログを表示させる。そしてダイアログの「全般」タブ内の「ブロックの解除」ボタンをクリックすると良い(その後、「OK」もしくは「適用」ボタンをクリックすること)。
これにより "ZIP解凍時" や "一番最初にslnファイルを開く時" に余計なメッセージが出なくなるので、わずらわしさが減ることになる。
なおFAT32フォーマットのディスクにダウンロードした場合は、この操作は不要である。




(C)1999-2016 EISHIN, All Rights Reserved.