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

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


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




マニュアル目次

1章 前知識
2章 新ベジェ境界曲面
3章 プログラムについて
4章 サンプル・アプリケーション
5章 自由曲面関数ライブラリ
6章 bxCore.h
7章 bxDB.h
8章 bxProc.h
9章 数値関数
10章 サンプル・ベースファイル



Copyright 1999-2011 EISHIN

5章 自由曲面関数ライブラリ

1. サンプルのビルド方法

1-1. 基本的なビルド法

サンプル・アプリケーションをビルドするには、次の操作を行う。
1)  BeziexView???フォルダ内のBeziexView.slnをダブルクリック(???にはバージョンNoが入っている)。
2)  「ビルド」メニュー内の「ソリューションのビルド」を選択。


2. ソースファイルの構成

ソースファイルは大きく分類して、
1)  Sampleフォルダ
2)  Beziexフォルダ
に分けて、まとめてある。このうちSampleフォルダにはサンプル・アプリケーション用ソースファイルが入っており、自由曲面関数ライブラリの使用例ということになる。この内容については、各自で解析してもらいたい。
対してBeziexフォルダには、自由曲面関数ライブラリそのものが入っている。これ以降、このフォルダ内についてのみ説明することにする。


3. 関数ライブラリ

自由曲面関数ライブラリの関数は大きく分けて、
1)  メイン関数部
2)  数値関数部
に分類される。
このうちメイン関数部が、自由曲面を作り上げる心臓部で、
Procフォルダ(bxProc.h)
DataBaseフォルダ(bxDB.h)
Coreフォルダ(bxCore.h)
に分かれている(カッコ内は他ソースファイルとのインターフェイスとなるヘッダファイル)。
それに対して数値関数部は、メイン関数が必要とする演算関数(ベクトル関数、三角関数など)を記述しており、
Mathフォルダ(bxMath.h)
Utilフォルダ(bxUtil.h)
に入っている。この数値関数はSampleフォルダのソースコード内でも数多く使用される。


4. メイン関数部

4-1. 概要

メイン関数部内の関数は
1)  Public関数
2)  Protected関数
に分かれている(Procフォルダ内関数はPublic関数のみ)。
この関数ライブラリを使用するプログラマは、一般的に
自分のコード内で、この関数ライブラリのPublic関数を呼び出す
ことによって、プログラムを作成することになる。すなわちSampleフォルダのソースコードもこの関数を呼び出している。
Protected関数については、次々項以降で説明する。


4-2. 階層

メイン関数部は階層に分かれている。そして階層自体も概念別に2種類ある。
1)  関数階層
2)  構造体階層


4-3. 関数階層

関数階層はレベル別に次のようになっている(階層レベル1の方が上位)。
1)  階層レベル1・・・Procフォルダ
2)  階層レベル2・・・DataBaseフォルダ、Coreフォルダ
具体的には、高い階層の関数内で、低階層の関数を呼んでいる。すなわちProcフォルダの関数内で、DataBase、Coreフォルダ内関数をコールしていることになる。ただし数値関数は、どのフォルダ内関数からも使用される。
DataBase、Coreフォルダ内のProtected関数は、Procフォルダ内関数からのみ呼び出せるようになっており、この関数ライブラリ以外では使えないようになっているのである。


4-4. 構造体階層

構造体階層はレベル別に次のようになっている(階層レベル1が最上位)。
1)  階層レベル1・・・Procフォルダ
2)  階層レベル2・・・DataBaseフォルダ
3)  階層レベル3・・・Coreフォルダ
具体的には、高い階層のソースファイル内で、低階層の構造体を使用している。すなわちCoreフォルダが、Proc、DataBaseフォルダの構造体を使うことはない。


4-5. 各フォルダ内関数の役割

1) Coreフォルダ
関数ライブラリの中核であり、新ベジェ境界曲面の演算関数が集約されている。この中の関数には最小限、演算を行うのに必要なデータのみを渡すようになっている。すなわちサーフェイス全体のデータ構造がどのようになっていようが、全体のデータから必要なデータのみを取り出せば、関数を実行できる。

2) DataBaseフォルダ
サーフェイス全体のデータ構造を定義し、データ配列自体を管理している部分である。またCoreフォルダ内関数にデータを渡せるように、Coreフォルダ内関数用データに変換する関数も備えている。

3) Procフォルダ
Coreフォルダ内関数とDataBaseフォルダ内関数を結合し、それを外部のソースコードに呼び出される関数として定義している部分である。Core、DataBaseフォルダ内に少数あるPublic関数を除けば、このProcフォルダ内関数が外部のソースコードとのやり取りをすることになる。


5. 関数ライブラリの改造

5-1. ソースコードの公開について

