HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0621
カレーhgimg3のライティング?3解決


カレー

リンク

2013/6/21(Fri) 18:38:40|NO.55145

hgimg3にて実装されていないスポットライト風の処理をしたいと思っています。
例えば暗い洞窟の中で自分の周りだけ明るく見えている。
といった演出なのですが、カメラから離れるとオブジェクトの色が暗くなるという処理でも良いと思っています。
3Dゲーム開発は疎いのですが、これは所謂フォグに当たる処理でしょうか??

どちらにせよhgimg3の方での標準命令では実現不可能という認識です。
力業的な裏技がありましたら御教示くださいませ。



この記事に返信する


暇人

リンク

2013/6/22(Sat) 04:37:36|NO.55155

目的の処理がフォグで実現できるかは分からないけど

hgimg3にフォグ設定を追加するモジュール

#module "mod_hgsetfog" #usecom IDirect3DDevice8 "{7385E5DF-8FE8-41D5-86B6-D7B48547B6CF}" #comfunc IDirect3DDevice8_AddRef 1 #comfunc IDirect3DDevice8_SetRenderState 50 int,int #comfunc IDirect3DDevice8_SetRenderStateF 50 int,float #define D3DRS_FOGENABLE 28 #define D3DRS_FOGCOLOR 34 #define D3DRS_FOGTABLEMODE 35 #define D3DRS_FOGSTART 36 #define D3DRS_FOGEND 37 #define D3DRS_FOGDENSITY 38 //フォグモード定数 #define global D3DFOG_NONE 0 //フォグエフェクト無し(フォグカラーで塗りつぶされる感じ) #define global D3DFOG_EXP 1 //指数フォグ モード(フォグの密度を設定できる、距離に応じて全体にフォグがかかる、小さい程密度薄い、設定範囲0.0〜1.0) #define global D3DFOG_EXP2 2 //指数フォグ モード #define global D3DFOG_LINEAR 3 //線形フォグ モード(カメラからの距離で始点終点を設定できる) //フォグ設定(必ずhginiの後に実行) //hgsetfog fog_set ,fog_color ,fog_mode ,fog_start ,fog_end //fog_set = フォグオンオフ 0=OFF 1=ON (省略時0)  //fog_color = フォグカラー($RRGGBB) //fog_mode = フォグモード http://msdn.microsoft.com/ja-jp/library/cc324334.aspx を参照(省略時3=始点と終点の間で線形にフォグエフェクトが増す) //fog_start = fog_modeがD3DFOG_LINEARの時フォグ始点カメラ距離(省略時0.5)  fog_modeが1か2の時フォグの密度 //fog_end = fog_modeがD3DFOG_LINEARの時フォグ終点カメラ距離(省略時768.0) #define global hgsetfog(%1=0,%2=0,%3=3,%4=0.5,%5=768.0) _hgsetfog %1,%2,%3,%4,%5 #deffunc _hgsetfog int fog_set,int fog_color,int fog_mode,double fog_start,double fog_end if vartype(com_PTRD3DDEV) ! 6 { hggetreq ret_PTRD3DDEV,SYSREQ_PTRD3DDEV newcom com_PTRD3DDEV, , -1, ret_PTRD3DDEV IDirect3DDevice8_AddRef com_PTRD3DDEV //HGIMG3側のRelease回数と数が合わなくなるっぽいので増やしとく } if fog_set=1 { IDirect3DDevice8_SetRenderState com_PTRD3DDEV,D3DRS_FOGENABLE,fog_set IDirect3DDevice8_SetRenderState com_PTRD3DDEV,D3DRS_FOGCOLOR,fog_color IDirect3DDevice8_SetRenderState com_PTRD3DDEV,D3DRS_FOGTABLEMODE,fog_mode if fog_mode=D3DFOG_LINEAR{ IDirect3DDevice8_SetRenderStateF com_PTRD3DDEV,D3DRS_FOGSTART,fog_start IDirect3DDevice8_SetRenderStateF com_PTRD3DDEV,D3DRS_FOGEND,fog_end }else{ IDirect3DDevice8_SetRenderStateF com_PTRD3DDEV,D3DRS_FOGDENSITY,fog_start } }else{ IDirect3DDevice8_SetRenderState com_PTRD3DDEV,D3DRS_FOGENABLE,0 } return #global
これをファイル名 mod_hgsetfog.hsp で保存したとして
使用サンプル

