FineKernelToolKit 4.2.13
|
光源を管理するクラス [詳解]
#include <FK/Light.h>
公開メンバ関数 | |
fk_Light (fk_LightType type=fk_LightType::PARALLEL) | |
コンストラクタ | |
virtual | ~fk_Light () |
デストラクタ | |
void | setLightType (fk_LightType type) |
光源タイプ設定関数 | |
fk_LightType | getLightType (void) |
光源タイプ取得関数 | |
void | setAttenuation (double k_l, double k_q, double k_c=1.0) |
減衰係数設定関数 | |
void | setSpotCutOff (double theta) |
スポットライト効果範囲角度設定関数 | |
void | setSpotExponent (double alpha) |
スポットライト減衰指数設定関数 | |
double | getAttenuation (int num) |
減衰係数参照関数 | |
double | getSpotCutOff (void) |
スポットライト効果範囲角度参照関数 | |
double | getSpotExponent (void) |
スポットライト減衰指数参照関数 | |
![]() | |
fk_Shape (fk_Type=fk_Type::SHAPE) | |
コンストラクタ | |
virtual | ~fk_Shape () |
デストラクタ | |
fk_RealShapeType | getRealShapeType (void) |
形状データ構造取得関数 | |
void | setShaderAttribute (std::string name, int dim, std::vector< int > *array, bool self=false) |
シェーダー内 attribute 変数設定関数1 | |
void | setShaderAttribute (std::string name, int dim, std::vector< float > *array, bool self=false) |
シェーダー内 attribute 変数設定関数2 | |
void | setShaderAttribute (std::string name, int dim, std::vector< fk_Vector > *array) |
シェーダー内 attribute 変数設定関数3 | |
void | setShaderAttribute (std::string name, int dim, std::vector< fk_TexCoord > *array) |
シェーダー内 attribute 変数設定関数4 | |
void | setShaderAttribute (std::string name, int dim, std::vector< fk_HVector > *array) |
シェーダー内 attribute 変数設定関数5 | |
void | modifyAttribute (std::string name) |
attribute 変数更新関数 | |
![]() | |
fk_Attribute (void) | |
コンストラクタ | |
virtual | ~fk_Attribute () |
デストラクタ | |
bool | setAttrII (const int key, const int value) |
キーが int 型、値が int 型である属性設定関数 | |
bool | setAttrID (const int key, const double value) |
キーが int 型、値が double 型である属性設定関数 | |
bool | setAttrIS (const int key, const std::string value) |
キーが int 型、値が std::string 型である属性設定関数 | |
bool | setAttrSI (const std::string key, const int value) |
キーが std::string 型、値が int 型である属性設定関数 | |
bool | setAttrSD (const std::string key, const double value) |
キーが std::string 型、値が double 型である属性設定関数 | |
bool | setAttrSS (const std::string key, const std::string value) |
キーが std::string 型、値が std::string 型である属性設定関数 | |
int | getAttrII (const int key) const |
キーが int 型、値が int 型である属性参照関数 | |
double | getAttrID (const int key) const |
キーが int 型、値が double 型である属性参照関数 | |
std::string | getAttrIS (const int key) const |
キーが int 型、値が std::string 型である属性参照関数 | |
int | getAttrSI (const std::string key) const |
キーが std::string 型、値が int 型である属性参照関数 | |
double | getAttrSD (const std::string key) const |
キーが std::string 型、値が double 型である属性参照関数 | |
std::string | getAttrSS (const std::string key) const |
キーが std::string 型、値が std::string 型である属性参照関数 | |
bool | existAttrII (const int key) const |
キーが int 型、値が int 型である属性存在参照関数 | |
bool | existAttrID (const int key) const |
キーが int 型、値が double 型である属性存在参照関数 | |
bool | existAttrIS (const int key) const |
キーが int 型、値が std::string 型である属性存在参照関数 | |
bool | existAttrSI (const std::string key) const |
キーが std::string 型、値が int 型である属性存在参照関数 | |
bool | existAttrSD (const std::string key) const |
キーが std::string 型、値が double 型である属性存在参照関数 | |
bool | existAttrSS (const std::string key) const |
キーが std::string 型、値が std::string 型である属性存在参照関数 | |
bool | deleteAttrII (const int key) |
キーが int 型、値が int 型である属性消去関数 | |
bool | deleteAttrID (const int key) |
キーが int 型、値が double 型である属性消去関数 | |
bool | deleteAttrIS (const int key) |
キーが int 型、値が std::string 型である属性消去関数 | |
bool | deleteAttrSI (const std::string key) |
キーが std::string 型、値が int 型である属性消去関数 | |
bool | deleteAttrSD (const std::string key) |
キーが std::string 型、値が double 型である属性消去関数 | |
bool | deleteAttrSS (const std::string key) |
キーが std::string 型、値が std::string 型である属性消去関数 | |
![]() | |
fk_BaseObject (fk_Type type=fk_Type::BASEOBJECT) | |
コンストラクタ | |
fk_Type | getObjectType (void) const |
タイプ取得関数 | |
静的公開変数類 | |
static const int | MAXLIGHTNUM |
光源最大数定数 | |
光源を管理するクラス
このクラスは、光源を制御する機能を提供します。 FK における光源の位置づけは、形状と同様に fk_Model に登録を行い、 位置や方向の制御は fk_Model の機能を用いるようになっています。 シーンへの登録についても、他の形状クラスと同様です。
表現できる光源は「平行光源」、「点光源」、「スポットライト」の3種類です。 一般的に、平行光源が最も処理が速く、 点光源、スポットライトの順で処理時間がかかるようになります。 また、シーン内の光源数は最高で 8 個までという制限があります。 一般的には、光源を多く設置すると各光源の光量自体は減少していくため、 シーン全体が明るくなるわけではありません。 光源の設置は最低限に留め、 マテリアル設定など別の方法で明るさを調整すべきです。
「平行光源」とは、空間中のあらゆる場所に対して同一方向から照らされる光源のことです。 最も扱いやすく、処理速度も速いため、 点光源やスポットライトを用いる積極的な理由がないのであれば平行光源を利用すべきです。
「点光源」は空間中のある1点から発光する光源のことです。 点光源は属性として減衰係数を保持しており、 距離によって光量が減衰していく効果が可能です。 詳細は setAttenuation() を参照して下さい。 なお、この光源はあくまで面の発色輝度を計算するためのものであるため、 光源位置を注視するように設定しても光り輝く発色体た表示されるわけではありません。
「スポットライト」は特殊な点光源であり、光線方向に指向性があります。 特定のベクトルに近いほど光量が強く、方向がずれるほど光量が少なくなります。 詳しくは setSpotExponent() および setSpotCutOff() を参照して下さい。
FK::fk_Light::fk_Light | ( | fk_LightType | type = fk_LightType::PARALLEL | ) |
コンストラクタ
引数で光源タイプを指定できます。 省略した場合、平行光源となります。
[in] | type | 光源タイプ |
|
virtual |
デストラクタ
void FK::fk_Light::setLightType | ( | fk_LightType | type | ) |
光源タイプ設定関数
光源のタイプを設定します。
[in] | type | 光源タイプ |
fk_LightType FK::fk_Light::getLightType | ( | void | ) |
光源タイプ取得関数
現在の光源タイプを取得します。
void FK::fk_Light::setAttenuation | ( | double | k_l, |
double | k_q, | ||
double | k_c = 1.0 |
||
) |
減衰係数設定関数
点光源やスポットライトにおける、 距離による減衰関数の係数を設定します。 距離 \(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::fk_Light::setSpotCutOff | ( | double | theta | ) |
スポットライト効果範囲角度設定関数
スポットライト光源における、 光が放射される角度 \(\theta\) を設定します。 単位は弧度法(ラジアン)となります。
厳密には、光源位置を \( \mathbf{P} \)、 光線方向を \(\mathbf{L}\)、 照射対象物体位置を \(\mathbf{Q}\) としたとき、 以下の数式を満たすのであればスポットライトで照射されることになります。
\[ \cos\theta \geq \frac{(\mathbf{Q} - \mathbf{P})\cdot\mathbf{L}} {|(\mathbf{Q} - \mathbf{P})\cdot\mathbf{L}|} \]
なお、デフォルトでは \(\theta\)は \(\frac{\pi}{16}\) に設定されています。
[in] | theta | スポットライト効果範囲角度 |
void FK::fk_Light::setSpotExponent | ( | double | alpha | ) |
スポットライト減衰指数設定関数
スポットライト光源における、 光源方向からの減衰の度合いを指数 \(\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 でなかったとしても、 setSpotCutOff() 関数で設定した照射範囲から外れてしまっている場合は、 光源からの照射光量は 0 となります。つまり、本関数による影響よりも setSpotCutOff() 関数による照射範囲の方が優先されることになりますので、 設定には注意が必要です。 また、この減衰効果は setAttenuation() 関数による減衰効果 \( f(d) \) と合わせて行われます。 つまり、実際の減衰量は \( f(d)\cdot g(\alpha) \) となります。
[in] | alpha | スポットライト減衰指数 |
double FK::fk_Light::getAttenuation | ( | int | num | ) |
減衰係数参照関数
距離による減衰関数の係数を参照します。
[in] | num | どの減衰係数を得るかを整数値で指定します。
|
double FK::fk_Light::getSpotCutOff | ( | void | ) |
スポットライト効果範囲角度参照関数
スポットライト光源における、 光が放射される角度 \(\theta\) を取得します。 単位は弧度法(ラジアン)となります。
double FK::fk_Light::getSpotExponent | ( | void | ) |
|
static |
光源最大数定数