FineKernelToolKit 4.2.13
|
光源を管理するクラス [詳解]
#include <CLI/FK_CLI/include/Light_CLI.h>
公開メンバ関数 | |
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) |
減衰係数参照メソッド | |
![]() | |
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 | |
![]() | |
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_RealShapeType^ | RealShapeType [get] |
形状データ構造プロパティ | |
光源を管理するクラス
このクラスは、光源を制御する機能を提供します。 FK における光源の位置づけは、形状と同様に fk_Model に登録を行い、 位置や方向の制御は fk_Model の機能を用いるようになっています。 シーンへの登録についても、他の形状クラスと同様です。
表現できる光源は「平行光源」、「点光源」、「スポットライト」の3種類です。 一般的に、平行光源が最も処理が速く、 点光源、スポットライトの順で処理時間がかかるようになります。 また、シーン内の光源数は最高で 8 個までという制限があります。 一般的には、光源を多く設置すると各光源の光量自体は減少していくため、 シーン全体が明るくなるわけではありません。 光源の設置は最低限に留め、 マテリアル設定など別の方法で明るさを調整すべきです。
「平行光源」とは、空間中のあらゆる場所に対して同一方向から照らされる光源のことです。 最も扱いやすく、処理速度も速いため、 点光源やスポットライトを用いる積極的な理由がないのであれば平行光源を利用すべきです。
「点光源」は空間中のある1点から発光する光源のことです。 点光源は属性として減衰係数を保持しており、 距離によって光量が減衰していく効果が可能です。 詳細は SetAttenuation() を参照して下さい。 なお、この光源はあくまで面の発色輝度を計算するためのものであるため、 光源位置を注視するように設定しても光り輝く発色体た表示されるわけではありません。
「スポットライト」は特殊な点光源であり、光線方向に指向性があります。 特定のベクトルに近いほど光量が強く、方向がずれるほど光量が少なくなります。 詳しくは SpotExponent および SpotCutOff を参照して下さい。
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_q | 2次減衰係数 |
[in] | k_c | 一定減衰係数 |
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_q | 2次減衰係数 |
double FK_CLI::fk_Light::GetAttenuation | ( | int | num | ) |
減衰係数参照メソッド
距離による減衰関数の係数を参照します。
[in] | num | どの減衰係数を得るかを整数値で指定します。
|
|
getset |
光源タイププロパティ
光源タイプの参照・設定を行います。
|
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}\) に設定されています。
|
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) \) となります。