// // RenderTargetTextureのサンプル // レンダリング可能なテクスチャを作成し、壁から見たシーンをポリゴンに貼り付け、 // 鏡のような効果を表示するサンプルです。 // // 鏡オブジェクトはテクスチャのU座標を反転しています(左端を1.0右端を0.0にしています。) // 矢印キーでモロ星人が動きます。 ; e3dhsp.dll test script #include "e3dhsp3.as" #module #deffunc waitbyfps int p1, var fps E3DWaitbyFPS@ p1, fps await 0 return #global dim arfps, 50 dim keybuf, 256 ;file のpath 用のバッファーの作成 pathlen = 2048 sdim mediadir, pathlen mediadir = dir_cur + "\\Media" sdim pathbuf, pathlen, 2 screenw = 640 : screenh = 480 screen 0, screenw, screenh, 1 title "Easy3D for HSP3 sample" ;開発中は下の行のコメントアウトを外すことを推奨します。 ;E3DEnableDbgFile ;初期化 E3DInit 0, -1, 0, 16, 0, scid1 ;カメラの初期化 camposx = 0.0 : camposy = 800.0 : camposz = -6000.0 ctargetx = 0.0 : ctargety = 800.0 : ctargetz = 0.0 ;projectionの変更をしたいときは、以下の2行を有効にしてください。 proj_near = 100.0 : proj_far = 30000.0 : proj_fov = 60.0 E3DSetProjection proj_near, proj_far, proj_fov //キャラクター読み込み pathbuf.0 = mediadir + "\\morob_6_26_r3.sig" pathbuf.1 = mediadir + "\\morob_6_26_r3.qua" E3DSigLoad pathbuf.0, hsid1 E3DAddMotion hsid1, pathbuf.1, mk_idling, max_idling E3DSetMotionKind hsid1, mk_idling posx = 0.0 posy = 0.0 posz = -2000.0 E3DSetPos hsid1, posx, posy, posz //地面読み込み pathbuf.0 = mediadir + "\\plane4.mqo" E3DLoadMQOFileAsGround pathbuf.0, 100.0, hsid2 E3DSetPos hsid2, 0, 0, 0 //鏡面の読み込み pathbuf.0 = mediadir + "\\mirror2.sig" E3DSigLoad pathbuf.0, hsid3, , 2.0 E3DSetPos hsid3, 0, 0, 2000 E3DSetDir hsid3, 0, 15, 0 E3DGetMaterialNoByName hsid3, "鏡面", materialno E3DGetBoneNoByName hsid3, "視点位置", viewbone0 E3DGetBoneNoByName hsid3, "注視点", viewbone1 E3DGetBonePos hsid3, viewbone0, 1, -1, 0, vposx0, vposy0, vposz0 E3DGetBonePos hsid3, viewbone1, 1, -1, 0, vposx1, vposy1, vposz1 //レンダーターゲットテクスチャの作成 E3DCreateRenderTargetTexture 256, 256, scid2, texid2, okflag if( okflag == 0 ){ dialog "レンダーターゲットテクスチャが作成できません。\nプログラムを終了します。" goto *bye } //レンダーターゲットテクスチャを鏡面に貼り付ける。 E3DSetTextureToMaterial hsid3, materialno, texid2 //ライトの作成 lightdirx1 = 0.0 lightdiry1 = -1.0 lightdirz1 = 1.0 lightr1 = 255 lightg1 = 255 lightb1 = 255 E3DCreateLight lid1 E3DSetDirectionalLight lid1, lightdirx1, lightdiry1, lightdirz1, lightr1, lightg1, lightb1 chkfps1 = 0 *main ; keybuf変数は、メインループの外で、dim keybuf, 256 として、確保しておいてください。 E3DGetKeyboardState keybuf if keybuf.VK_ESCAPE = 1 : goto *bye ; [ESC]で終了 gosub *MoveChara //鏡に張り付けるテクスチャへのレンダリング //E3DCreateRenderTargetTextureで得たscid2を使用しているところに注目! //鏡から見たシーンをテクスチャにレンダリング //テクスチャへのレンダリング時にはE3DPresentは必要ない。 E3DSetCameraPos vposx0, vposy0, vposz0 E3DSetCameraTarget vposx1, vposy1, vposz1, 0.0, 1.0, 0.0 E3DBeginScene scid2 E3DChkInView scid2, hsid1 E3DChkInView scid2, hsid2 E3DChkInView scid2, hsid3 ;不透明部分の描画をする E3DRender scid2, hsid1, 0, 0, 0 E3DRender scid2, hsid2, 0, 0, 0 E3DRender scid2, hsid3, 0, 0, 0 ;半透明部分の描画をする E3DRender scid2, hsid1, 1, 0, 0, 0, 0, 1 E3DRender scid2, hsid2, 1, 0, 0, 0, 0, 1 E3DRender scid2, hsid3, 1, 0, 0, 0, 0, 1 E3DEndScene //通常シーンのレンダリング //E3DInitで得たscid1を使用。 E3DSetCameraPos camposx, camposy, camposz E3DSetCameraTarget ctargetx, ctargety, ctargetz, 0.0, 1.0, 0.0 E3DBeginScene scid1 E3DChkInView scid1, hsid1 E3DChkInView scid1, hsid2 E3DChkInView scid1, hsid3 ;不透明部分の描画をする E3DRender scid1, hsid1, 0, 0, 0 E3DRender scid1, hsid2, 0, 0, 0 E3DRender scid1, hsid3, 0, 0, 0 ;半透明部分の描画をする E3DRender scid1, hsid1, 1, 0, 0, 0, 0, 1 E3DRender scid1, hsid2, 1, 0, 0, 0, 0, 1 E3DRender scid1, hsid3, 1, 0, 0, 0, 0, 1 gosub *DrawText E3DEndScene E3DPresent scid1 waitbyfps 60, chkfps1 arno = 0 repeat 49 befno = 48 - arno aftno = 49 - arno arfps.aftno = arfps.befno arno++ loop arfps.0 = chkfps1 goto *main *bye E3DBye end *DrawText textr = 255 : textg = 255 : textb = 255 textscale = 1 lcnt = 0 avfps = 0 repeat 50 avfps += arfps.lcnt lcnt++ loop avfps = avfps / 50 textposx = 10 : textposy = 80 strchk3 = "avfps " + avfps E3DDrawText textposx, textposy, textscale, textr, textg, textb, strchk3 textposx = 10 : textposy = 140 strchk3 = "chkfps1 " + chkfps1 E3DDrawText textposx, textposy, textscale, textr, textg, textb, strchk3 return *MoveChara E3DSetNewPose hsid1, frameno1 forwardstep = 100.0 backstep = -100.0 degstep = 5.0 mdegstep = -degstep ; VK_ が頭につく、定数の詳細は、e3dhsp_vk.as をご覧ください。 ; keybuf は、GetKeyboardState 命令で、セットされます。 if keybuf.VK_UP = 1 : E3DPosForward hsid1, forwardstep ;矢印上 if keybuf.VK_DOWN = 1 : E3DPosForward hsid1, backstep ;矢印下 if keybuf.VK_LEFT = 1 : E3DRotateY hsid1, mdegstep ;矢印左 if keybuf.VK_RIGHT = 1 : E3DRotateY hsid1, degstep ;矢印右 return