FineKernelToolKit  3.1.0
公開メンバ関数 | プロパティ | 全メンバ一覧
FK_CLI::fk_Light クラス

光源を管理するクラス [詳解]

+ FK_CLI::fk_Light の継承関係図
+ FK_CLI::fk_Light 連携図

公開メンバ関数

 fk_Light ()
 コンストラクタ [詳解]
 
 ~fk_Light ()
 デストラクタ [詳解]
 
 !fk_Light ()
 ファイナライザ [詳解]
 
void SetAttenuation (double k_l, double k_q, double k_c)
 減衰係数設定メソッド1 [詳解]
 
void SetAttenuation (double k_l, double k_q)
 減衰係数設定メソッド2 [詳解]
 
double GetAttenuation (int num)
 減衰係数参照メソッド [詳解]
 
- 基底クラス FK_CLI::fk_Shape に属する継承公開メンバ関数
void ClearMaterial (void)
 パレット初期化メソッド [詳解]
 
void PushPalette (fk_Material^ mat)
 マテリアル追加メソッド [詳解]
 
void SetPalette (fk_Material^ mat, int ID)
 マテリアル設定メソッド [詳解]
 
fk_MaterialGetMaterial (int ID)
 マテリアル取得メソッド [詳解]
 
- 基底クラス FK_CLI::fk_Attribute に属する継承公開メンバ関数
bool SetAttrII (int key, int value)
 キーが int 型、値が int 型である属性設定メソッド [詳解]
 
bool SetAttrID (int key, double value)
 キーが int 型、値が double 型である属性設定メソッド [詳解]
 
bool SetAttrIS (int key, String^ value)
 キーが int 型、値が String 型である属性設定メソッド [詳解]
 
bool SetAttrSI (String^ key, int value)
 キーが String 型、値が int 型である属性設定メソッド [詳解]
 
bool SetAttrSD (String^ key, double value)
 キーが String 型、値が double 型である属性設定メソッド [詳解]
 
bool SetAttrSS (String^ key, String^ value)
 キーが String 型、値が String 型である属性設定メソッド [詳解]
 
int GetAttrII (int key)
 キーが int 型、値が int 型である属性参照メソッド [詳解]
 
double GetAttrID (int key)
 キーが int 型、値が double 型である属性参照メソッド [詳解]
 
String^ GetAttrIS (int key)
 キーが int 型、値が String 型である属性参照メソッド [詳解]
 
int GetAttrSI (String^ key)
 キーが String 型、値が int 型である属性参照メソッド [詳解]
 
double GetAttrSD (String^ key)
 キーが String 型、値が double 型である属性参照メソッド [詳解]
 
String^ GetAttrSS (String^ key)
 キーが String 型、値が String 型である属性参照メソッド [詳解]
 
bool ExistAttrII (int key)
 キーが int 型、値が int 型である属性存在参照メソッド [詳解]
 
bool ExistAttrID (int key)
 キーが int 型、値が double 型である属性存在参照メソッド [詳解]
 
bool ExistAttrIS (int key)
 キーが int 型、値が String 型である属性存在参照メソッド [詳解]
 
bool ExistAttrSI (String^ key)
 キーが String 型、値が int 型である属性存在参照メソッド [詳解]
 
bool ExistAttrSD (String^ key)
 キーが String 型、値が double 型である属性存在参照メソッド [詳解]
 
bool ExistAttrSS (String^ key)
 キーが String 型、値が String 型である属性存在参照メソッド [詳解]
 
bool DeleteAttrII (int key)
 キーが int 型、値が int 型である属性消去メソッド [詳解]
 
bool DeleteAttrID (int key)
 キーが int 型、値が double 型である属性消去メソッド [詳解]
 
bool DeleteAttrIS (int key)
 キーが int 型、値が String 型である属性消去メソッド [詳解]
 
bool DeleteAttrSI (String^ key)
 キーが String 型、値が int 型である属性消去メソッド [詳解]
 
bool DeleteAttrSD (String^ key)
 キーが String 型、値が double 型である属性消去メソッド [詳解]
 
bool DeleteAttrSS (String^ key)
 キーが String 型、値が String 型である属性消去メソッド [詳解]
 

