ライト関数
|
宣言 | int SetUseLighting( int Flag ) ;
|
概略 | ライティング計算処理を使用するかどうかを設定する
|
引数 |
int Flag : ライティング計算処理を使用するかどうか( TRUE:使用する FALSE:使用しない )
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
3D描画をする際にライティング計算を行うかどうかを設定します。( 初期状態では計算します )
計算処理をしない設定にした場合はモデルは頂点カラーとテクスチャカラーを掛け合わせるだけの色計算を行うようになり、
あらゆるライトの設定もマテリアルの設定も無視されます。
計算負荷は軽くなりますので、
背景等事前にライトの計算を行って頂点カラーに落とし込んだモデルなどを描画する際などにライティング計算をOFFにします。
|
|
サンプル
DxChara.x をライティング計算をOFFにして描画します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "DxChara.x" ) ;
// ライティングの計算をしないように設定を変更
SetUseLighting( FALSE ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, -300.0f, 600.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetGlobalAmbientLight( COLOR_F Color ) ;
|
概略 | グローバルアンビエントライトカラーを設定する
|
引数 |
COLOR_F Color : グローバルアンビエントライトカラー( 各色 0.0f ~ 1.0f )
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
すべてのモデルに適用されるアンビエントカラー( 環境光色 )を設定します。
各ライトの設定にもアンビエントカラーはありますが、
この値はその値に加算されます。( 初期値は真っ黒( Color のメンバ変数 r g b がすべて 0.0f )です )
引数の COLOR_F は float r, g, b, a を持つ構造体です。
これの実体を定義してメンバ変数に値を代入して引数に渡す、と言うことをすると非常に面倒なので、
引数に r, g, b, a の値を渡すと COLOR_F 構造体を戻り値として返す関数 GetColorF を使用すると便利です。
( 因みにライト関係の関数では a の値は使われません )
値を大きくすればするほど、マテリアルに設定されたアンビエントカラーの影響が大きくなります。
逆に、この値を何にしてもマテリアルのアンビエントカラーが真っ黒だとなにも見た目は変わりません。
|
|
サンプル
グローバルアンビエントカラーを赤にしてモデルを描画します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// グローバルアンビエントカラーを赤色に変更
SetGlobalAmbientLight( GetColorF( 1.0f, 0.0f, 0.0f, 0.0f ) ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 0.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
標準ライト関数
|
宣言 | int ChangeLightTypeDir( VECTOR Direction ) ;
|
概略 | 標準ライトのタイプをディレクショナルライトにする
|
引数 |
VECTOR Direction : ライトの方向
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
標準ライトのタイプを引数 Direction で示される方向の光を放つディレクショナルライトにします。( Direction は正規化されている必要はありません )
ディレクショナルライトとは位置を持たず方向だけを設定するライトで、
太陽の光などの光源が遠すぎて何処に居ても同じ方向から照らされるライト効果などに使用します。
因みにDXライブラリの初期設定では標準ライトはディレクショナルライトとなっています。
計算負荷も最も軽いので、一番よく使うライトタイプです。
尚、引数 Direction は float x, y, z の三つのメンバ変数を持っている構造体 VECTOR で、
この3要素を使用して3次元の向き指定します。
引数が構造体だと事前に引数に渡す構造体を宣言してメンバ変数にベクトル値を代入して・・・と準備が面倒ですが、
引数に x, y, z の値を渡すとそれを元にした VECTOR 構造体を戻り値で返してくれる関数 VGet を使用することで簡素に引数を渡すことができます。
|
|
サンプル
標準ライトの方向をX軸のマイナス方向にしてモデルを描画します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// X軸のマイナス方向のディレクショナルライトに変更
ChangeLightTypeDir( VGet( -1.0f, 0.0f, 0.0f ) ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 0.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int ChangeLightTypePoint( VECTOR Position, float Range, float Atten0, float Atten1, float Atten2 ) ;
|
概略 | 標準ライトのタイプをポイントライトにする
|
引数 |
VECTOR Position : ライトの位置
float Range : ライトの有効距離
float Atten0 : 距離減衰パラメータ0
float Atten1 : 距離減衰パラメータ1
float Atten2 : 距離減衰パラメータ2
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
標準ライトのタイプを位置と距離減衰パラメータを持つポイントライトにします。
ディレクショナルライトの次に使用頻度の高い、
指定した位置から全方向に光を放つライトです。
引数の説明をします。
VECTER Position
ポイントライトの位置です。
float Range
ポイントライトの影響最大距離です。
この引数で指定する距離以上の座標にある頂点は、
例え距離減衰計算の結果が0ではなくてもライトの影響は無くなります。
float Atten0
float Atten1
float Atten2
ライトの影響力の距離減衰パラメータです( Atten は Attenuation の略です )。
ディレクショナルライト以外のライトはライトの位置から離れれば離れるほどライトの影響が弱くなるようになっています。
その計算式は以下のようなものです。
d = ライトから頂点への距離
ライトの影響力(%) = 100.0f / ( Atten0 + Atten1 * d + Atten2 * d * d )
つまり、Atten0 はライトと頂点の距離に関係なく減衰する率を指定する引数、
Atten1 はライトの距離に比例して減衰する率、
Atten2 はライトの距離の二乗に比例して減衰する率となります。
率を除算する値ですので、
非常に小さな値でも物凄くライトの影響範囲が狭まります。
なので引数に渡す値はこの式を理解してから決定してください。
尚、引数 Position は float x, y, z の三つのメンバ変数を持っている構造体 VECTOR で、
この3要素を使用して3次元の座標を指定します。
引数が構造体だと事前に引数に渡す構造体を宣言してメンバ変数に値を代入して・・・と準備が面倒ですが、
引数に x, y, z の値を渡すとそれを元にした VECTOR 構造体を戻り値で返してくれる関数 VGet を使用することで簡素に引数を渡すことができます。
|
|
サンプル
標準ライトをポイントライトにして、D~H、C~Nまでのキーを使用して
各パラメータを変更できるようにしたサンプルです。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
float Range, Atten0, Atten1, Atten2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 各パラメータを初期化
Range = 2000.0f ;
Atten0 = 0.0f ;
Atten1 = 0.0006f ;
Atten2 = 0.0f ;
// ESCキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// DCキーでライトの影響範囲を変更
if( CheckHitKey( KEY_INPUT_D ) == 1 )
{
Range += 20.0f ;
}
if( CheckHitKey( KEY_INPUT_C ) == 1 )
{
Range -= 20.0f ;
}
// FVキーでライトの距離減衰パラメータ0の値を変更
if( CheckHitKey( KEY_INPUT_F ) == 1 )
{
Atten0 += 0.001f ;
}
if( CheckHitKey( KEY_INPUT_V ) == 1 )
{
Atten0 -= 0.001f ;
}
// GBキーでライトの距離減衰パラメータ1の値を変更
if( CheckHitKey( KEY_INPUT_G ) == 1 )
{
Atten1 += 0.00001f ;
}
if( CheckHitKey( KEY_INPUT_B ) == 1 )
{
Atten1 -= 0.00001f ;
}
// HNキーでライトの距離減衰パラメータ2の値を変更
if( CheckHitKey( KEY_INPUT_H ) == 1 )
{
Atten2 += 0.0000001f ;
}
if( CheckHitKey( KEY_INPUT_N ) == 1 )
{
Atten2 -= 0.0000001f ;
}
// 影響距離の値を補正
if( Range < 0.0f ) Range = 0.0f ;
// 距離減衰パラメータの値を補正
if( Atten0 < 0.0f ) Atten0 = 0.0f ;
if( Atten1 < 0.0f ) Atten1 = 0.0f ;
if( Atten2 < 0.0f ) Atten2 = 0.0f ;
// モデルの上空にポイントライトを設定
ChangeLightTypePoint(
VGet( 320.0f, 1000.0f, 200.0f ),
Range,
Atten0,
Atten1,
Atten2 ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 200.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// パラメータの内容を画面に表示
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Key:D.C Range %f", Range ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Key:F.V Atten0 %f", Atten0 ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "Key:G.B Atten1 %f", Atten1 ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "Key:H.N Atten2 %f / 100.0f", Atten2 * 100.0f ) ;
// 裏画面の内容を表画面に反映する
ScreenFlip() ;
}
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int ChangeLightTypeSpot( VECTOR Position, VECTOR Direction, float OutAngle, float InAngle, float Range, float Atten0, float Atten1, float Atten2 ) ;
|
概略 | 標準ライトのタイプをスポットライトにする
|
引数 |
VECTOR Position : ライトの位置
VECTOR Direction : ライトの向き
float OutAngle : スポットライトコーンの外側の角度( 単位:ラジアン )
float InAngle : スポットライトコーンの内側の角度( 単位:ラジアン )
float Range : ライトの有効距離
float Atten0 : 距離減衰パラメータ0
float Atten1 : 距離減衰パラメータ1
float Atten2 : 距離減衰パラメータ2
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
標準ライトのタイプを位置、方向、角度範囲、距離減衰パラメータを持つスポットライトにします。
一番計算負荷が高く、
また頂点単位のライティングではポリゴンを細かく分割しておかないと思ったような結果が出ないなど扱いが難しいタイプのライトです。
引数の説明をします。
VECTER Position
スポットライトの位置です。
VECTOR Direction
スポットライトの向きです
float OutAngle
スポットライトの影響角度です。
スポットライトの向きに対してこの引数で指定する角度以上の頂点にはライトの影響はありません。
有効な値は 0.0f ~ DX_PI_F までです。
float InAngle
スポットライトの影響が減衰を始める角度です。
スポットライトが OutAngle の角度まで100%の影響を与えて、
そこから急に影響が無い状態になりますと不自然に見えるかもしれません。
そんなときはこの引数でスポットライトの影響が弱まり始める角度を指定します。
スポットライトの向きに対してこの引数で指定する角度以上で且つ OutAngle 以下の場合はライトの影響が100%ではなくなります。
有効な値は 0.0f ~ OutAngle までです。
float Range
スポットライトの影響最大距離です。
この引数で指定する距離以上の座標にある頂点は、
例え距離減衰計算の結果が0ではなくてもライトの影響は無くなります。
float Atten0
float Atten1
float Atten2
ライトの影響力の距離減衰パラメータです( Atten は Attenuation の略です )。
ディレクショナルライト以外のライトはライトの位置から離れれば離れるほどライトの影響が弱くなるようになっています。
その計算式は以下のようなものです。
d = ライトから頂点への距離
ライトの影響力(%) = 100.0f / ( Atten0 + Atten1 * d + Atten2 * d * d )
つまり、Atten0 はライトと頂点の距離に関係なく減衰する率を指定する引数、
Atten1 はライトの距離に比例して減衰する率、
Atten2 はライトの距離の二乗に比例して減衰する率となります。
率を除算する値ですので、
非常に小さな値でも物凄くライトの影響範囲が狭まります。
なので引数に渡す値はこの式を理解してから決定してください。
尚、引数 Position と Direction は float x, y, z の三つのメンバ変数を持っている構造体 VECTOR で、
この3要素を使用して3次元の座標や向きを指定します。
引数が構造体だと事前に引数に渡す構造体を宣言してメンバ変数に値を代入して・・・と準備が面倒ですが、
引数に x, y, z の値を渡すとそれを元にした VECTOR 構造体を戻り値で返してくれる関数 VGet を使用することで簡素に引数を渡すことができます。
|
|
サンプル
標準ライトをスポットライトにして、A~H、Z~Nまでのキーを使用して
各パラメータを変更できるようにしたサンプルです。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
float OutAngle, InAngle, Range, Atten0, Atten1, Atten2 ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 各パラメータを初期化
OutAngle = 90.0f ;
InAngle = 45.0f ;
Range = 2000.0f ;
Atten0 = 0.0f ;
Atten1 = 0.0006f ;
Atten2 = 0.0f ;
// ESCキーが押されるかウインドウが閉じられるまでループ
while( ProcessMessage() == 0 && CheckHitKey( KEY_INPUT_ESCAPE ) == 0 )
{
// 画面をクリア
ClearDrawScreen() ;
// AZキーで OutAngle の値を変更
if( CheckHitKey( KEY_INPUT_A ) == 1 )
{
OutAngle += 1.0f ;
}
if( CheckHitKey( KEY_INPUT_Z ) == 1 )
{
OutAngle -= 1.0f ;
}
// SXキーで InAngle の値を変更
if( CheckHitKey( KEY_INPUT_S ) == 1 )
{
InAngle += 1.0f ;
}
if( CheckHitKey( KEY_INPUT_X ) == 1 )
{
InAngle -= 1.0f ;
}
// DCキーでライトの影響範囲を変更
if( CheckHitKey( KEY_INPUT_D ) == 1 )
{
Range += 20.0f ;
}
if( CheckHitKey( KEY_INPUT_C ) == 1 )
{
Range -= 20.0f ;
}
// FVキーでライトの距離減衰パラメータ0の値を変更
if( CheckHitKey( KEY_INPUT_F ) == 1 )
{
Atten0 += 0.001f ;
}
if( CheckHitKey( KEY_INPUT_V ) == 1 )
{
Atten0 -= 0.001f ;
}
// GBキーでライトの距離減衰パラメータ1の値を変更
if( CheckHitKey( KEY_INPUT_G ) == 1 )
{
Atten1 += 0.00001f ;
}
if( CheckHitKey( KEY_INPUT_B ) == 1 )
{
Atten1 -= 0.00001f ;
}
// HNキーでライトの距離減衰パラメータ2の値を変更
if( CheckHitKey( KEY_INPUT_H ) == 1 )
{
Atten2 += 0.0000001f ;
}
if( CheckHitKey( KEY_INPUT_N ) == 1 )
{
Atten2 -= 0.0000001f ;
}
// 角度の値を補正
if( OutAngle < 0.0f ) OutAngle = 0.0f ;
if( OutAngle > 180.0f ) OutAngle = 180.0f ;
if( InAngle < 0.0f ) InAngle = 0.0f ;
if( InAngle > OutAngle ) InAngle = OutAngle ;
// 影響距離の値を補正
if( Range < 0.0f ) Range = 0.0f ;
// 距離減衰パラメータの値を補正
if( Atten0 < 0.0f ) Atten0 = 0.0f ;
if( Atten1 < 0.0f ) Atten1 = 0.0f ;
if( Atten2 < 0.0f ) Atten2 = 0.0f ;
// Y軸のマイナス方向のスポットライトを設定
ChangeLightTypeSpot(
VGet( 320.0f, 1000.0f, 200.0f ),
VGet( 0.0f, -1.0f, 0.0f ),
OutAngle * DX_PI_F / 180.0f,
InAngle * DX_PI_F / 180.0f,
Range,
Atten0,
Atten1,
Atten2 ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 200.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// パラメータの内容を画面に表示
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "Key:A.Z OutAngle( 度 ) %f", OutAngle ) ;
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Key:S.X InAngle( 度 ) %f", InAngle ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "Key:D.C Range %f", Range ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "Key:F.V Atten0 %f", Atten0 ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "Key:G.B Atten1 %f", Atten1 ) ;
DrawFormatString( 0, 80, GetColor( 255,255,255 ), "Key:H.N Atten2 %f / 100.0f", Atten2 * 100.0f ) ;
// 裏画面の内容を表画面に反映する
ScreenFlip() ;
}
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetLightEnable( int EnableFlag ) ;
|
概略 | 標準ライトの有効、無効をセットする
|
引数 |
int EnableFlag : 標準ライトを有効にするかどうか( TRUE:有効にする FALSE:無効にする )
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
標準ライトを有効にするかどうかを設定します。
SetUseLighting と似ていますが、無効にした場合もライティング計算をしなくなるわけではなく、
ただ単に標準ライトだけが無効になるのでグローバルアンビエントライトやハンドルタイプのライトによるライティング計算が行われます。
|
|
サンプル
SimpleModel.mqo を普通に描画した後、標準ライトを無効にした状態で画面右側に描画します。
標準ライトのディレクショナルライトは当たらず、自己発光色の灰色のみになっているのが確認できます。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 0.0f, 240.0f, 600.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// 標準ライトを無効にする
SetLightEnable( FALSE ) ;
// モデルの位置を変更
MV1SetPosition( ModelHandle, VGet( 700.0f, 240.0f, 600.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetLightDifColor( COLOR_F Color ) ;
|
概略 | 標準ライトのディフューズカラーを設定する
|
引数 |
COLOR_F Color : 標準ライトディフューズカラー
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
標準ライトのディフューズカラーを設定します。
この関数で設定した値は描画対象のマテリアルのディフューズカラーと掛け合わされます。
引数の COLOR_F は float r, g, b, a を持つ構造体です。
これの実体を定義してメンバ変数に値を代入して引数に渡す、と言うことをすると非常に面倒なので、
引数に r, g, b, a の値を渡すと COLOR_F 構造体を戻り値として返す関数 GetColorF を使用すると便利です。
( 因みにライト関係の関数では a の値は使われません )
|
|
サンプル
標準ライトのディフューズカラーを青色にした状態で SimpleModel.mqo を描画します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 標準ライトのディフューズカラーを青色にする
SetLightDifColor( GetColorF( 0.0f, 0.0f, 1.0f, 0.0f ) ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 300.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetLightSpcColor( COLOR_F Color ) ;
|
概略 | 標準ライトのスペキュラカラーを設定する
|
引数 |
COLOR_F Color : 標準ライトスペキュラカラー
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
標準ライトのスペキュラカラーを設定します。
この関数で設定した値は描画対象のマテリアルのスペキュラカラーと掛け合わされます。
引数の COLOR_F は float r, g, b, a を持つ構造体です。
これの実体を定義してメンバ変数に値を代入して引数に渡す、と言うことをすると非常に面倒なので、
引数に r, g, b, a の値を渡すと COLOR_F 構造体を戻り値として返す関数 GetColorF を使用すると便利です。
( 因みにライト関係の関数では a の値は使われません )
|
|
サンプル
標準ライトのスペキュラカラーを黄色にした状態で SimpleModel.mqo を描画します。
( スペキュラカラーの変化が変わりやすいようにディフューズカラーの色を黒にしています )
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// スペキュラカラーの変化がわかりやすいように標準ライトのディフューズカラーを真っ黒にする
SetLightDifColor( GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ) ) ;
// 標準ライトのスペキュラカラーを黄色にする
SetLightSpcColor( GetColorF( 1.0f, 1.0f, 0.0f, 0.0f ) ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 300.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetLightAmbColor( COLOR_F Color ) ;
|
概略 | 標準ライトのアンビエントカラーを設定する
|
引数 |
COLOR_F Color : 標準ライトアンビエントカラー
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
標準ライトのアンビエントカラーを設定します。
この関数で設定した値は描画対象のマテリアルのアンビエントカラーと掛け合わされます。
引数の COLOR_F は float r, g, b, a を持つ構造体です。
これの実体を定義してメンバ変数に値を代入して引数に渡す、と言うことをすると非常に面倒なので、
引数に r, g, b, a の値を渡すと COLOR_F 構造体を戻り値として返す関数 GetColorF を使用すると便利です。
( 因みにライト関係の関数では a の値は使われません )
|
|
サンプル
標準ライトのアンビエントカラーを暗い緑色にした状態で SimpleModel.mqo を描画します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 標準ライトのアンビエントカラーを暗い緑色にする
SetLightAmbColor( GetColorF( 0.0f, 0.2f, 0.0f, 0.0f ) ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 300.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetLightDirection( VECTOR Direction ) ;
|
概略 | 標準ライトの方向を設定する
|
引数 |
VECTOR Direction : 標準ライトの方向
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
標準ライトの向きを設定します。
ChangeLightTypeDir や ChangeLightTypeSpot の引数 Direction の値だけを変更する関数です。
ポイントライトにはライトの向きはないので、
ポイントライトに対してこの関数を使用しても何もおきません。
尚、引数 Direction は float x, y, z の三つのメンバ変数を持っている構造体 VECTOR で、
この3要素を使用して3次元の向きを指定します。
引数が構造体だと事前に引数に渡す構造体を宣言してメンバ変数に値を代入して・・・と準備が面倒ですが、
引数に x, y, z の値を渡すとそれを元にした VECTOR 構造体を戻り値で返してくれる関数 VGet を使用することで簡素に引数を渡すことができます。
|
|
サンプル
標準ライトの向きをX軸のプラス方向にした状態で SimpleModel.mqo を描画します。
( 標準ライトの初期タイプはディレクショナルライトです )
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 標準ライトの方向をX軸のプラス方向にする
SetLightDirection( VGet( 1.0f, 0.0f, 0.0f ) ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 300.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetLightPosition( VECTOR Position ) ;
|
概略 | 標準ライトの位置を設定する
|
引数 |
VECTOR Position : 標準ライトの位置
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
標準ライトの位置を設定します。
ChangeLightTypePoint や ChangeLightTypeSpot の引数 Position の値だけを変更する関数です。
ディレクショナルライトにはライトの位置はないので、
ディレクショナルライトに対してこの関数を使用しても何もおきません。
尚、引数 Position は float x, y, z の三つのメンバ変数を持っている構造体 VECTOR で、
この3要素を使用して3次元の位置を指定します。
引数が構造体だと事前に引数に渡す構造体を宣言してメンバ変数に値を代入して・・・と準備が面倒ですが、
引数に x, y, z の値を渡すとそれを元にした VECTOR 構造体を戻り値で返してくれる関数 VGet を使用することで簡素に引数を渡すことができます。
|
|
サンプル
標準ライトをポイントライトに変更した後、ライトの位置をモデルの上側に移動した状態で
モデルを描画します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 300.0f ) ) ;
// 標準ライトをポイントライトにする
ChangeLightTypePoint( VGet( 0.0f, 0.0f, 0.0f ), 2000.0f, 0.0f, 0.002f, 0.0f ) ;
// 標準ライトの位置をモデルの上に移動する
SetLightPosition( VGet( 320.0f, 1000.0f, 0.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetLightRangeAtten( float Range, float Atten0, float Atten1, float Atten2 ) ;
|
概略 | 標準ライトの有効距離と距離減衰パラメータを設定する
|
引数 |
float Range : ライトの有効距離
float Atten0 : 距離減衰パラメータ0
float Atten1 : 距離減衰パラメータ1
float Atten2 : 距離減衰パラメータ2
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
標準ライトの距離減衰パラメータを設定します。
ChangeLightTypePoint や ChangeLightTypeSpot の同名の引数の値を変更するだけの関数です。
各パラメータの解説については ChangeLightTypePoint と ChangeLightTypeSpot 関数の解説を参照してください。
ディレクショナルライトには距離減衰はないので、
ディレクショナルライトに対してこの関数を使用しても何もおきません。
|
|
サンプル
ありません
|
宣言 | int SetLightAngle( float OutAngle, float InAngle ) ;
|
概略 | 標準ライトの照射角度パラメータを設定する
|
引数 |
float OutAngle : スポットライトコーンの外側の角度( 単位:ラジアン )
float InAngle : スポットライトコーンの内側の角度( 単位:ラジアン )
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
標準ライトの照射角度パラメータを設定します。
ChangeLightTypeSpot の同名の引数の値を変更するだけの関数です。
各パラメータの解説については ChangeLightTypeSpot 関数の解説を参照してください。
|
|
サンプル
ありません
|
宣言 | int GetLightType( void ) ;
|
概略 | 標準ライトのタイプを取得する
|
引数 |
なし
|
戻り値 | -1以外:標準ライトのタイプ |
| -1:エラー発生
|
解説 |
標準ライトのタイプを取得します。
戻り値は以下のいずれかです。
DX_LIGHTTYPE_POINT
ポイントライト
DX_LIGHTTYPE_SPOT
スポットライト
DX_LIGHTTYPE_DIRECTIONAL
ディレクショナルライト
|
|
サンプル
標準ライトの情報を画面に描画します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
char *TypeName ;
COLOR_F Color ;
VECTOR Vector ;
float Range, Atten0, Atten1, Atten2 ;
float InAngle, OutAngle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 画面に標準ライトのタイプを描画
switch( GetLightType() )
{
case DX_LIGHTTYPE_DIRECTIONAL : TypeName = "Directional" ; break ;
case DX_LIGHTTYPE_POINT : TypeName = "Point" ; break ;
case DX_LIGHTTYPE_SPOT : TypeName = "Spot" ; break ;
}
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "LightType %s", TypeName ) ;
// ライトが有効かどうかを描画
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Enable %d", GetLightEnable() ) ;
// ディフューズカラーを描画
Color = GetLightDifColor() ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "Diffuse Color %f %f %f", Color.r, Color.g, Color.b ) ;
// スペキュラカラーを描画
Color = GetLightSpcColor() ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "Specular Color %f %f %f", Color.r, Color.g, Color.b ) ;
// アンビエントカラーを描画
Color = GetLightAmbColor() ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "Ambient Color %f %f %f", Color.r, Color.g, Color.b ) ;
// 向きを描画
Vector = GetLightDirection() ;
DrawFormatString( 0, 80, GetColor( 255,255,255 ), "Direction %f %f %f", Vector.x, Vector.y, Vector.z ) ;
// 位置を描画
Vector = GetLightPosition() ;
DrawFormatString( 0, 96, GetColor( 255,255,255 ), "Position %f %f %f", Vector.x, Vector.y, Vector.z ) ;
// 有効距離と距離減衰パラメータを描画する
GetLightRangeAtten( &Range, &Atten0, &Atten1, &Atten2 ) ;
DrawFormatString( 0, 112, GetColor( 255,255,255 ), "Range %f", Range ) ;
DrawFormatString( 0, 128, GetColor( 255,255,255 ), "Attenuation0 %f", Atten0 ) ;
DrawFormatString( 0, 144, GetColor( 255,255,255 ), "Attenuation1 %f", Atten1 ) ;
DrawFormatString( 0, 160, GetColor( 255,255,255 ), "Attenuation2 %f", Atten2 ) ;
// 照射角度パラメータを描画する
GetLightAngle( &OutAngle, &InAngle ) ;
DrawFormatString( 0, 176, GetColor( 255,255,255 ), "In Angle %f", InAngle ) ;
DrawFormatString( 0, 192, GetColor( 255,255,255 ), "Out Angle %f", OutAngle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int GetLightEnable( void ) ;
|
概略 | 標準ライトの有効、無効を取得する
|
引数 |
なし
|
戻り値 | TRUE:標準ライトは有効 |
| FALSE:標準ライトは無効
|
| -1:エラー発生
|
解説 |
標準ライトが有効かどうかを取得します。
戻り値が TRUE の場合は有効で、FALSE の場合は無効です。
|
|
サンプル
GetLightType関数 のサンプルを参照してください。
|
宣言 | COLOR_F GetLightDifColor( void ) ;
|
概略 | 標準ライトのディフューズカラーを取得する
|
引数 |
なし
|
戻り値 | ディフューズカラー |
解説 |
標準ライトのディフューズカラーを取得します。
戻り値の COLOR_F は構造体で、中身は float r, g, b, a となっています。
ライトのカラーでは a の値は使いません。
|
|
サンプル
GetLightType関数 のサンプルを参照してください。
|
宣言 | COLOR_F GetLightSpcColor( void ) ;
|
概略 | 標準ライトのスペキュラカラーを取得する
|
引数 |
なし
|
戻り値 | スペキュラカラー |
解説 |
標準ライトのスペキュラカラーを取得します。
戻り値の COLOR_F は構造体で、中身は float r, g, b, a となっています。
ライトのカラーでは a の値は使いません。
|
|
サンプル
GetLightType関数 のサンプルを参照してください。
|
宣言 | COLOR_F GetLightAmbColor( void ) ;
|
概略 | 標準ライトのアンビエントカラーを取得する
|
引数 |
なし
|
戻り値 | アンビエントカラー |
解説 |
標準ライトのアンビエントカラーを取得します。
戻り値の COLOR_F は構造体で、中身は float r, g, b, a となっています。
ライトのカラーでは a の値は使いません。
|
|
サンプル
GetLightType関数 のサンプルを参照してください。
|
宣言 | VECTOR GetLightDirection( void ) ;
|
概略 | 標準ライトの向きを取得する
|
引数 |
なし
|
戻り値 | 標準ライトの向き |
解説 |
標準ライトの向きを取得します。
戻り値の VECTOR は構造体で、中身は float x, y, z となっています。
|
|
サンプル
GetLightType関数 のサンプルを参照してください。
|
宣言 | VECTOR GetLightPosition( void ) ;
|
概略 | 標準ライトの位置を取得する
|
引数 |
なし
|
戻り値 | 標準ライトの位置 |
解説 |
標準ライトの位置を取得します。
戻り値の VECTOR は構造体で、中身は float x, y, z となっています。
|
|
サンプル
GetLightType関数 のサンプルを参照してください。
|
宣言 | int GetLightRangeAtten( float *Range, float *Atten0, float *Atten1, float *Atten2 ) ;
|
概略 | 標準ライトの有効距離と距離減衰パラメータを取得する
|
引数 |
float *Range : 有効距離を代入する変数のアドレス
float *Atten0 : 距離減衰パラメータ0を代入する変数のアドレス
float *Atten1 : 距離減衰パラメータ1を代入する変数のアドレス
float *Atten2 : 距離減衰パラメータ2を代入する変数のアドレス
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
標準ライトの有効距離と距離減衰パラメータを取得します。
|
|
サンプル
GetLightType関数 のサンプルを参照してください。
|
宣言 | int GetLightAngle( float *OutAngle, float *InAngle ) ;
|
概略 | 標準ライトの照射角度パラメータを取得する
|
引数 |
float *OutAngle : スポットライトコーンの外側の角度( 単位:ラジアン )を代入する変数のアドレス
float *InAngle : スポットライトコーンの内側の角度( 単位:ラジアン )を代入する変数のアドレス
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
標準ライトのスポットライトコーンの角度を取得します。
|
|
サンプル
GetLightType関数 のサンプルを参照してください。
|
ライトハンドル関数
|
宣言 | int CreateDirLightHandle( VECTOR Direction ) ;
|
概略 | ディレクショナルタイプのライトハンドルを作成する
|
引数 |
VECTOR Direction : ライトの方向
|
戻り値 | 0以上:ライトハンドル |
| -1:エラー発生
|
解説 |
ディレクショナルタイプのライトハンドルを作成します。
( ディレクショナルライトとは位置を持たず方向だけを設定するライトで、
太陽の光などの光源が遠すぎて何処に居ても同じ方向から照らされるライト効果などに使用します )
この関数は戻り値にライトハンドル( int 型の数値 )を返してきます。
ライトハンドルの設定を変更したり、
不要になったライトハンドルを削除したりする際に必要になりますので戻り値は必ず何かしらの変数に保存しておくようにしてください。
引数 Direction は float x, y, z の三つのメンバ変数を持っている構造体 VECTOR で、
この3要素を使用して3次元の向き指定します。
引数が構造体だと事前に引数に渡す構造体を宣言してメンバ変数にベクトル値を代入して・・・と準備が面倒ですが、
引数に x, y, z の値を渡すとそれを元にした VECTOR 構造体を戻り値で返してくれる関数 VGet を使用することで簡素に引数を渡すことができます。
尚、ライトハンドル系の関数は一つしかない標準ライト以外にライトを使用したい場合に使用します。
( とはいえ同時に有効にできるのは標準ライトを含めて3つまでですが・・・ )
|
|
サンプル
X軸にマイナス方向のディレクショナルライトハンドルを作成して、
効果がわかり易いように標準ライトを無効にした上でモデルを描画します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, LightHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// X軸にマイナス方向のディレクショナルタイプのライトの作成
LightHandle = CreateDirLightHandle( VGet( -1.0f, 0.0f, 0.0f ) ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// ライトハンドルの削除
DeleteLightHandle( LightHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int CreatePointLightHandle( VECTOR Position, float Range, float Atten0, float Atten1, float Atten2 ) ;
|
概略 | ポイントタイプのライトハンドルを作成する
|
引数 |
VECTOR Position : ライトの位置
float Range : ライトの有効距離
float Atten0 : 距離減衰パラメータ0
float Atten1 : 距離減衰パラメータ1
float Atten2 : 距離減衰パラメータ2
|
戻り値 | 0以上:ライトハンドル |
| -1:エラー発生
|
解説 |
ポイントタイプのライトハンドルを作成します。
( ポイントライトは指定した位置から全方向に光を放つライトです )
この関数は戻り値にライトハンドル( int 型の数値 )を返してきます。
ライトハンドルの設定を変更したり、
不要になったライトハンドルを削除したりする際に必要になりますので戻り値は必ず何かしらの変数に保存しておくようにしてください。
引数の説明をします。
VECTER Position
ポイントライトの位置です。
float Range
ポイントライトの影響最大距離です。
この引数で指定する距離以上の座標にある頂点は、
例え距離減衰計算の結果が0ではなくてもライトの影響は無くなります。
float Atten0
float Atten1
float Atten2
ライトの影響力の距離減衰パラメータです( Atten は Attenuation の略です )。
ディレクショナルライト以外のライトはライトの位置から離れれば離れるほどライトの影響が弱くなるようになっています。
その計算式は以下のようなものです。
d = ライトから頂点への距離
ライトの影響力(%) = 100.0f / ( Atten0 + Atten1 * d + Atten2 * d * d )
つまり、Atten0 はライトと頂点の距離に関係なく減衰する率を指定する引数、
Atten1 はライトの距離に比例して減衰する率、
Atten2 はライトの距離の二乗に比例して減衰する率となります。
率を除算する値ですので、
非常に小さな値でも物凄くライトの影響範囲が狭まります。
なので引数に渡す値はこの式を理解してから決定してください。
尚、ライトハンドル系の関数は一つしかない標準ライト以外にライトを使用したい場合に使用します。
( とはいえ同時に有効にできるのは標準ライトを含めて3つまでですが・・・ )
|
|
サンプル
読み込んだモデルの上側にポイントライトを作成して、
効果がわかり易いように標準ライトを無効にした上でモデルを描画します。
ポイントライトの各パラメータを変化させるとどのような変化があるのかは
ChangeLightTypePoint関数 のサンプルで確認できます。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, LightHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// モデルの上側にポイントタイプのライトを作成
LightHandle = CreatePointLightHandle(
VGet( 320.0f, 1000.0f, 600.0f ),
2000.0f,
0.0f,
0.002f,
0.0f ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// ライトハンドルの削除
DeleteLightHandle( LightHandle ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int CreateSpotLightHandle( VECTOR Position, VECTOR Direction, float OutAngle, float InAngle, float Range, float Atten0, float Atten1, float Atten2 ) ;
|
概略 | スポットタイプのライトハンドルを作成する
|
引数 |
VECTOR Position : ライトの位置
VECTOR Direction : ライトの向き
float OutAngle : スポットライトコーンの外側の角度( 単位:ラジアン )
float InAngle : スポットライトコーンの内側の角度( 単位:ラジアン )
float Range : ライトの有効距離
float Atten0 : 距離減衰パラメータ0
float Atten1 : 距離減衰パラメータ1
float Atten2 : 距離減衰パラメータ2
|
戻り値 | 0以上:ライトハンドル |
| -1:エラー発生
|
解説 |
スポットタイプのライトハンドルを作成します。
( スポットライトは指定した位置から指定の方向に全方向に光を放つライトです )
この関数は戻り値にライトハンドル( int 型の数値 )を返してきます。
ライトハンドルの設定を変更したり、
不要になったライトハンドルを削除したりする際に必要になりますので戻り値は必ず何かしらの変数に保存しておくようにしてください。
引数の説明をします。
VECTER Position
スポットライトの位置です。
VECTOR Direction
スポットライトの向きです
float OutAngle
スポットライトの影響角度です。
スポットライトの向きに対してこの引数で指定する角度以上の頂点にはライトの影響はありません。
有効な値は 0.0f ~ DX_PI_F までです。
float InAngle
スポットライトの影響が減衰を始める角度です。
スポットライトが OutAngle の角度まで100%の影響を与えて、
そこから急に影響が無い状態になりますと不自然に見えるかもしれません。
そんなときはこの引数でスポットライトの影響が弱まり始める角度を指定します。
スポットライトの向きに対してこの引数で指定する角度以上で且つ OutAngle 以下の場合はライトの影響が100%ではなくなります。
有効な値は 0.0f ~ OutAngle までです。
float Range
スポットライトの影響最大距離です。
この引数で指定する距離以上の座標にある頂点は、
例え距離減衰計算の結果が0ではなくてもライトの影響は無くなります。
float Atten0
float Atten1
float Atten2
ライトの影響力の距離減衰パラメータです( Atten は Attenuation の略です )。
ディレクショナルライト以外のライトはライトの位置から離れれば離れるほどライトの影響が弱くなるようになっています。
その計算式は以下のようなものです。
d = ライトから頂点への距離
ライトの影響力(%) = 100.0f / ( Atten0 + Atten1 * d + Atten2 * d * d )
つまり、Atten0 はライトと頂点の距離に関係なく減衰する率を指定する引数、
Atten1 はライトの距離に比例して減衰する率、
Atten2 はライトの距離の二乗に比例して減衰する率となります。
率を除算する値ですので、
非常に小さな値でも物凄くライトの影響範囲が狭まります。
なので引数に渡す値はこの式を理解してから決定してください。
引数 Direction は float x, y, z の三つのメンバ変数を持っている構造体 VECTOR で、
この3要素を使用して3次元の向き指定します。
引数が構造体だと事前に引数に渡す構造体を宣言してメンバ変数にベクトル値を代入して・・・と準備が面倒ですが、
引数に x, y, z の値を渡すとそれを元にした VECTOR 構造体を戻り値で返してくれる関数 VGet を使用することで簡素に引数を渡すことができます。
尚、ライトハンドル系の関数は一つしかない標準ライト以外にライトを使用したい場合に使用します。
( とはいえ同時に有効にできるのは標準ライトを含めて3つまでですが・・・ )
|
|
サンプル
読み込んだモデルの上側に下向きの光を放つスポットライトを作成して、
効果がわかり易いように標準ライトを無効にした上でモデルを描画します。
スポットライトの各パラメータを変化させるとどのような変化があるのかは
ChangeLightTypeSpot関数 のサンプルで確認できます。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int ModelHandle, LightHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// モデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// 効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// モデルをカメラの映る位置に移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// モデルの上側に下向きのスポットタイプのライトを作成
LightHandle = CreateSpotLightHandle(
VGet( 320.0f, 1000.0f, 600.0f ),
VGet( 0.0f, -1.0f, 0.0f ),
DX_PI_F / 2.0f,
DX_PI_F / 4.0f,
2000.0f,
0.0f,
0.002f,
0.0f ) ;
// モデルを描画
MV1DrawModel( ModelHandle ) ;
// ライトハンドルの削除
DeleteLightHandle( LightHandle ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
|
サンプル
ディレクショナルライトを作成してすぐ削除します。
削除関数を使うサンプルプログラムなので実行しても何も起きません。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int LightHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// ディレクショナルライトタイプのハンドルの作成
LightHandle = CreateDirLightHandle( VGet( 1.0f, 0.0f, 0.0f ) ) ;
// 直後に削除
DeleteLightHandle( LightHandle ) ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
|
サンプル
ありません
|
宣言 | int SetLightTypeHandle( int LHandle, int LightType ) ;
|
概略 | ライトハンドルのタイプを変更する
|
引数 |
int LHandle : ライトハンドル
int LightType : ライトタイプ
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
ライトハンドルのライトタイプを変更します。
ライトタイプに指定できる値は以下の3つです。
DX_LIGHTTYPE_DIRECTIONAL
ディレクショナルライト
DX_LIGHTTYPE_POINT
ポイントライト
DX_LIGHTTYPE_SPOT
スポットライト
|
|
サンプル
ディレクショナルタイプのライトを作成した後、それをポイントタイプのライトに変更して
ポイントライトとしてのパラメータを設定した後モデルを描画します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int LightHandle, ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// ライトハンドルのライトの効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// ディレクショナルタイプのライトハンドルの作成
LightHandle = CreateDirLightHandle( VGet( 1.0f, 0.0f, 0.0f ) ) ;
// ライトのタイプをポイントライトに変更
SetLightTypeHandle( LightHandle, DX_LIGHTTYPE_POINT ) ;
// 位置を設定
SetLightPositionHandle( LightHandle, VGet( 320.0f, 1000.0f, 600.0f ) ) ;
// 有効距離と距離減衰パラメータを設定
SetLightRangeAttenHandle( LightHandle, 2000.0f, 0.0f, 0.002f, 0.0f ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// ライトハンドルの削除
DeleteLightHandle( LightHandle ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetLightEnableHandle( int LHandle, int EnableFlag ) ;
|
概略 | ライトハンドルのライトの有効、無効を設定する
|
引数 |
int LHandle : ライトハンドル
int EnableFlag : ライトを有効にするかどうか( TRUE:有効にする FALSE:無効にする )
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
指定のライトハンドルのライトを有効にするかどうかを設定します。
同時に有効にできる数は標準ライトを含めて3つまでです。
既に3つ有効なライトがある状態でライトを有効にすると、どのライトが有効になるかは不定となります。
|
|
サンプル
3つのディレクショナルタイプのライトハンドルを作成した後、各ライトを50%の確率で
無効にして、そのあとモデルを描画します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int LightHandle[ 3 ], ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// ライトハンドルのライトの効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// ディレクショナルタイプのライトハンドルを3つ作成
LightHandle[ 0 ] = CreateDirLightHandle( VGet( 1.0f, 0.0f, 0.0f ) ) ;
LightHandle[ 1 ] = CreateDirLightHandle( VGet( 0.0f, 1.0f, 0.0f ) ) ;
LightHandle[ 2 ] = CreateDirLightHandle( VGet( 0.0f, 0.0f, 1.0f ) ) ;
// 各ライトを50%の確率で無効にする
if( GetRand( 99 ) >= 50 )
{
SetLightEnableHandle( LightHandle[ 0 ], FALSE ) ;
}
if( GetRand( 99 ) >= 50 )
{
SetLightEnableHandle( LightHandle[ 1 ], FALSE ) ;
}
if( GetRand( 99 ) >= 50 )
{
SetLightEnableHandle( LightHandle[ 2 ], FALSE ) ;
}
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// ライトハンドルの削除
DeleteLightHandle( LightHandle[ 0 ] ) ;
DeleteLightHandle( LightHandle[ 1 ] ) ;
DeleteLightHandle( LightHandle[ 2 ] ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetLightDifColorHandle( int LHandle, COLOR_F Color ) ;
|
概略 | ライトハンドルのライトのディフューズカラーを設定する
|
引数 |
int LHandle : ライトハンドル
COLOR_F Color : ディフューズカラー
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
ライトハンドルのディフューズカラーを設定します。
この関数で設定した値は描画対象のマテリアルのディフューズカラーと掛け合わされます。
引数の COLOR_F は float r, g, b, a を持つ構造体です。
これの実体を定義してメンバ変数に値を代入して引数に渡す、と言うことをすると非常に面倒なので、
引数に r, g, b, a の値を渡すと COLOR_F 構造体を戻り値として返す関数 GetColorF を使用すると便利です。
( 因みにライト関係の関数では a の値は使われません )
|
|
サンプル
ライトハンドルのディフューズカラーを青色にした状態で SimpleModel.mqo を描画します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int LightHandle, ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// ライトハンドルのライトの効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// ディレクショナルタイプのライトハンドルを作成
LightHandle = CreateDirLightHandle( VGet( 1.0f, -1.0f, 1.0f ) ) ;
// ライトハンドルのディフューズカラーを青色にする
SetLightDifColorHandle( LightHandle, GetColorF( 0.0f, 0.0f, 1.0f, 0.0f ) ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// ライトハンドルの削除
DeleteLightHandle( LightHandle ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetLightSpcColorHandle( int LHandle, COLOR_F Color ) ;
|
概略 | ライトハンドルのライトのスペキュラカラーを設定する
|
引数 |
int LHandle : ライトハンドル
COLOR_F Color : スペキュラカラー
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
ライトハンドルのスペキュラカラーを設定します。
この関数で設定した値は描画対象のマテリアルのスペキュラカラーと掛け合わされます。
引数の COLOR_F は float r, g, b, a を持つ構造体です。
これの実体を定義してメンバ変数に値を代入して引数に渡す、と言うことをすると非常に面倒なので、
引数に r, g, b, a の値を渡すと COLOR_F 構造体を戻り値として返す関数 GetColorF を使用すると便利です。
( 因みにライト関係の関数では a の値は使われません )
|
|
サンプル
ライトハンドルのスペキュラカラーを赤色にした状態で SimpleModel.mqo を描画します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int LightHandle, ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// ライトハンドルのライトの効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// ディレクショナルタイプのライトハンドルを作成
LightHandle = CreateDirLightHandle( VGet( 1.0f, -1.0f, 1.0f ) ) ;
// スペキュラカラーの変更がわかり易いようにディフューズカラーを黒にする
SetLightDifColorHandle( LightHandle, GetColorF( 0.0f, 0.0f, 0.0f, 0.0f ) ) ;
// ライトハンドルのスペキュラカラーを赤色にする
SetLightSpcColorHandle( LightHandle, GetColorF( 1.0f, 0.0f, 0.0f, 0.0f ) ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// ライトハンドルの削除
DeleteLightHandle( LightHandle ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetLightAmbColorHandle( int LHandle, COLOR_F Color ) ;
|
概略 | ライトハンドルのライトのアンビエントカラーを設定する
|
引数 |
int LHandle : ライトハンドル
COLOR_F Color : アンビエントカラー
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
ライトハンドルのアンビエントカラーを設定します。
この関数で設定した値は描画対象のマテリアルのアンビエントカラーと掛け合わされます。
引数の COLOR_F は float r, g, b, a を持つ構造体です。
これの実体を定義してメンバ変数に値を代入して引数に渡す、と言うことをすると非常に面倒なので、
引数に r, g, b, a の値を渡すと COLOR_F 構造体を戻り値として返す関数 GetColorF を使用すると便利です。
( 因みにライト関係の関数では a の値は使われません )
|
|
サンプル
ライトハンドルのアンビエントカラーを暗い緑色にした状態で SimpleModel.mqo を描画します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int LightHandle, ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// ライトハンドルのライトの効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// ディレクショナルタイプのライトハンドルを作成
LightHandle = CreateDirLightHandle( VGet( 1.0f, -1.0f, 1.0f ) ) ;
// ライトハンドルのアンビエントカラーを暗い緑色にする
SetLightAmbColorHandle( LightHandle, GetColorF( 0.0f, 0.2f, 0.0f, 0.0f ) ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// ライトハンドルの削除
DeleteLightHandle( LightHandle ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetLightDirectionHandle( int LHandle, VECTOR Direction ) ;
|
概略 | ライトハンドルのライトの方向を設定する
|
引数 |
int LHandle : ライトハンドル
VECTOR Direction : 標準ライトの方向
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
ライトハンドルのライトの向きを設定します。
CreateDirLightHandle や CreateSpotLightHandle の引数 Direction の値だけを変更する関数です。
ポイントライトにはライトの向きはないので、
ポイントライトに対してこの関数を使用しても何もおきません。
尚、引数 Direction は float x, y, z の三つのメンバ変数を持っている構造体 VECTOR で、
この3要素を使用して3次元の向きを指定します。
引数が構造体だと事前に引数に渡す構造体を宣言してメンバ変数に値を代入して・・・と準備が面倒ですが、
引数に x, y, z の値を渡すとそれを元にした VECTOR 構造体を戻り値で返してくれる関数 VGet を使用することで簡素に引数を渡すことができます。
|
|
サンプル
ライトハンドルのライトの向きをX軸のプラス方向にした状態で SimpleModel.mqo を描画します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int LightHandle, ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// ライトハンドルのライトの効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// ディレクショナルタイプのライトハンドルを作成
LightHandle = CreateDirLightHandle( VGet( 1.0f, -1.0f, 1.0f ) ) ;
// ライトハンドルの方向をX軸のプラス方向にする
SetLightDirectionHandle( LightHandle, VGet( 1.0f, 0.0f, 0.0f ) ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// ライトハンドルの削除
DeleteLightHandle( LightHandle ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetLightPositionHandle( int LHandle, VECTOR Position ) ;
|
概略 | ライトハンドルのライトの位置を設定する
|
引数 |
int LHandle : ライトハンドル
VECTOR Position : 標準ライトの位置
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
ライトハンドルのライトの位置を設定します。
CreatePointLightHandle や CreateSpotLightHandle の引数 Position の値だけを変更する関数です。
ディレクショナルライトにはライトの位置はないので、
ディレクショナルライトに対してこの関数を使用しても何もおきません。
尚、引数 Position は float x, y, z の三つのメンバ変数を持っている構造体 VECTOR で、
この3要素を使用して3次元の位置を指定します。
引数が構造体だと事前に引数に渡す構造体を宣言してメンバ変数に値を代入して・・・と準備が面倒ですが、
引数に x, y, z の値を渡すとそれを元にした VECTOR 構造体を戻り値で返してくれる関数 VGet を使用することで簡素に引数を渡すことができます。
|
|
サンプル
ポイントタイプのライトを作成した後、ライトの位置をモデルの上側に移動してから
モデルを描画します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int LightHandle, ModelHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// 3Dモデルの読み込み
ModelHandle = MV1LoadModel( "SimpleModel.mqo" ) ;
// ライトハンドルのライトの効果がわかり易いように標準ライトを無効化
SetLightEnable( FALSE ) ;
// ポイントタイプのライトハンドルを作成
LightHandle = CreatePointLightHandle(
VGet( 320.0f, 1000.0f, 600.0f ),
2000.0f,
0.0f,
0.002f,
0.0f ) ;
// ライトハンドルの位置をモデルの上側に移動
SetLightPositionHandle( LightHandle, VGet( 320.0f, 1000.0f, 600.0f ) ) ;
// 画面に映る位置に3Dモデルを移動
MV1SetPosition( ModelHandle, VGet( 320.0f, 240.0f, 600.0f ) ) ;
// 3Dモデルの描画
MV1DrawModel( ModelHandle ) ;
// ライトハンドルの削除
DeleteLightHandle( LightHandle ) ;
// モデルハンドルの削除
MV1DeleteModel( ModelHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int SetLightRangeAttenHandle( int LHandle, float Range, float Atten0, float Atten1, float Atten2 ) ;
|
概略 | ライトハンドルのライトの有効距離と距離減衰パラメータを設定する
|
引数 |
int LHandle : ライトハンドル
float Range : ライトの有効距離
float Atten0 : 距離減衰パラメータ0
float Atten1 : 距離減衰パラメータ1
float Atten2 : 距離減衰パラメータ2
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
ライトハンドルのライトの距離減衰パラメータを設定します。
CreatePointLightHandle や CreateSpotLightHandle の同名の引数の値を変更するだけの関数です。
各パラメータの解説については CreatePointLightHandle と CreateSpotLightHandle 関数の解説を参照してください。
ディレクショナルライトには距離減衰はないので、
ディレクショナルライトに対してこの関数を使用しても何もおきません。
|
|
サンプル
ありません
|
宣言 | int SetLightAngleHandle( int LHandle, float OutAngle, float InAngle ) ;
|
概略 | ライトハンドルのライトの照射角度パラメータを設定する
|
引数 |
int LHandle : ライトハンドル
float OutAngle : スポットライトコーンの外側の角度( 単位:ラジアン )
float InAngle : スポットライトコーンの内側の角度( 単位:ラジアン )
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
ライトハンドルのライトの照射角度パラメータを設定します。
CreateSpotLightHandle の同名の引数の値を変更するだけの関数です。
各パラメータの解説については CreateSpotLightHandle 関数の解説を参照してください。
|
|
サンプル
ありません
|
宣言 | int GetLightTypeHandle( int LHandle ) ;
|
概略 | ライトハンドルのライトのタイプを取得する
|
引数 |
int LHandle : ライトハンドル
|
戻り値 | -1以外:ライトのタイプ |
| -1:エラー発生
|
解説 |
ライトハンドルのライトのタイプを取得します。
戻り値は以下のいずれかです。
DX_LIGHTTYPE_POINT
ポイントライト
DX_LIGHTTYPE_SPOT
スポットライト
DX_LIGHTTYPE_DIRECTIONAL
ディレクショナルライト
|
|
サンプル
スポットライトを作成して、そのライトの情報を画面に描画します。
Windows用
#include "DxLib.h"
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
char *TypeName ;
COLOR_F Color ;
VECTOR Vector ;
float Range, Atten0, Atten1, Atten2 ;
float InAngle, OutAngle ;
int LightHandle ;
// DXライブラリの初期化
if( DxLib_Init() < 0 )
{
// エラーが発生したら直ちに終了
return -1 ;
}
// スポットタイプのライトの作成
LightHandle = CreateSpotLightHandle(
VGet( 320.0f, 1000.0f, 600.0f ),
VGet( 0.0f, -1.0f, 0.0f ),
DX_PI_F / 2.0f,
DX_PI_F / 4.0f,
2000.0f,
0.0f,
0.002f,
0.0f ) ;
// 画面に標準ライトのタイプを描画
switch( GetLightTypeHandle( LightHandle ) )
{
case DX_LIGHTTYPE_DIRECTIONAL : TypeName = "Directional" ; break ;
case DX_LIGHTTYPE_POINT : TypeName = "Point" ; break ;
case DX_LIGHTTYPE_SPOT : TypeName = "Spot" ; break ;
}
DrawFormatString( 0, 0, GetColor( 255,255,255 ), "LightType %s", TypeName ) ;
// ライトが有効かどうかを描画
DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Enable %d", GetLightEnableHandle( LightHandle ) ) ;
// ディフューズカラーを描画
Color = GetLightDifColorHandle( LightHandle ) ;
DrawFormatString( 0, 32, GetColor( 255,255,255 ), "Diffuse Color %f %f %f", Color.r, Color.g, Color.b ) ;
// スペキュラカラーを描画
Color = GetLightSpcColorHandle( LightHandle ) ;
DrawFormatString( 0, 48, GetColor( 255,255,255 ), "Specular Color %f %f %f", Color.r, Color.g, Color.b ) ;
// アンビエントカラーを描画
Color = GetLightAmbColorHandle( LightHandle ) ;
DrawFormatString( 0, 64, GetColor( 255,255,255 ), "Ambient Color %f %f %f", Color.r, Color.g, Color.b ) ;
// 向きを描画
Vector = GetLightDirectionHandle( LightHandle ) ;
DrawFormatString( 0, 80, GetColor( 255,255,255 ), "Direction %f %f %f", Vector.x, Vector.y, Vector.z ) ;
// 位置を描画
Vector = GetLightPositionHandle( LightHandle ) ;
DrawFormatString( 0, 96, GetColor( 255,255,255 ), "Position %f %f %f", Vector.x, Vector.y, Vector.z ) ;
// 有効距離と距離減衰パラメータを描画する
GetLightRangeAttenHandle( LightHandle, &Range, &Atten0, &Atten1, &Atten2 ) ;
DrawFormatString( 0, 112, GetColor( 255,255,255 ), "Range %f", Range ) ;
DrawFormatString( 0, 128, GetColor( 255,255,255 ), "Attenuation0 %f", Atten0 ) ;
DrawFormatString( 0, 144, GetColor( 255,255,255 ), "Attenuation1 %f", Atten1 ) ;
DrawFormatString( 0, 160, GetColor( 255,255,255 ), "Attenuation2 %f", Atten2 ) ;
// 照射角度パラメータを描画する
GetLightAngleHandle( LightHandle, &OutAngle, &InAngle ) ;
DrawFormatString( 0, 176, GetColor( 255,255,255 ), "In Angle %f", InAngle ) ;
DrawFormatString( 0, 192, GetColor( 255,255,255 ), "Out Angle %f", OutAngle ) ;
// ライトハンドルの削除
DeleteLightHandle( LightHandle ) ;
// キー入力待ち
WaitKey() ;
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
Android用
Windows用のプログラムの
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
を
int android_main( void )
に置き換える以外は Windows用のプログラムと同じです。
|
宣言 | int GetLightEnableHandle( int LHandle ) ;
|
概略 | ライトハンドルのライトの有効、無効を取得する
|
引数 |
int LHandle : ライトハンドル
|
戻り値 | TRUE:ライトは有効 |
| FALSE:ライトは無効
|
| -1:エラー発生
|
解説 |
ライトハンドルのライトが有効かどうかを取得します。
戻り値が TRUE の場合は有効で、FALSE の場合は無効です。
|
|
サンプル
GetLightTypeHandle関数 のサンプルを参照してください。
|
宣言 | COLOR_F GetLightDifColorHandle( int LHandle ) ;
|
概略 | ライトハンドルのライトのディフューズカラーを取得する
|
引数 |
int LHandle : ライトハンドル
|
戻り値 | ディフューズカラー |
解説 |
ライトハンドルのライトのディフューズカラーを取得します。
戻り値の COLOR_F は構造体で、中身は float r, g, b, a となっています。
ライトのカラーでは a の値は使いません。
|
|
サンプル
GetLightTypeHandle関数 のサンプルを参照してください。
|
宣言 | COLOR_F GetLightSpcColorHandle( int LHandle ) ;
|
概略 | ライトハンドルのライトのスペキュラカラーを取得する
|
引数 |
int LHandle : ライトハンドル
|
戻り値 | スペキュラカラー |
解説 |
ライトハンドルのライトのスペキュラカラーを取得します。
戻り値の COLOR_F は構造体で、中身は float r, g, b, a となっています。
ライトのカラーでは a の値は使いません。
|
|
サンプル
GetLightTypeHandle関数 のサンプルを参照してください。
|
宣言 | COLOR_F GetLightAmbColorHandle( int LHandle ) ;
|
概略 | ライトハンドルのライトのアンビエントカラーを取得する
|
引数 |
int LHandle : ライトハンドル
|
戻り値 | アンビエントカラー |
解説 |
ライトハンドルのライトのアンビエントカラーを取得します。
戻り値の COLOR_F は構造体で、中身は float r, g, b, a となっています。
ライトのカラーでは a の値は使いません。
|
|
サンプル
GetLightTypeHandle関数 のサンプルを参照してください。
|
宣言 | VECTOR GetLightDirectionHandle( int LHandle ) ;
|
概略 | ライトハンドルのライトの方向を取得する
|
引数 |
int LHandle : ライトハンドル
|
戻り値 | ライトの向き |
解説 |
ライトハンドルのライトの向きを取得します。
戻り値の VECTOR は構造体で、中身は float x, y, z となっています。
|
|
サンプル
GetLightTypeHandle関数 のサンプルを参照してください。
|
宣言 | VECTOR GetLightPositionHandle( int LHandle ) ;
|
概略 | ライトハンドルのライトの位置を取得する
|
引数 |
int LHandle : ライトハンドル
|
戻り値 | ライトの位置 |
解説 |
ライトハンドルのライトの位置を取得します。
戻り値の VECTOR は構造体で、中身は float x, y, z となっています。
|
|
サンプル
GetLightTypeHandle関数 のサンプルを参照してください。
|
宣言 | int GetLightRangeAttenHandle( int LHandle, float *Range, float *Atten0, float *Atten1, float *Atten2 ) ;
|
概略 | ライトハンドルのライトの有効距離と距離減衰パラメータを取得する
|
引数 |
int LHandle : ライトハンドル
float *Range : 有効距離を代入する変数のアドレス
float *Atten0 : 距離減衰パラメータ0を代入する変数のアドレス
float *Atten1 : 距離減衰パラメータ1を代入する変数のアドレス
float *Atten2 : 距離減衰パラメータ2を代入する変数のアドレス
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
ライトハンドルのライトの有効距離と距離減衰パラメータを取得します。
|
|
サンプル
GetLightTypeHandle関数 のサンプルを参照してください。
|
宣言 | int GetLightAngleHandle( int LHandle, float *OutAngle, float *InAngle ) ;
|
概略 | ライトハンドルのライトの照射角度パラメータを取得する
|
引数 |
int LHandle : ライトハンドル
float *OutAngle : スポットライトコーンの外側の角度( 単位:ラジアン )を代入する変数のアドレス
float *InAngle : スポットライトコーンの内側の角度( 単位:ラジアン )を代入する変数のアドレス
|
戻り値 | 0:成功 |
| -1:エラー発生
|
解説 |
ライトハンドルのライトのスポットライトコーンの角度を取得します。
|
|
サンプル
GetLightTypeHandle関数 のサンプルを参照してください。
|
宣言 | int GetEnableLightHandleNum( void ) ;
|
概略 | 有効になっているライトハンドルの数を取得する
|
引数 |
なし
|
戻り値 | 0以上:有効になっているライトハンドルの数 |
| -1:エラー発生
|
解説 |
SetLightEnableHandle で有効( TRUE )に設定されているライトハンドルの数を取得します。
標準ライトも内部でライトハンドルを使用しているのでライトハンドルを一つも作成していなくても SetLightEnable の設定が TRUE になっている場合の戻り値は1になります。
|
|
サンプル
ありません。
|
宣言 | int GetEnableLightHandle( int Index ) ;
|
概略 | 有効になっているライトハンドルを取得する
|
引数 |
int Index : 有効になっているライトハンドルの番号
|
戻り値 | 0以上:有効になっているライトハンドル |
| -1:エラー発生
|
解説 |
SetLightEnableHandle で有効( TRUE )に設定されているライトハンドルを取得します。
Index に指定できる値は0から GetEnableLightHandleNum の戻り値から1引いた値までです。
また、有効になっているライトはディレクショナルライト・スポットライト・ポイントライトの順番になっています。
|
|
サンプル
ありません。
|
戻る
|