FineKernelToolKit 4.2.13
読み取り中…
検索中…
一致する文字列を見つけられません
公開メンバ関数 | プロパティ | 全メンバ一覧
FK_CLI::fk_Light クラス

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

#include <CLI/FK_CLI/include/Light_CLI.h>

+ 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 SetShaderAttribute (String^ name, int dim, IEnumerable< int >^ array)
 シェーダー内 attribute 変数設定メソッド1
 
void SetShaderAttribute (String^ name, int dim, IEnumerable< float >^ array)
 シェーダー内 attribute 変数設定メソッド2
 
void SetShaderAttribute (String^ name, int dim, IEnumerable< double >^ array)
 シェーダー内 attribute 変数設定メソッド3
 
void SetShaderAttribute (String^ name, int dim, IEnumerable< fk_Vector^>^ array)
 シェーダー内 attribute 変数設定メソッド4
 
void SetShaderAttribute (String^ name, int dim, IEnumerable< fk_TexCoord^>^ array)
 シェーダー内 attribute 変数設定メソッド5
 
void SetShaderAttribute (String^ name, int dim, IEnumerable< fk_HVector^>^ array)
 シェーダー内 attribute 変数設定メソッド6
 
- 基底クラス 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_RealShapeTypeRealShapeType [get]
 形状データ構造プロパティ
 

詳解

光源を管理するクラス

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

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

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

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

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

参照
fk_Shape, fk_Model

構築子と解体子

◆ fk_Light()

FK_CLI::fk_Light::fk_Light ( )

コンストラクタ

◆ ~fk_Light()

FK_CLI::fk_Light::~fk_Light ( )

デストラクタ

◆ !fk_Light()

FK_CLI::fk_Light::!fk_Light ( )

ファイナライザ

関数詳解

◆ SetAttenuation() [1/2]

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

◆ SetAttenuation() [2/2]

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

◆ GetAttenuation()

double FK_CLI::fk_Light::GetAttenuation ( int  num)

減衰係数参照メソッド

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

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

プロパティ詳解

◆ Type

fk_LightType FK_CLI::fk_Light::Type
getset

光源タイププロパティ

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

◆ SpotCutOff

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

◆ 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()