最新版でも不具合は修正されていないようなのでfvdir命令を追加するモジュールを作ってみた
かならず#include "hgimg4.as"の後に挿入
hgimg3のとは少し違いY軸を反転しなくて良い
#include "hgimg4.as"
#module
#undef fvdir
#deffunc fvdir array fv,double _vx,double _vy,double _vz
dup ay,fv(1) //実数の配列を3回以上参照するよりdupで変数にした方がちょっとだけ軽い
dup az,fv(2)
vx=_vx*cos(az)-_vy*sin(az)
vy=_vx*sin(az)+_vy*cos(az)
vx1=vx*cos(ay)+_vz*sin(ay)
vz1=-vx*sin(ay)+_vz*cos(ay)
fv(1)=vy*cos(fv)-vz1*sin(fv)
fv(2)=vy*sin(fv)+vz1*cos(fv)
fv=vx1
return
#global
gpreset
setcls CLSMODE_SOLID, $4040
setcolor GPOBJ_LIGHT, 1,1,1 ; ライトカラーを設定
setdir GPOBJ_LIGHT, 0.5,0.5,0.5 ; アンビエントカラーを設定
chdir dir_exe+"\\sample\\\hgimg4"
gpload id_model,"res/duck" ; モデル読み込み
gpclone id_model(1), id_model ; 最初のモデル以降はクローン
xx=0.0
yy=0.0
zz=0.0
setpos id_model,0,0,0
//おまけで子の接続位置を後方にずらして角度を変えるサンプル(オイラー角回転なのでXZ軸両方回転させるとおかしくなる)
gpclone id_Parent, id_model
gpclone id_Child, id_model
Parent_angx=0.0
Parent_angy=0.0
Parent_angz=0.0
Child_angx=0.0
Child_angy=0.0
Child_angz=0.0
setpos id_Parent,0,-3,10
setpos GPOBJ_CAMERA,0.0,00.0,20.001
repeat
stick key,15
if key&128 : end
redraw 0 ; 描画開始
; カーソルキーでカメラ位置を動かす
if key&1 : addpos GPOBJ_CAMERA, -1, 0
if key&4 : addpos GPOBJ_CAMERA, 1, 0
if key&8 : addpos GPOBJ_CAMERA, 0, 1
if key&2 : addpos GPOBJ_CAMERA, 0, -1
yy+0.04
xx+0.03
zz+0.01
getpos id_model,x,y,z
gplookat GPOBJ_CAMERA, x,y,z ; カメラから指定した座標を見る
setpos id_model,x,y,z
setang id_model,xx,yy,zz
setang id_model(1),xx,yy,zz
fvset fv,xx,yy,zz
fvdir fv,-1.5, 0.0, 0.0
setpos id_model(1),x+fv,y+fv(1),z+fv(2)
//おまけ
Parent_angx=sin(0.02*cnt)
Parent_angy+0.01
angx=Parent_angx
angy=Parent_angy+sin(0.1*cnt)*0.4
angz=Parent_angz
setang id_Parent,angx,angy,angz //親の見た目のアングル
fvset fv,Parent_angx,Parent_angy,Parent_angz //進む方向
fvdir fv,0.05, 0.0, 0.0
selpos id_Parent
objaddfv fv
getpos id_Parent,x,y,z
setpos id_Child,x,y,z
Child_angy=-sin(0.1*cnt)*0.6 //子の角度
setang id_Child,angx,angy,angz //親の見た目の角度をセット
addang id_Child,Child_angx,Child_angy,Child_angz //子の角度を追加
fvset fv,angx,angy,angz //親の見た目のアングルから後方のローカル座標
fvdir fv,-0.8, 0.0, 0.0
fvset cfv,Child_angx,Child_angy,Child_angz //getangが無いので・・・
fvadd cfv,angx,angy,angz
fvdir cfv,-0.8, 0.0, 0.0
fvadd fv,cfv,cfv(1),cfv(2) //後方のローカル座標に加算
selpos id_Child
objaddfv fv
gpdraw ; シーンの描画
redraw 1 ; 描画終了
await 1000/60 ; 待ち時間
loop