忍者ブログ
お知らせと画力修行用に開設しました。よろしくお願いします!
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

配列を使って個別にバイペットを代入させて個別に判定させる
理論上は何体でも個別に当りを取れるけど、、、人数分の変数を
用意しないといけなくて面倒、、手打ちでやるには効率が悪すぎるので
何か良い手段はないかな、、?



ここから======================
--当たり判定を取ってモーションを変えるサンプル
-- Script for Crowd system
-- Set/unset preferred clips at times
-- flipperdesign
bips = #()
fn PerFrameFn crwd time =
(
IF (time == 1f) then
(
Print "Script active!"
)

-- 複数のbipを代入する

a=#()
a[1]=$Bip001
a[2]=$Bip002
a[3]=$Bip003

-- 複数の命令用変数を代入する1で命令を実行する

b=#()
b[1]=0
b[2]=0
b[3]=0

-- 命令を書き込む

--判定半径--

HANTEI=100

--座標代入--

YPOS=#()
XPOS=#()

YPOS2=#()
XPOS2=#()

q=#()
q2=#()

YPOS[1]=$Sphere001.pos.y
XPOS[1]=$Delegate001.simpos.y
YPOS2[1]=$Sphere001.pos.X
XPOS2[1]=$Delegate001.simpos.X

YPOS[2]=$Sphere002.pos.y
XPOS[2]=$Delegate002.simpos.y
YPOS2[2]=$Sphere002.pos.X
XPOS2[2]=$Delegate002.simpos.X

YPOS[3]=$Sphere003.pos.y
XPOS[3]=$Delegate003.simpos.y
YPOS2[3]=$Sphere003.pos.X
XPOS2[3]=$Delegate003.simpos.X


for i=1 to 3 do (

--当たり判定

q[i]=YPOS[i]-XPOS[i]
q2[i]=YPOS2[i]-XPOS2[i]

--100以内に入ったら1を返す
IF (abs q2[i]< HANTEI)and(abs q[i]< HANTEI)then
(

Print "ATARI"
Print HANTEI
b[i]=1
)else(
b[i]=0
)

-- 複数の命令を回す--

IF (b[i] == 1) then(

format "building biped list\n"
bips = for obj in objects
where (classof obj == Biped_Object and
obj.controller.rootNode == obj) collect obj
for bip in bips do
(
bipCtrl = a[i].controller
biped.addprefclip bipCtrl "Laugh" 100
bipCtrl = a[i].controller
)

)

)
)
ここまで=========================

最終的には軍隊どうしの合戦を群集で出来きるようになりたいんだけど、、
纏まった時間がないと研究が出来ないので時間をいかに作るかが課題だとおもう。

拍手

PR
まずはトリガーから、ちなみに自分はデザイナーなのでプログラムは素人ですので
へっぽこコードです。

Sphere001の100座標に入ったらトリガーをONにするコードです。



ここから======================
--初期定数を指定。
bips = #()
--トリガーにさわったら1になる
global testON=0
fn PerFrameFn crwd time =
(

Print testON

--当たり判定のコードになります。

--座標代入 、、simposはシュミレーションの座標が取れる特別な変数
YPOS=$Sphere001.pos.y
XPOS=$Delegate001.simpos.y

YPOS2=$Sphere001.pos.X
XPOS2=$Delegate001.simpos.X

--判定半径
HANTEI=100

q=YPOS-XPOS
q2=YPOS2-XPOS2

--座標から当たり判定をとる。
IF (abs q2< HANTEI)and(abs q< HANTEI)then
(

testON=1
Print "ATARI"
Print HANTEI
) else(
testON=0
)


IF (testON == 1) then
(
Print "Script active!"
)

--トリガーがONになるとモーションが発動する
-- set action at given frame
IF (testON == 1) then
(
format "building biped list\n"
bips = for obj in objects
where (classof obj == Biped_Object and
obj.controller.rootNode == obj) collect obj
for bip in bips do
(
bipCtrl = bip.controller
biped.addprefclip bipCtrl "Laugh" 100
Print("Frame 400 - addprefclip: Laugh")
)
bipCtrl = $Bip01.controller
Print ("Remaining Clip pref: " +(biped.numPrefClips bipCtrl) as string)
)

-- set action at given frame
IF (testON == 1) then
(
format "building biped list\n"
bips = for obj in objects
where (classof obj == Biped_Object and
obj.controller.rootNode == obj) collect obj
for bip in bips do
(
bipCtrl = bip.controller
biped.deleteprefclip bipCtrl "Laugh"
Print("Frame 700 - deleteprefclip: Laugh")
)
bipCtrl = $Bip01.controller
Print ("Remaining Clip pref: " +(biped.numPrefClips bipCtrl) as string)
)

)
ここまで=========================

