2015年04月29日

経路

ss.jpg

移動経路まで完了。
次回からようやく移動アニメ部分だけど、今週末はあまり進まないかも。

あとやっぱりカメラ操作もMクリックでの操作にしたほうが楽そう。
いちいち右上にマウスもってくるのがうざくなってきた。。
サーフェスのアークマウスは持ち運びにはいいけど、Mクリック周りが使えなさすぎるんだよなぁ



SRPG STUDIO
4/10に新発売。
手軽にファイアーエムブレム系作れそうでいいですねぇ
細かいところはJavaScriptでいじれたり、プラグインも作れたりして拡張性もありそう。
群雄割拠の現在、新興勢力となるか!?

posted by bt at 20:51| Comment(0) | hgimg3 | このブログの読者になる | 更新情報をチェックする

移動エリア

ss.jpg

なんか難しいので
特に処理速度追求しないで、身の丈にあった簡単なアルゴリズムにした(´・ω・`)
まずは高さの概念とかいれないで進める。

posted by bt at 01:19| Comment(0) | hgimg3 | このブログの読者になる | 更新情報をチェックする

2015年04月27日

カメラ

030.jpg

カメラ操作部分はほぼ完了。
右上のシンボルをマウスでLRすれば回転、ズームする仕様。
あと全体を見下ろせる機能もそのうち。
とりま旧Sevenレベルに復旧する方向で、最低限必要なことだけ追加していこう。
次回から移動部分へ
posted by bt at 22:56| Comment(0) | hgimg3 | このブログの読者になる | 更新情報をチェックする

2015年04月26日

カーソル



とりまこんな感じ。
カーソルは板ポリ1枚にテクスチャ貼り付けのほうがいいかな。
今後地形に沿って頂点変形させる必要ありそうだし。

カメラは自由操作でなくほぼ固定方式にします。
たぶん自由度無い方が逆に操作しやすい。


posted by bt at 12:58| Comment(2) | hgimg3 | このブログの読者になる | 更新情報をチェックする

2015年04月25日

地面との線分判定 hghit2修正

やっぱmeshhitの計算おかしかったみたい。
とりま修正して地面モデルを正常にクリックできるようになりました。
Xモデルと線分判定を行い面番号やマテリアル番号も取得できます。
hghit2修正版はそのうちうpします。
処理速度はまだ調べてないですが、たぶん面数が多いほど重いw

ただ交点の面番号取得してもモデル側の面の順番がめちゃくちゃだったので
これをうまく頂点座標から格子状データとリンクとれるようにしたい。
せっかく面番号取得できるのだから面単位でいろいろ管理したいところ。
移動可能範囲を表示するにも面単位だしなぁ

032.jpg
またおまえか、ということで百人乗っても大丈夫!
アニメーションつきでも、さすがの軽さであるw

他の処理にも使うからこのくらいがいいとこか。
シミュだと地面との衝突判定ほとんどいらないから軽いですな。
まぁ出撃ユニットの最大数は20くらいがいいとこだし、小隊規模での管理が描画的に妥当かな。
全部一つのクローンモデルだけど、描画としては別々モデルの場合も同じだろう。
SurfacePro3での測定だから、もっと低スペックPCだと当然数も減らさざるをえない。

ちょっと面倒なのでとりま下記のソースを
hghit2モジュールのmeshhit命令の部分と入れ替えて使用してください。
一つの面に衝突していることがわかると残りは調査せずbreakするようになってますので
必要なら各自改良してください。

//線分判定
#module

//わかりやすくするため定義
#define x 0
#define y 1
#define z 2

#deffunc meshhit2 array aa, array cpos, array rvec, int mode, var result, var fno, array fn, var fmat
//meshhit aa, px, py, pz, vx, vy, vz, result
//aa ポリゴンデータ(loadgroundしたもの)
//cpos 始点座標
//rvec 始点からのレイベクトル
//mode 衝突モード 0=裏面 1=表面
//result 衝突結果
//fno 面番号
//fn 面法線
//fmat 面マテリアル


result=0 //初期化

repeat aa(3,0,0) //三角面数分行う
cn=cnt //カウンタ

//まず、面がベクトルに対して表か裏かを判別
nx=aa(6,x,cn) //正規化された面法線
ny=aa(6,y,cn)
nz=aa(6,z,cn)
vec=nx,ny,nz
fvinner vec, rvec(x), rvec(y), rvec(z) //面法線とレイベクトルの内積 正は裏 負は表 vec(0)に数値が返る

if mode=0 { //表面との衝突モードの場合
if vec(0) <= 0 :continue //裏面(負)と真横(0)ならパス
}else { //裏面との衝突モードの場合
if vec(0) >= 0 :continue //表面(正)と真横(0)ならパス
}

//以下衝突判定
PN=rvec(x)*nx + rvec(y)*ny + rvec(z)*nz //始点からのベクトルと法線との内積
PL=(aa(0,x,cn)-cpos(x))*nx + (aa(0,y,cn)-cpos(y))*ny + (aa(0,z,cn)-cpos(z))*nz //面と始点との距離
TT=PL/PN //始点からのびるベクトルの交点までのスカラー値(割合)

if (TT>0) & (TT<1) {//Pからベクトル最大値までの間に交点がある場合(線分の間に交点がある場合)

p(x)=cpos(x)+(rvec(x)*TT) //交点
p(y)=cpos(y)+(rvec(y)*TT)
p(z)=cpos(z)+(rvec(z)*TT)

//頂点indexからベクトル外積算出
//2→0 0→p
vec0=aa(0,x,cn)-aa(2,x,cn), aa(0,y,cn)-aa(2,y,cn), aa(0,z,cn)-aa(2,z,cn)
vec1=p(x)-aa(0,x,cn), p(y)-aa(0,y,cn), p(z)-aa(0,z,cn)
fvunit vec0 //正規化
fvunit vec1
fvouter vec0, vec1(x), vec1(y), vec1(z) //外積
AAx=vec0(x) :AAy=vec0(y) :AAz=vec0(z)

//0→1 1→p
vec0=aa(1,x,cn)-aa(0,x,cn), aa(1,y,cn)-aa(0,y,cn), aa(1,z,cn)-aa(0,z,cn)
vec1=p(x)-aa(1,x,cn), p(y)-aa(1,y,cn), p(z)-aa(1,z,cn)
fvunit vec0 //正規化
fvunit vec1
fvouter vec0, vec1(x), vec1(y), vec1(z) //外積
BBx=vec0(x) :BBy=vec0(y) :BBz=vec0(z)

//1→2 2→p
vec0=aa(2,x,cn)-aa(1,x,cn), aa(2,y,cn)-aa(1,y,cn), aa(2,z,cn)-aa(1,z,cn)
vec1=p(x)-aa(2,x,cn), p(y)-aa(2,y,cn), p(z)-aa(2,z,cn)
fvunit vec0 //正規化
fvunit vec1
fvouter vec0, vec1(x), vec1(y), vec1(z) //外積
CCx=vec0(x) :CCy=vec0(y) :CCz=vec0(z)

DotAB=(AAx*BBx)+(AAy*BBy)+(AAz*BBz) //内積で同じ方向かを判定
DotBC=(BBx*CCx)+(BBy*CCy)+(BBz*CCz)
DotCA=(CCx*AAx)+(CCy*AAy)+(CCz*AAz)

if (DotAB>0) & (DotBC>0) & (DotCA>0) {//3つ同じ方向なら 三角形内に点有り→よって衝突

result=1
cpos=p(x),p(y),p(z) //交点座標
fno=cn //面番号
fn=nx,ny,nz //面法線
fmat=int(aa(7,0,cn)) //マテリアル番号
break

}

}
loop


return
#global

posted by bt at 11:28| Comment(0) | hgimg3 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。