関数ライブラリのうち、数値関数部はすべてソースコード公開している。またメイン関数部は、
1)  公開 ・・・Procフォルダ、DataBaseフォルダ
2)  非公開・・・Coreフォルダ
となっている。ただしCoreフォルダ内のbxCore.hは公開されているので、これによって他のソースファイルから呼び出すことが可能である。

2011/05/15 :  今まで非公開だったソースコードも公開しました。


5-2. 数値関数部の改造

数値関数部は、出力結果がまったく同じになる場合を除き、原則として改造してはならない(関数の追加はしてもよい)。これは、非公開であるCoreフォルダ内関数からも呼び出されるためで、数値関数部の改造に合わせてCoreフォルダ内関数を改造する、ということができないからである。


5-3. メイン関数部の改造

サーフェイス全体のデータのような3Dソフト全体に影響を及ぼすデータは、その3Dソフトの顔である。このようなデータの構造が、そのソフトから呼び出される関数ごときによって無理矢理定義されてはかなわない、とプログラマなら誰でも思うであろう。この関数ライブラリも、これを使っている3Dソフト内のコードから呼ばれるものであるから、サーフェイス全体のデータ構造を固定化してはいけない。
こういった理由から、当関数ライブラリでは、DataBaseフォルダ内ソースコードを公開することにした。プログラマは、DataBaseフォルダ内ソースコードを解析し、Coreフォルダ内関数用データに変換する関数を自作すれば、
オリジナルのデータベースからCoreフォルダ内関数を呼び出す
といったことが可能になるのである。


6. 関数ライブラリ利用レベル

前項までで述べた通り、当関数ライブラリは一種のコンポーネント構造になっている。よってプログラマは3種類のレベルから場合に応じて、この関数ライブラリを使用できる。

1) 利用レベル1
Procフォルダ内関数と、少数のCore、DataBaseフォルダ内Public関数を利用して、3Dソフトを作る。

2) 利用レベル2
データベースはオリジナルとするが、現DataBaseフォルダ内のPublic関数やProtected関数の関数名、引数の構造と互換性を持たせる(関数の中身は当然異なる)。これによりProcフォルダ内関数は改造する必要がなくなり、また外部の(この関数ライブラリを利用する)プログラムへの影響も少なくなる。

3) 利用レベル3
Coreフォルダ内関数のみを使う。データベースはオリジナルで、Coreフォルダ内関数用データに変換する関数は自作する。


7. データ型のルール

1) 位置座標、ベクトル(例: double pos[ 3 ])
pos[ i ]とした場合、
i=0の時、x
i=1の時、y
i=2の時、z
となる。

2) パラメータ値(例: double uv[ 2 ])
uv[ i ]とした場合、
i=0の時、u
i=1の時、v
となる。

3) ループ頂点/非ループ頂点(例: bool loopFlag)
ループ頂点の時、真となる。

4) 頂点平面(例: double axis[ 2 ][ 3 ])
axis[ i ][ j ]とした場合、
i=0の時、メイン軸
i=1の時、サブ軸
となる。また j はベクトルである。

5) ハンドル(例: double handle[ 2 ])
handle[ i ]とした場合、
i=0の時、メイン軸からの角度
i=1の時、頂点間距離に対する長さ比率
となる。

6) ハンドル点平面(例: double axis[ 2 ][ 3 ])
axis[ i ][ j ]とした場合、
i=0の時、メイン軸(コントロールバーベース値)
i=1の時、サブ軸(ハンドル点法線を軸として、メイン軸を90°回転したもの)
となる。また j はベクトルである。

7) コントロールバー「単一曲面の1頂点上」(例: double ctl[ 2 ])
ctl[ i ]とした場合、
i=0の時、コントロールバーベース値との角度
i=1の時、コントロールバーベース値との長さ比率
となる。

8) コントロールバー「共有頂点内の基準ハンドル上」
(例: double ctl[ 2 ][ 2 ])
ctl[ i ][ j ]とした場合、
i は、コントロールバー番号(共有頂点内の基準ハンドル上)
j は、5)に準拠
となる。

9) ウイングハンドル(例: wing[ 2 ][ 2 ])
wing[ i ][ j ]とした場合、
i は、ウイングハンドル番号(共有頂点内の基準ハンドル上)
j は、4)に準拠
となる。

10) ウイング頂点との頂点間距離(例: len[ 2 ])
len[ i ]とした場合、
i は、ウイングハンドル番号(共有頂点内の基準ハンドル上)
となる。

11) ベジェ曲線(例: double bezier[ 4 ][ 3 ])
bezier[ i ][ j ]とした場合、
i は、ベジェ制御点
j は、ベクトル
となる。





(C)1999-2012 EISHIN All Rights Reserved.