; e3dhsp.dll test script #include "e3dhsp3.as" ;///////////////////////////////////////////////////////// ;///////////////////////////////////////////////////////// ; 任意の線分と、sigモデルデータの面との当たり判定のサンプルです。 ; このサンプルでは、任意の線分に、ジョイント同士を結ぶ線分を指定しています。 ; この他、線分には、キャラクターの移動分の線分を指定したりすると有効だと思います。 ;  ; 矢印キーを押すと、矢印の3Dオブジェクトが、半透明の球の周りを回ります。 ; Z,Xキーを押すと、矢印と球の距離が、変化します。 ; 矢印と球の衝突地点に、「当」のビルボードを表示します。 ; 当たり判定は、ChkConfAxisで、行っています。 ; ; 線分と面との当たり判定E3DChkConfLineAndFaceは、結構、重い処理です。 ; ですので、出来るだけ、呼び出し回数を、少なくするように、心がけてください。 ; 呼び出し回数を少なくするための工夫として、 ; まず、E3DChkConflictで、おおざっぱな当たり判定を行い、 ; E3DChkConflictで、当たっていると判定されたときのみ、 ; E3DChkConfLineAndFaceを、呼び出す、などの方法が、有効です。 ; ; E3DChkConfLineAndVecのrevfaceflagで、当たっている面が、裏面かどうかを取得できます。 ; このサンプルでは、dispreverseに0をセットすると、 ; 裏面と衝突している場合には、当たりのビルボードを表示しないようにしています。 ; ;///////////////////////////////////////////////////////// ;///////////////////////////////////////////////////////// #module #deffunc waitbyfps int p1, var fps E3DWaitbyFPS@ p1, fps await 0 return #global dim keybuf, 256 screenw = 640 : screenh = 480 screen 0, screenw, screenh, 1 title "Easy3D for HSP3 sample" ;開発中は下の行のコメントアウトを外すことを推奨します。 ;E3DEnableDbgFile ;初期化 E3DInit 0, -1, 0, 16, 0, scid1 ;カメラ変数の初期化 cameradist = 5500.0 cameraheight = 0.0 camdegxz = 180.0 camposx = 0.0 camposy = cameraheight camposz = 0.0 ;file のpath 用のバッファーの作成 pathlen = 2048 sdim mediadir, pathlen mediadir = dir_cur + "\\Media" sdim pathbuf, pathlen, 2 ;projectionの変更をしたいときは、以下の2行を有効にしてください。 ;proj_near = 100 : proj_far = 20000 : proj_fov = 45 ;E3DSetProjection proj_near, proj_far, proj_fov E3DCreateProgressBar E3DSetProgressBar 0 ;地面データのロード pathbuf.0 = mediadir + "\\groundplane1_p_small.sig" E3DSigLoad pathbuf.0, hsid0 posx0 = 0.0 : posy0 = 0.0 : posz0 = 0.0 degx0 = 0.0 : degy0 = 0.0 : degz0 = 0.0 E3DSetPos hsid0, posx0, posy0, posz0 E3DSetDir hsid0, degx0, degy0, degz0 frameno0 = 0 E3DSetProgressBar 50 ;矢印データのロード pathbuf.0 = mediadir + "\\axis_invz.sig" E3DSigLoad pathbuf.0, hsid1 E3DSetPos hsid1, 0.0, 0.0, 0.0 pathbuf.0 = mediadir + "\\axis_invz_init.qua" E3DAddMotion hsid1, pathbuf.0, motid, maxframe E3DSetMotionKind hsid1, motid axisdist = 1400.0 axisdegy = 0.0 axisdegxz = 0.0 ;半透明球のロード pathbuf.0 = mediadir + "\\sphere.sig" E3DSigLoad pathbuf.0, hsid3 E3DSetPos hsid3, 0.0, 0.0, 0.0 ;当たりマークのビルボード bbwidth = 400.0 bbheight = 400.0 pathbuf.0 = mediadir + "\\atari.bmp" E3DCreateBillboard pathbuf.0, bbwidth, bbheight, 1, bbid, 1 dispreverse = 1 ;<---- 当たっている面が、裏面の時にビルボードを表示したくないときは、0を指定してください。 E3DSetProgressBar 80 ;以下、ライトの設定 lightdirx1 = 0.0 lightdiry1 = 0.0 lightdirz1 = 1.0 lightr1 = 128 lightg1 = 128 lightb1 = 128 ;平行光源 E3DCreateLight lid1 E3DSetDirectionalLight lid1, lightdirx1, lightdiry1, lightdirz1, lightr1, lightg1, lightb1 chkfps1 = 0 ;矢印の向きを制御するためのクォータニオン E3DCreateQ axisqid ; axisは、degstep / degmult 度ずつ移動する。 degstep = 2.0 degmult = 1.0 E3DDestroyProgressBar *main ; keybuf変数は、メインループの外で、dim keybuf, 256 として、確保しておいてください。 E3DGetKeyboardState keybuf if keybuf.VK_ESCAPE = 1 : goto *bye ; [ESC]で終了 E3DSetMotionFrameNo hsid1, motid, 0 gosub *MoveCamera gosub *MoveAxis E3DChkInView scid1, hsid0 E3DChkInView scid1, hsid1 E3DChkInView scid1, hsid3 gosub *ChkConfAxis ; SetMotionFrameNo(SetNewPose), ChkInViewより後。 E3DBeginScene scid1 ;不透明部分の描画をする E3DRender scid1, hsid0, 0, 0, 0 E3DRender scid1, hsid1, 0, 0, 0 ;当たりマークの表示 if( (confflag == 1) & ( (dispreverse == 1) | (revfaceflag == 0) ) ){ E3DRenderBillboard scid1 } ;半透明部分の描画をする E3DRender scid1, hsid3, 1, 0, 0 gosub *DrawText E3DEndScene E3DPresent scid1 waitbyfps 100, chkfps1 goto *main *bye E3DBye end *MoveCamera cameraupdate = 0 if ( (keybuf.VK_SHIFT == 1) && (keybuf.VK_LEFT == 1) ) { camdegxz += 1 if camdegxz > 360.0 : camdegxz -= 360.0 cameraupdate = 1 } if ( (keybuf.VK_SHIFT == 1) && (keybuf.VK_RIGHT == 1) ) { camdegxz -= 1.0 if camdegxz < 0.0 : camdegxz += 360.0 cameraupdate = 1 } if ( (keybuf.VK_SHIFT == 1) && (keybuf.VK_UP == 1) ) { camposy += 10.0 cameraupdate = 1 } if ( (keybuf.VK_SHIFT == 1) && (keybuf.VK_DOWN == 1) ) { camposy -= 10.0 cameraupdate = 1 } E3DSin camdegxz, camposx E3DCos camdegxz, camposz camposx *= cameradist camposz *= cameradist E3DSetCameraPos camposx, camposy, camposz E3DSetCameraTarget 0.0, camposy, 0.0, 0.0, 1.0, 0.0 return *MoveAxis ;矢印のキャラクタの動作制御 ; 矢印が、球の周りを回るようにする。 if ( (keybuf.VK_SHIFT == 0) & (keybuf.VK_LEFT == 1) ) { axisdegxz += degstep if ( axisdegxz > ( 360.0 * degmult ) ) { axisdegxz -= ( 360.0 * degmult ) } } if ( (keybuf.VK_SHIFT == 0) & (keybuf.VK_RIGHT == 1) ) { axisdegxz -= degstep if ( axisdegxz < 0.0 ) { axisdegxz += ( 360.0 * degmult ) } } if ( (keybuf.VK_SHIFT == 0) & (keybuf.VK_UP == 1) ){ axisdegy += degstep if ( axisdegy > ( 360.0 * degmult ) ) { axisdegy -= ( 360.0 * degmult ) } } if ( (keybuf.VK_SHIFT == 0) & (keybuf.VK_DOWN == 1) ){ axisdegy -= degstep if ( axisdegy < 0.0 ) { axisdegy += ( 360.0 * degmult ) } } if ( (keybuf.VK_SHIFT == 0) & (keybuf.'Z' == 1) ){ axisdist += 10.0; if( axisdist > 2000.0 ) { axisdist = 2000.0 } } if ( (keybuf.VK_SHIFT == 0) & (keybuf.'X' == 1) ){ axisdist -= 10.0; if( axisdist < 400.0 ) { axisdist = 400.0 } } E3DCos axisdegxz / degmult, cosxz E3DSin axisdegxz / degmult, sinxz E3DCos axisdegy / degmult, cosy E3DSin axisdegy / degmult, siny axisposx = cosxz * cosy * axisdist axisposy = siny * axisdist axisposz = sinxz * cosy * axisdist E3DSetPos hsid1, axisposx, axisposy, axisposz ; 原点の方向を向ける E3DGetDirQ2 hsid1, axisqid E3DLookAtQ axisqid, -axisposx, -axisposy, -axisposz, 0.0, 0.0, -1.0, 3, 1 E3DSetDirQ2 hsid1, axisqid return *ChkConfAxis ;まず、E3DChkConflictで、おおまかな、当たり判定をする。 E3DChkConflict hsid1, hsid3, conffirst, inviewflag if( conffirst == 1 ) { ; 矢印の青い棒のジョイントの位置を調べる E3DGetPartNoByName hsid1, "joint_center", joint_center_id E3DGetPartNoByName hsid1, "joint_blue", joint_blue_id E3DGetBonePos hsid1, joint_center_id, 1, motid, 0, centerx, centery, centerz, 1 E3DGetBonePos hsid1, joint_blue_id, 1, motid, 0, bluex, bluey, bluez, 1 ; 青い棒の部分と、球の面単位の当たり判定を行う E3DChkConfLineAndFace centerx, centery, centerz, bluex, bluey, bluez, hsid3, 1, partno, faceno, confx, confy, confz, nx, ny, nz, revfaceflag if( partno > 0 ) { ;当たっていた場合には、当たりビルボードの位置に、衝突座標をセットする。 confflag = 1 E3DSetBillboardPos bbid, confx, confy, confz } else { confflag = 0; } } return *DrawText textposx = 10 : textposy = 10 textr = 255 : textg = 255 : textb = 255 textscale = 1 sdim str5, 1024 textposx = 10 : textposy = 10 str5 = "chkfps1 " + chkfps1 E3DDrawText textposx, textposy, textscale, textr, textg, textb, str5 textposy += 20 str5 = "conffirst " + conffirst + " confflag " + confflag E3DDrawText textposx, textposy, textscale, textr, textg, textb, str5 if( confflag == 1 ){ textposy += 20 str5 = "confx " + confx + " confy " + confy + " confz " + confz E3DDrawText textposx, textposy, textscale, textr, textg, textb, str5 textposy += 20 str5 = "nx " + nx + " ny " + ny + " nz " + nz E3DDrawText textposx, textposy, textscale, textr, textg, textb, str5 textposy += 20 str5 = "revfaceflag " + revfaceflag E3DDrawText textposx, textposy, textscale, textr, textg, textb, str5 } return