プロパティ

fk_LightType Type [get, set]
 光源タイププロパティ [詳解]
 
double SpotCutOff [get, set]
 スポットライト効果範囲角度プロパティ [詳解]
 
double SpotExponent [get, set]
 スポットライト減衰指数設定メソッド [詳解]
 
- 基底クラス FK_CLI::fk_Shape に属する継承プロパティ
fk_RealShapeType^  RealShapeType [get]
 形状データ構造プロパティ [詳解]
 
fk_Palette^  Palette [get]
 パレットプロパティ [詳解]
 
fk_MaterialMode MaterialMode [get, set]
 マテリアルモード設定メソッド [詳解]
 
int MaterialID [get, set]
 オブジェクトマテリアル ID プロパティ [詳解]
 
int PaletteSize [get]
 パレット中のマテリアル格納数プロパティ [詳解]
 
cli::array< fk_Material^ >^ MaterialVector [get]
 マテリアル配列取得メソッド [詳解]
 

詳解

光源を管理するクラス

このクラスは、光源を制御する機能を提供します。 FK における光源の位置づけは、形状と同様に fk_Model に登録を行い、 位置や方向の制御は fk_Model の機能を用いるようになっています。 シーンへの登録についても、他の形状クラスと同様です。

表現できる光源は「平行光源」、「点光源」、「スポットライト」の3種類です。 一般的に、平行光源が最も処理が速く、 点光源、スポットライトの順で処理時間がかかるようになります。 また、シーン内の光源数は最高で 8 個までという制限があります。 一般的には、光源を多く設置すると各光源の光量自体は減少していくため、 シーン全体が明るくなるわけではありません。 光源の設置は最低限に留め、 マテリアル設定など別の方法で明るさを調整すべきです。

「平行光源」とは、空間中のあらゆる場所に対して同一方向から照らされる光源のことです。 最も扱いやすく、処理速度も速いため、 点光源やスポットライトを用いる積極的な理由がないのであれば平行光源を利用すべきです。

「点光源」は空間中のある1点から発光する光源のことです。 点光源は属性として減衰係数を保持しており、 距離によって光量が減衰していく効果が可能です。 詳細は SetAttenuation() を参照して下さい。 なお、この光源はあくまで面の発色輝度を計算するためのものであるため、 光源位置を注視するように設定しても光り輝く発色体た表示されるわけではありません。

「スポットライト」は特殊な点光源であり、光線方向に指向性があります。 特定のベクトルに近いほど光量が強く、方向がずれるほど光量が少なくなります。 詳しくは SpotExponent および SpotCutOff を参照して下さい。

参照
fk_Shape, fk_Model

構築子と解体子

FK_CLI::fk_Light::fk_Light ( )

コンストラクタ

FK_CLI::fk_Light::~fk_Light ( )

デストラクタ

FK_CLI::fk_Light::!fk_Light ( )

ファイナライザ

関数詳解

void FK_CLI::fk_Light::SetAttenuation ( double  k_l,
double  k_q,
double  k_c 
)

減衰係数設定メソッド1

点光源やスポットライトにおける、 距離による減衰関数の係数を設定します。 距離 $d$ による減衰関数 $ f(d) $ は以下の式で表されます。

\[ f(d) = \frac{1}{k_l d + k_q d^2 + k_c} \]

ここで、 $k_l$ は線形減衰係数、 $k_q$ は2次減衰係数、 $k_c$ は一定減衰係数と呼ばれます。 デフォルトの状態は $k_l, k_q$ が 0、 $k_c$ が 1 に設定されています。 これは、距離による減衰が一切ない状態を意味します。

現実の物理特性は、点光源光量は距離の2乗に反比例するので、 2次減衰率係数が適していることになりますが、 実際の利用においては点光源の影響が著しく少なくなってしまい、 効果として望ましくない場合もあります。

引数
[in]k_l線形減衰係数
[in]k_q2次減衰係数
[in]k_c一定減衰係数
参照
SpotExponent
void FK_CLI::fk_Light::SetAttenuation ( double  k_l,
double  k_q 
)

減衰係数設定メソッド2

