トップページ > 過去ログ > 記事閲覧
DxLibModelViewerのように・・・
名前:ビギナー 日時: 2010/04/29 21:06

ライブラリを重宝させていただいています。 3Dモデルを扱いたいのですが DxLibModelViewerのライトの輝度、彩度設定はどのように行われてるのでしょうか? ゲーム内で同じような演出をかけたいのですが リファレンスのライト関係を見ても輝度、彩度とは書いてないようなので・・・

Page: 1 |

Re: DxLibModelViewerのように・・・ ( No.1 )
名前:管理人 日時:2010/05/03 22:22

すいません、見落としていました ライトの色( R,G,B )を輝度、彩度、色相で表現しているだけで、最終的には R,G,B の値に変換して SetLightDifColor などを使用しています H( 色相 ),L( 輝度 ),S( 彩度 )の値をR,G,Bの値に変換する関数は以下のようになっています それぞれ HLS を RGB に変換する関数と、RGB を HLS に変換する関数です 例:色相0.5 輝度1.0 彩度0.5 のHLS値からRGB値を求める float r, g, b ; ToolHLSToRGB( 0.5f, 1.0f, 0.5f, &r, &g, &b ) ; // HLSカラーからRGBカラーに変換( 0.0f 〜 1.0f ) extern int ToolHLSToRGB( float H, float L, float S, float *dr, float *dg, float *db ) { float r, g, b ; // 色相選択処理 H = fmod( H, 1.0f ) ; if( H >= 0.0f && H <= 1.0f / 6.0f ) { H = H * 6.0f ; r = 1.0f ; g = H ; b = 0.0f ; } else if( H > 1.0f / 6.0f && H <= 2.0f / 6.0f ) { H = H * 6.0f - 1.0f ; r = 1.0f - H ; g = 1.0f ; b = 0.0f ; } else if( H > 2.0f / 6.0f && H <= 3.0f / 6.0f ) { H = H * 6.0f - 2.0f ; r = 0.0f ; g = 1.0f ; b = H ; } else if( H > 3.0f / 6.0f && H <= 4.0f / 6.0f ) { H = H * 6.0f - 3.0f ; r = 0.0f ; g = 1.0f - H ; b = 1.0f ; } else if( H > 4.0f / 6.0f && H <= 5.0f / 6.0f ) { H = H * 6.0f - 4.0f ; r = H ; g = 0.0f ; b = 1.0f ; } else if( H > 5.0f / 6.0f && H <= 6.0f / 6.0f ) { H = H * 6.0f - 5.0f ; r = 1.0f ; g = 0.0f ; b = 1.0f - H ; } // 彩度と輝度の計算を行う { // 彩度が加わる r += ( 0.5f - r ) * ( 1.0f - S ) ; g += ( 0.5f - g ) * ( 1.0f - S ) ; b += ( 0.5f - b ) * ( 1.0f - S ) ; // 輝度が加わる if( L <= 0.5f ) { r *= L * 2.0f ; g *= L * 2.0f ; b *= L * 2.0f ; } else { r += ( 1.0f - r ) * ( ( L - 0.5f ) * 2.0f ) ; g += ( 1.0f - g ) * ( ( L - 0.5f ) * 2.0f ) ; b += ( 1.0f - b ) * ( ( L - 0.5f ) * 2.0f ) ; } } // 代入 if( dr ) *dr = r ; if( dg ) *dg = g ; if( db ) *db = b ; // 終了 return 0 ; } // RGBカラーからHLSカラーに変換( 0.0f 〜 1.0f ) extern int ToolRGBToHLS( float R, float G, float B, float *dh, float *dl, float *ds ) { float h, l, s, c, min, max ; // 最小値と最大値を得る max = R >= G ? ( R >= B ? R : B ) : ( G >= B ? G : B ) ; min = R <= G ? ( R <= B ? R : B ) : ( G <= B ? G : B ) ; // 最大値と最小値の差を得る c = max - min ; // 初期チェック if( R == 0.0f && G == 0.0f && B == 0.0f ) { h = 0.0f ; l = 0.0f ; s = 0.0f ; } else if( R == 1.0f && G == 1.0f && B == 1.0f ) { h = 0.0f ; l = 1.0f ; s = 0.0f ; } else if( R == G && G == B ) { h = 0.0f ; l = R ; s = 0.0f ; } else { // 色相を得る { float r, g, b, mx ; r = R - min ; g = G - min ; b = B - min ; mx = r >= g ? ( r >= b ? r : b ) : ( g >= b ? g : b ) ; r /= mx ; g /= mx ; b /= mx ; if( r == 1.0f ) { if( b == 0.0f ) { h = ( 0.0f + g ) / 6.0f ; } else { h = ( 6.0f - b ) / 6.0f ; } } else if( g == 1.0f ) { if( r == 0.0f ) { h = ( 2.0f + b ) / 6.0f ; } else { h = ( 2.0f - r ) / 6.0f ; } } else if( b == 1.0f ) { if( g == 0.0f ) { h = ( 4.0f + r ) / 6.0f ; } else { h = ( 4.0f - g ) / 6.0f ; } } } // 輝度を求める { l = ( min + max ) / 2.0f ; } // 彩度を求める { float w ; w = l > 0.5f ? ( 1.0f - l ) * 2 : l * 2 ; s = c / w ; } } if( dh != NULL ) *dh = h ; if( dl != NULL ) *dl = l ; if( ds != NULL ) *ds = s ; // 終了 return 0 ; }
Re: DxLibModelViewerのように・・・ ( No.2 )
名前:ビギナー 日時:2010/05/20 13:31

ご丁寧にありがとうございます! 返信遅れてすいません。 あまりにも低レベルな質問すぎてスルーされてしまったと思い、チェックしてませんでした・・・><

Page: 1 |