Document

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