点光源やスポットライトにおける、 距離による減衰関数の係数を設定します。 距離 $d$ による減衰関数 $ f(d) $ は以下の式で表されます。

\[ f(d) = \frac{1}{k_l d + k_q d^2 + 1} \]

ここで、 $k_l$ は線形減衰係数、 $k_q$ は2次減衰係数と呼ばれます。 デフォルトの状態は $k_l, k_q$ が 0 に設定されています。 これは、距離による減衰が一切ない状態を意味します。

現実の物理特性は、点光源光量は距離の2乗に反比例するので、 2次減衰率係数が適していることになりますが、 実際の利用においては点光源の影響が著しく少なくなってしまい、 効果として望ましくない場合もあります。

なお、本メソッドは SetAttenuation(double, double, double) において、 第3引数に 1.0 を入力した場合と同義となります。

引数
[in]k_l線形減衰係数
[in]k_q2次減衰係数
参照
SpotExponent
double FK_CLI::fk_Light::GetAttenuation ( int  num)

減衰係数参照メソッド

距離による減衰関数の係数を参照します。

引数
[in]numどの減衰係数を得るかを整数値で指定します。
  • 0: 線形減衰係数を返します。
  • 1: 2次減衰係数を返します。
  • 2: 一定減衰係数を返します。
  • それ以外: 常に 0 を返します。
戻り値
指定された減衰係数の値
参照
SetAttenuation()

プロパティ詳解

fk_LightType FK_CLI::fk_Light::Type
getset

光源タイププロパティ

光源タイプの参照・設定を行います。

double FK_CLI::fk_Light::SpotCutOff
getset

スポットライト効果範囲角度プロパティ

スポットライト光源における、 光が放射される角度 $\theta$ の参照・設定を行います。 単位は弧度法(ラジアン)となります。

厳密には、光源位置を $ \mathbf{P} $、 光線方向を $\mathbf{L}$、 照射対象物体位置を $\mathbf{Q}$ としたとき、 以下の数式を満たすのであればスポットライトで照射されることになります。

\[ \theta \geq \frac{(\mathbf{Q} - \mathbf{P})\cdot\mathbf{L}} {|(\mathbf{Q} - \mathbf{P})\cdot\mathbf{L}|} \]

なお、デフォルトでは $\theta$$\frac{\pi}{16}$ に設定されています。

参照
SpotExponent
double FK_CLI::fk_Light::SpotExponent
getset

スポットライト減衰指数設定メソッド

スポットライト光源における、 光源方向からの減衰の度合いを指数 $\alpha$ として設定します。

具体的には、 光源位置を $ \mathbf{P} $、 光線方向を $\mathbf{L}$、 照射対象物体位置を $\mathbf{Q}$ としたとき、 減衰関数 $g(\alpha)$ は以下の数式によって表されます。

\[ g(\alpha) = \max\left( \frac{(\mathbf{Q} - \mathbf{P})\cdot\mathbf{L}} {|(\mathbf{Q} - \mathbf{P})\cdot\mathbf{L}|}, \; 0\right)^\alpha \]

このメソッドは、光源から物体への方向ベクトル $ (\mathbf{Q} - \mathbf{P}) $ が 光源の方向ベクトル $ \mathbf{L}\ $ と角度が大きいほど、 減衰関数 $ g(\alpha) $ の値は小さくなっていくことを意味します。 そして、 $ \alpha $ は減衰の度合いを指数として指定することになり、 大きいほど減衰の度合いが強くなります。 $ \alpha $ が 0 であった場合、減衰は起こりません。 デフォルトでは $ \alpha $ は 0 に設定されています。

なお、もし $ g(\alpha) $ が 0 でなかったとしても、 SpotCutOff プロパティで設定した照射範囲から外れてしまっている場合は、 光源からの照射光量は 0 となります。つまり、本プロパティによる影響よりも SpotCutOff プロパティによる照射範囲の方が優先されることになりますので、 設定には注意が必要です。 また、この減衰効果は SetAttenuation() メソッドによる減衰効果 $ f(d) $ と合わせて行われます。 つまり、実際の減衰量は $ f(d)\cdot g(\alpha) $ となります。

参照
SpotCutOff, SetAttenuation()