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


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0131
mktHGIMG4 二つのモデルの疑似親子3解決


mkt

リンク

2016/1/31(Sun) 23:31:43|NO.74397

丸一週間苦しんでいます。
教えていただきたいことがございます。

水中を泳ぐお魚を作りたいのですが…
分離した二つのモデル
id_model //胴体
id_model2 //尾
を同時に動かしたいと思っています。


xx=x軸回転角度 yy=y軸回転角度 zz=z軸回転角度 setang id_model,xx,yy,zz setang id_model2,xx,yy,zz setpos id_model,x,y,z setpos id_model2,x+(-0.4f*sin(yy)),y,z+(-0.4f*cos(yy))

yyが変化してもこれなら自然な動きをします。
しかし、xxやzzの軸を回転させると当然のごとく
尾と胴が分離します。そこでいろいろなサイトや本を見ながら
式を組み立てたのですが、全く歯が立ちませんでした…

そこで今できるようになりたいことは
①基本的にやりたい動作は横と縦のみで
 斜めにしたくない。たとえばy軸が変化したときに
 お魚が上下運動ではなく転覆してしまうのを直したい…

②上下運動するときに、しっぽが分離しないようにしたい。

わかる方、御指南ください
ちなみに余談になるかも知れませんが
 fvdir FV,0.0f,0.0f,0.0f …パラメータの数が多すぎます
 selang id_model …文法が間違っています

というエラーがそれぞれ出て使えませんでした。

※ちなみに前回のわたしの質問もまだ未解決にしていますが
 もう少し取り組んでだめだった場合か解決した場合解決済みに
 します。いくつもスレッドを立ててすいません



この記事に返信する


暇人

リンク

2016/2/1(Mon) 01:13:34|NO.74398

最新版は試してないけど回転がからんでる命令が色々おかしい
getang、selangはそもそも命令が存在しないしfvdirはパラメータ一つでもエラーが出る
多分quat系に移行するんだろうけど、これも動作がおかしい・・・


なので自前でfvdirを再現する必要がある



暇人

リンク

2016/2/1(Mon) 22:01:45|NO.74408

最新版でも不具合は修正されていないようなので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



mkt

リンク

2016/2/1(Mon) 22:31:14|NO.74409

>暇人さま
感動のあまり言葉が出ません。
おまけも豪華すぎなくらいです!!
ありがとうございました。
一読ではモノにできていませんが、このスクリプトを
もとに考えさせていただきます!

今夜は眠れます!

すごー!



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