このコードで当り判定をとれましたが、、、全部が同じ動きをしてしまいます、、
次は個別に割り当てができるように改造していきます。

拍手

これが海外のサイトで見つけたコードです↓

ここから======================
-- Script for Crowd system
-- Set/unset preferred clips at times
-- flipperdesign
bips = #()
fn PerFrameFn crwd time =
(
IF (time == 1f) then
(
Print "Script active!"
)

-- set action at given frame
IF (time == 400f) then
(
format "building biped list\n"
bips = for obj in objects
where (classof obj == Biped_Object and
obj.controller.rootNode == obj) collect obj
for bip in bips do
(
bipCtrl = bip.controller
biped.addprefclip bipCtrl "Laugh" 100
Print("Frame 400 - addprefclip: Laugh")
)
bipCtrl = $Bip01.controller
Print ("Remaining Clip pref: " +(biped.numPrefClips bipCtrl) as string)
)

-- set action at given frame
IF (time == 700f) then
(
format "building biped list\n"
bips = for obj in objects
where (classof obj == Biped_Object and
obj.controller.rootNode == obj) collect obj
for bip in bips do
(
bipCtrl = bip.controller
biped.deleteprefclip bipCtrl "Laugh"
Print("Frame 700 - deleteprefclip: Laugh")
)
bipCtrl = $Bip01.controller
Print ("Remaining Clip pref: " +(biped.numPrefClips bipCtrl) as string)
)

)
ここまで=========================

群集の海外のサイト





スプリクトにコピペすれば使えます。
本当すばらしいコードだと思いました。これはフレームで違うモーションに変わる
ものですが、これを改造すれば、色々実現できると思いました。






このコードを改造したい所は、、
①全てのバイペットが同じタイミングでモーションが変わってしまうので個別で指定したい。
②トリガーを触ったらモーションを発動させるようにさせたい。

これを実現できたらかなりの事ができるきと思います。



拍手

最近更新していませんでしたが、制作活動はしています。最近転職してmaxからmayaの
作業になりました。mayaか~きついな~と思っていましたが、なれるとmayaでもいいかって
感じになりました。

話を本題にもどしますが昔からmaxに付いている群衆システムに興味があり調べてましたが
日本語のサイトではリファレンス以上情報がありませんでした。海外のサイトとか
動画サイトで情報をあつめました。いままで色々なサイトの情報で救われてきたので
集めた情報も誰 かの役に立つかもしれなと思いまして情報の海に置いておきます。


maxの群集ですが新しく入った奴では無く何年もバージョンアップもしていない
こっそり存在している方です。




このあたりはリファレンスに載ってますので詳しい説明はしませんが
代理オブジェクトに命令を与えてアニメーションをさせるシステムです。

色々遊ぶと面白いです。




このシステムで面白いのはキャラスタジオに完全に統合されてる点です。
モーションフローを組んで共通モーションフロー割り当てれば
キャラスタジオのアニメーションファイルを使って群集アニメーションをしてくれます。

最近使ってませんが、、使い慣れたキャラスタでアニメーションをつけてれるのは
maxユーザーにとっては使いやすと思います。

今回は歩く、10度曲がる、45度曲がる、90度曲がる、、を左右のファイルを
足跡機能5分で作りました。






代理オブジェクトとキャラスタを同じ数複製しまて共通モーションフローと代理オブジェクト
を割り当てます。



単純な探索の思考の群集ならこれでできますが、、もっと高度な思考を持たせたかった
んだけど、その為にはスクリプトを書かないと実現できない、、突っ込んだ
リファレンスが何処にも無かった、、でも海外サイトに凄くよいサンプルコード見つけたので
次はこれを紹介します。


拍手



カレンダー
02 2024/03 04
S M T W T F S
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
プロフィール
マッチーウェブサイト(本家)本家のサイトです。こちらもよろしくお願いします。

ハンドルネーム:machiee(マッチー)

3DCG作ってます。

リンクはもちろんフリーです!
最新コメント
バーコード
ブログ内検索
最古記事
P R
Template by Crow's nest 忍者ブログ [PR]