#include "hgimg3.as" //必ずhgimg3.asの後にincludeする #include "mod_hgsetfog.hsp" screen 0,640,480,0 hgini setcolor 255 addbox mdid,5,5 ; BOXモデルを作成 regobj Center_objid,mdid ; BOXモデルをオブジェクトとして登録 dircur=dir_cur chdir dir_exe+"\\sample\\hgimg3" addxfile xmdid,"font_a.x" ; モデルを読み込む modelorder xmdid,HGMODEL_ROTORDER_ZYX //通常モデルと同じ回転順序にする repeat 100 regobj mychr(cnt),xmdid ;,OBJ_SORT;OBJ_LATE;OBJ_HIDE setpos mychr(cnt),50.0-0.1*rnd(1000),50.0-0.1*rnd(1000),100.0-0.1*rnd(2000) loop addxfile m_xmodel,"sb_bg1.x" chdir dircur modelshade m_xmodel,0 regobj b_obj, m_xmodel setpos b_obj,0,20,0 setscale b_obj, 1,0.2,1 bgcolor=$80 fogmode=D3DFOG_EXP str_fogmode="D3DFOG_NONE","D3DFOG_EXP","D3DFOG_EXP2","D3DFOG_LINEAR" title str_fogmode(fogmode) //フォグON ,フォグカラーに背景色と同じ設定 ,指数フォグモード ,フォグ密度0.01設定 hgsetfog 1, bgcolor, D3DFOG_EXP, 0.01 clscolor bgcolor ; 背景色の設定 *main hgdraw ; 描画処理 hgsync 16 ; 時間待ち stick k,127-16 if k&128 : goto *owari ; [ESC]で終了 if k&2 : cz=0.5 if k&8 : cz=-0.5 if k&1 : cx=0.5 if k&4 : cx=-0.5 //スペースでフォグモード変更 D3DFOG_EXP,D3DFOG_EXP2,D3DFOG_LINEARを順番に回す if k&16 { fogmode=(fogmode\D3DFOG_LINEAR)+1 if fogmode=D3DFOG_LINEAR { //線形フォグモードでカメラ距離30〜200にフォグエフェクト hgsetfog 1, bgcolor, D3DFOG_LINEAR, 30.0, 200.0 }else{ hgsetfog 1, bgcolor, fogmode, 0.01 } title str_fogmode(fogmode) } addpos HGOJB_CAMERA,cx,0,cz cx=0.0 cz=0.0 goto *main *owari end


フォグにはもっと色々設定できるらしいけど
Directxインストしてもd3dx8.dllが無いのでHSPだけじゃ無理っぽい
数時間調べただけだから詳しくは分からないが・・・



Makoto

リンク

2013/6/22(Sat) 11:33:05|NO.55157

ものすごく簡単にスポットライト風の処理をするならば、
中央に丸く透明な部分を設定したPNG画像などを画面の手前に置く、という方法もあります。
(昔のゲームでは使われていた方法ですね)
ただ、上方からの視点ならいいですが、水平方向からの視点だと少々不自然かもしれません。

他には、自分の位置からの距離によって、オブジェクトの透明度を大きくしていくという方法もあります。
背景の色を黒にすれば、暗くて見えない感じになり、背景を白にすれば、フォグっぽくなります。

>暇人さん
こんなことができたんですね。
早速参考にされていただきます。



カレー

リンク

2013/6/22(Sat) 16:09:46|NO.55158

>>暇人さん
おお、こんなものが・・
今自前でフォグっぽいのを実装していたところなのですが、
カメラの座標をうまく反映できなくて時間かかってるところでした。
早速自分のプログラムに組み込んだ所想定していた演出ができました。
本当にありがとうございました!

>>Makotoさん
情報ありがとうございます。
その手法は2Dゲームの時に使っていましたね。
今回のゲームは3D一人称なのでそれは使えないんですよ



ONION software Copyright 1997-2023(c) All rights reserved.