FineKernelToolKit 4.2.13
読み取り中…
検索中…
一致する文字列を見つけられません
公開メンバ関数 | 静的公開変数類 | 全メンバ一覧
FK::fk_Light クラス

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

#include <FK/Light.h>

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

公開メンバ関数

 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::fk_Shape に属する継承公開メンバ関数
 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::fk_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::fk_BaseObject に属する継承公開メンバ関数
 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_Shape, fk_Model

構築子と解体子

◆ fk_Light()

FK::fk_Light::fk_Light ( fk_LightType  type = fk_LightType::PARALLEL)

コンストラクタ

引数で光源タイプを指定できます。 省略した場合、平行光源となります。

引数
[in]type光源タイプ

◆ ~fk_Light()

virtual FK::fk_Light::~fk_Light ( )
virtual

デストラクタ

関数詳解

◆ setLightType()

void FK::fk_Light::setLightType ( fk_LightType  type)

光源タイプ設定関数

光源のタイプを設定します。

引数
[in]type光源タイプ

◆ getLightType()

fk_LightType FK::fk_Light::getLightType ( void  )

光源タイプ取得関数

現在の光源タイプを取得します。

戻り値
光源タイプ

◆ setAttenuation()

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_q2次減衰係数
[in]k_c一定減衰係数
参照
setSpotExponent()

◆ setSpotCutOff()

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スポットライト効果範囲角度
参照
setSpotExponent()

◆ setSpotExponent()

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スポットライト減衰指数
参照
setSpotCutOff(), setAttenuation()

◆ getAttenuation()

double FK::fk_Light::getAttenuation ( int  num)

減衰係数参照関数

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

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

◆ getSpotCutOff()

double FK::fk_Light::getSpotCutOff ( void  )

スポットライト効果範囲角度参照関数

スポットライト光源における、 光が放射される角度 \(\theta\) を取得します。 単位は弧度法(ラジアン)となります。

戻り値
効果範囲角度
参照
setSpotCutOff()

◆ getSpotExponent()

double FK::fk_Light::getSpotExponent ( void  )

スポットライト減衰指数参照関数

スポットライト光源における、 光源方向からの減衰の度合い指数を参照します。

戻り値
減衰度合い指数
参照
setSpotExponent()

メンバ詳解

◆ MAXLIGHTNUM

const int FK::fk_Light::MAXLIGHTNUM
static

光源最大数定数