Hybrid ccにおけるアニメーションが破綻しないための処理系の改良 修士論文中間発表 2005/10/25 上田研究室 M2 若槻 聡一郎
研究の背景および目的 Hybrid ccはハイブリッドシステム(離散的変化+連続的変化からなるシステム)の表現に適している 物体の運動 温度変化 制約を用いているため、直感的な記述で正しいアニメーションが表現可能 ※「直感的な記述」=物理の教科書に載っているような式を(プログラムの記述にしたがって)そのまま書くこと
直感的な記述で意図した通りの動作を表現したい 研究の背景および目的 ただ、現状の処理系では直感的な記述で正しいアニメーションが表現できているとは言いがたい 直感的でない記述を加えないと正しい動作をしない 自由落下+衝突 アニメーションが破綻してしまう ビリヤード 直感的な記述で意図した通りの動作を表現したい
Hybrid cc 並行制約プログラミング+連続的な動作を扱うための枠組み プログラムは以下の二つの部分の記述からなる ある時点での処理(point phase) ある時点からある時点までの間の処理(interval phase) 各記述は時間に関する微分方程式からなる 他の多くのツールと異なり、変化の大きい場所のデータを詳細に生成してくれる(他のツールは一定時間ごとのデータを出力することが多い)
並行制約プログラミング エージェント(制約ストアとやりとりを行う計算主体)と制約ストア(制約の集合)で構成 エージェントには2種類ある tell : 制約ストアに制約を追加 ask : 制約ストアにおいて制約が満たされているかを調べる x’ = 0, x = 10 if x>0 then x’’=-10 制約ストア X = 10 X’ = 0 エージェントの集合 tell ask x’ = 0, x =10, x’’ = -10 x’ = 0, x =10, x’’ = -10 x’ = 0, x = 10 if x>0 then x’’=-10 制約ストア X = 10 X’ = 0 エージェントの集合 tell ask
Hybrid ccのプログラムの記述 連続的な変化を表現するための構文としてhence構文を用いる //初期値の記述 hence{ //interval phaseでの記述 if … //point phaseへ切り替わる条件の記述 }
Hybrid cc の計算モデル 初期状態はpoint phase 以降point→interval→point→…の繰り返し interval phase stable point 制約伝播 解なし 解あり 制約ストアの状態に変化なし 制約ストアの状態が変化 (ある条件文が満たされた) abort
Hybrid ccにおける状態集合 Γ : エージェントストア σ : 制約ストア next : 次のphaseで実行されるプログラムの集合 else : else文の集合
各phaseでのアルゴリズム 否定情報の処理 point phase, interval phaseで共通 ① に対してΓ内のエージェントをσにいれ、制約を解いていく ② σが矛盾 ⇒ return 0(Constraint error) ③ elseが空 ⇒ return 1 ④ elseから1つのelse文(if c else A)をとってくる。 ⇒ ③へ ⑤ Γ→(Γ, A)としてインタプリタを実行。 結果が1 かつ ⇒ return 1 ⑥ バックトラックによって⑤を実行する前の状態まで戻り、 Γのままでインタプリタを実行。 結果が1かつ ⇒ return 1 上記以外の場合 ⇒ return 0(Default error) 否定情報の処理
本当は左側のボールが水平方向に跳ね返ることが期待される? アニメーションが破綻する例 一つの物体に対して複数の物体との衝突が同時に起こったときにDefault errorが起こる 同時に衝突 Default error 本当は左側のボールが水平方向に跳ね返ることが期待される? (c.f 部屋の角への衝突)
原因と思われる箇所 -vオプションをつけてログを追ってみた 気になるところが3つ Triggered constraint is… Last statement executed was: Unexpected failure!
Triggered constraint is… if文を満たした時にでてくる。これが同時に2回起こっている Default error(else文を選ぶ順番によって結果が変わってしまうときのエラー)の原因 ⇒“if X else Y, if Y else X”と同様? ⇒だとすると、処理系は正しく動作している
Last statement executed was: エラーが起こる前に実行していた文 この例ではc = (A.py+(-(B.py)))*1/(A.px+(-(B.px))) このこの文を削って実行したらDefault errorは起こらなくなったが、衝突時刻以降の速さが発散していた
Unexpected failure! 処理系を見た限りでは、 “Triggered constraint is…”と同じくデフォルトエラーに関係がありそう まだ調べ途中
解決方法の案 値をずらす 衝突する時間をずらす 位置をずらす 制約を合成する 複数の解の平均値を取る 制約自体を合成する
実験:衝突時間をずらす 衝突の時に片方のボールがないと仮定して衝突させる 衝突直後のパラメタを初期値としてもう片方のボールと衝突させる ⇒どちらに先に当たるかで挙動が異なった
現状の考察・課題 処理系としては正しく動作しているようだが期待した通りに動いているとはいえない 思い付いた解決方法について、具体的な方法を考えて試す必要がある
目標 Hybrid cc処理系の改良を行い、物体が同時に衝突するような例で期待通りの動きをするような実装を行う 下のような例も動くことが期待される
参考文献 Bjorn Carlson, Vineet Gupta : Hybrid cc with interval constraints, 1997. Bjorn Carlson, Vineet Gupta : The hcc Programmer’s Manual, 1999. 石井大輔 : 制約に基づくアニメーション作成システムGrifonの設計と実装, 2004. 飛田伸一 : ハイブリッド並行制約プログラミングにおける多物体衝突モデルの高速化, 2005.
図置き場1 区間値 ? ? 壁 区間値 通過
図置き場2