2012年11月

2012年11月30日

modo601が来た! その73 modo601 SP4

今回もモーターについて調べてみたい。

前回は回転についてちょっと調べてみた。今回は直線運動の方を主に調べてみたい。

fig12

でもその前に、コンストレイントをいろいろいじってようやく分かってきた事がある。それはボディAとボディBの違いだ。

いまさら・・・と思うかも知れないけど、例えば下のようにパッシブリジッドボディのキューブとアクティブリジッドボディの球体をポイントコンストレイントで繋いだ場合、

fig01

ボディAをキューブにしてボディBを球にするのが通常のやり方だ。

fig02

これがそのシミュレーション結果。ポイントコンストレイントの関節の部分を中心に球が回転しているのがわかる。

fig04

今度はボディAとボディBを入れ替えてみた。

fig03

これがシミュレーション結果。上の画像とコンストレイントから出ている枝の色が入れ替わっているのがわかると思う。でも結果は同じだ。

fig05

こう見るとまるで違いが無いようにも思えるんだけど、ボディAかボディBを「なし」にしてみると違いが出てくる。

まずはボディAを「なし」にして、ボディBに球を設定した場合。

fig07

通常、コンストレイントの子となると思われるボディBにアクティブリジッドボディのアイテムを設定し、親となるボディAを「なし」にすれば、ワールド座標系と親子関係が結ばれると想像できる。しかし結果は以下の通り、球体は落下して行ってしまった。

fig09

今度は球をボディAに設定した場合。

fig06

今度は球体がワールド座標系にコンストレイントされた。

fig08

この現象がどう起きているのかはわからないけど、ワールド座標系に対してコンストレイントを使いたい場合はボディBを「なし」にするしかなさそうだ。

そしてモーターではこれが作用反作用として現れて、ボディBを回したり押したりする力は反作用としてボディAに返って来る。だからリニア目標速度や角度目標速度、またはコンストレイントのアイコンの矢印で示された力の方向はボディAには逆方向の力として現れる。

fig12

そしてモーターの場合、回転軸や押し出し方向はボディBのアイテムにペアレントされた形で動くようだ。前回、ボディAを固定して回転させた時にボディBが暴れたのはこのせいでなんじゃないかと思っているところだ。ボディBが回転するとモーター自身も回転するようなもんだからちょっとしたことで回転軸がブレたら、回転がどんどん変わっていってしまうわけだね。

さて、直線方向の推進力に関する話だけど「リニア有効」をONにするとこの力がモーターのX軸の方向に働きだし、「リニア目標速度」がこの力で到達させたい速度で、その推進力の最大値が「リニア最大パワー」なのは回転のものと同じだ。パワーはいくら大きくしても速度は目標速度を超える大きさにはならないけど、パワーを大きくすると目標速度になるまでの時間が短くなるわけだね。

で、この力なんだけど、モーターの基点に作用して、その基点はボディBにペアレントされた状態になるようだ。例えば下のシーンはパッシブリジッドボディのキューブと、アクティブリジッドボディの球をモーターで結び、球はヒンジコンストレイントでワールド座標系と繋いである。

fig10

この状態でリニア有効をON、角度有効をOFFにして、

fig11

シミュレーションをしてみるとこうなった。このシーンではモーターのロケータを表示しているけど、球体の移動と回転にあわせてロケーターも移動回転し、X軸にあたる赤い線が球体の進行方向を向いているのがわかる。

fig12

モーターの推進力が球体を押すと、球体が少し前に出、ヒンジコンストレイントによって軌道が修正され、ヒンジの中心点を中心とする円周上に来る。その時球体が回転し、それに連れてモーターも回転する。するとモーターの推進力の方向も変わってヒンジの円周の接線方向を向き続けるのでヒンジを中心に回転し続けることになるわけだ。

今度はモーターをヒンジの外側に移動させてみた。

fig13

モーターがヒンジを挟んで球体の反対側に行ったので、先の例とは推進力が逆に働き、球体の回転が逆向きになったのがわかる。

fig14

今度はモーターを元の位置に戻しておいて、ボディAとボディBを入れ替えてみた。

fig15

モーターはボディBにペアレントされて動くので、固定されているキューブの方がボディBになれば球体が移動してもモーターは移動しないわけで、方向も一定方向を向いたままだ。キューブを押す反作用の力で向こう側に押されて、ヒンジコンストレイントで進める位置まで球体が移動して、そこで向こう側に押され続けるような格好になった。

fig16

どうもボディBにペアレントされると言うのがなじめない感じなんだけど、こういう仕様みたいだよ。

それではまた来週。

カテゴリー別ページ



take_z_ultima at 12:47|この記事のURLComments(0)TrackBack(0)modo | CG

2012年11月29日

2013の新機能を探る その53 3dsmax 2013 SP2

今回もMassFXToolsの「World Parameters(ワールド パラメータ)」パネルを調べて行きたい。

fig01

前回は「Scene Settings(シーン設定)」ロールアウトの「Substeps(サブステップ)」と「Solver Iter.(ソルバ反復)」について調べた。

fig03今回は「Use High Velocity Collisions(高速度衝突)」から。

このパラメータは衝突判定のすっぽ抜けを防ぐために特定の条件のリジッドオブジェクトに対して衝突判定の方法を切り替えるためのスイッチだ。

例えば下のシーンのように1フレームで球体が大きく動く場合(例えば球体の速度が速かったり、フレームレートが小さい場合など)、衝突コースに障害物があってもすり抜けてしまうことがある。これを防ぐためには前回出てきたサブステップパラメータを上げて1フレームをさらに時間分割し、球体の運動をもっと細かく計算していけばいい訳だけど、それはシーン中の全ての物理計算に影響するので、シーン中に物理計算するオブジェクトが大量にあると計算量がどんどん増えてパフォーマンスが低下する事になる。

fig04

そういう場合に使うのが「Use High Velocity Collisions(高速度衝突)」で、このパラメータをONにし、

fig06ダイナミックリジッドボディの「Use High Velocity Collisions(高速度衝突を使用)」もONにする(本当はもうちょっと条件はシビアだけど後述)と、

あるしきい値を超えた速度のリジッドボディには下の画像のように前のフレームと現在のフレームにまたがる衝突シェイプが生成され、衝突判定に使われるようになる。これならどんなに速度が上がっても経路に物体があれば衝突と交差する事になり、衝突判定が可能になるわけだ。

fig05

上のシーンで設定してみたらこのように球体がすっぽ抜けないで跳ね返るようになった。

fig07

この切り替えが起きる速度のしきい値は経験的データに基づいて自動的に決定されるけど、自分で設定する事も出来る。

fig02それが「Advanced Settings(拡張設定)」の「High Velocity Collisions(高速度衝突)」で、「Manual(手動)」に切り替えればと「Min Speed(最低スピード)」でしきい値を設定出来るようになる。

このように効果が確認できたけど、マニュアルをよく読むと以下のように注意書きがあって、

This mode applies only to a limited set of collision circumstances. The dynamic rigid body must also have Use High Velocity Collisions enabled, be moving faster the Min Speed threshold, and colliding with a static rigid body that uses a convex hull for the physical shape.  

このスイッチの効果が出るのは以下の条件が満たされた時だと書いてある。

  • ダイナミックリジッドボディ側の「Use High Velocity Collisions(高速度衝突を使用)」がON
  • 速度がMin Speed値より大きい
  • 衝突相手がスタティックリジッドボディで、衝突シェイプがconvex hull(凸型)のもの

だから上のシーンでは衝突側がスタティックじゃなかったし、衝突シェイプもBOXだったのでこの条件は満たされていなかったはずなんだけど、何故か機能しちゃったようだ。実際はマニュアルに書いてある条件よりは緩いのかも知れない。

条件をきっちり合わせてみたら挙動が変わった。球体は跳ね返らないで板に速度が吸収されたようになっている。

fig08

両方の反発係数を1まで上げるか、シェイプの「Inflation(膨張)」パラメータをマイナスにしてみたら跳ね返るようにはなった。どうやら生成される衝突シェイプが悪さをしているような感じだ。

下のシーンは球体の軌道にダイナミックリジッドボディで衝突シェイプがBOXのオブジェクトを置いて諸速度を横方向に与えてみたものだ。ボールは後ろの板もあわせて衝突せずにスルーしている。

fig09

ここで「Use High Velocity Collisions(高速度衝突)」をONにしてみると、衝突が検知されてBOXと球体の衝突が起きた。

fig10

結論としては衝突がすっぽ抜けたらとりあえず条件が整わなくてもこのスイッチをONにして試してみて、条件を整えられるようなら(衝突相手をstaticに出来る場合)変えてみて、うまく行かなかったらサブステップを上げていくって感じかな。

Use Adaptive Force(アダプティブフォースを使用)」は接触しているリジッドボディの過度な挙動を抑えて安定させる効果がある。

例えば下のシーンは多くのBOXを積み重ねてみたものだ。このオプションがOFFの状態では、互いの接触によって跳ね返る力が微妙に作用しあって、詰まれたBOXが不安定になり、最後には倒れてしまっている。

fig12

「Use Adaptive Force(アダプティブフォースを使用)」をONにするとこのように安定した。

fig11

「Generate Shape Per Element(エレメントごとにシェイプを生成)」は衝突シェイプを生成する時にオブジェクト内の要素ごとに生成するのか、それとも一括して行うのかの選択スイッチだ。これについては衝突シェイプのところで調べたね。例えばティーポットなどは1つのオブジェクトの中に複数の要素を持つ代表的なオブジェクトだ。

このオプションをOFFにして「convex hull(凸型)」の衝突シェイプを作ると全体を囲む衝突シェイプが1つ生成されるけど、

fig13

このオプションをONにして衝突シェイプを生成すると、各要素ごとに衝突シェイプが生成されるのがわかる。

fig14

この機能が効力を発揮するのは衝突シェイプを生成する時で、生成後のシェイプを切り替える事は出来ないよ。変更したい時はオプションを切り替えた後で衝突シェイプを再生成してやる必要がある。

それではまた次回。

maxまとめページ



take_z_ultima at 11:52|この記事のURLComments(0)TrackBack(0)3ds Max | CG

2012年11月28日

modo601が来た! その72 modo601 SP4

今回はモーターコンストレイントについて調べてみたい。

fig01

このコンストレイントは他のコンストレイントと組み合わせることでコンストレイントされたアイテム間に回転力や推進力を与えられるようになっている。

例えば重力が0のシーンで2つのアクティブリジッドボディをX軸方向に並べて、BOX→球の順に選択した後でモーターのボタンを押してモーターコンストレイントを追加し、

fig03

そのままシミュレーションを開始するとこのような回転が得られる。

fig04

同様にして、Y軸方向とZ軸方向に並べた球体に対してもモーターコンストレイントを設定してみたらこのように全てX軸を中心にした回転になった。

fig05

今度はBOXだけキネマティックモードに切り替えて固定してみた。すると球体の回転がなんだかおかしな事に・・・。

fig06

どうやらモーターには回転力はあるけどその軸を拘束する力は無いので、放置しておくと回転しやすい方に動いてしまうようだ。

ちなみに、このシーンに重力を与えると、球体は位置が保てずに落下する。

fig07

fig09そこで今度は回転軸を固定するためにヒンジコンストレイントを追加してみた。ヒンジコンストレイントは1軸に対する回転の自由度を持ったコンストレイントなので、その回転軸をモーターの回転軸にあわせれば回転するはずだ。

下の画像がヒンジコンストレイントをセットしたものだ。

fig08

fig11ヒンジコンストレイントの回転軸はZ軸なのでY軸回りに90度回転させてヒンジコンストレイントのZ軸とモーターの回転軸のX軸をあわせてみた。

ここでシミュレーションをしてみると、なぜか球体がちょっと回転したところで強制的に止まる現象が起きた。

fig13 

モーターの角度最大パワーをうんと上げるとぎこちなく回転はしたけどなんだか状況がおかしい。そこでシーンを保存してmodoを終了してから再起動し、シーンを読み込んでみたらその現象は治まって、デフォルトの力でも球体が止まらずに回転するようになった。ただし角度目標速度が57.2度以下になると同じ現象が起きて、この場合はどれだけ角度パワーをあげても変化は無かった。以下はそういう対処をしてからの話。

シミュレーションしてみると、このようにヒンジコンストレイントの回転軸でそれぞれが回転した。ただし重力に負けてZ軸とY軸に配置した球体は回転出来なかった。

fig10

モーターのプロパティは以下のようになっていて、回転だけじゃなくてリニアモーターにもなるらしい。リニアと回転それぞれに有効のスイッチがあって、デフォルトの状態では角度有効の方だけがONになっている。

fig12

回転力に関して調整できるパラメータは2つで、角度目標速度はモーターの回転速度の上限で、上記のシミュレーションでもわかる通り、重力や摩擦などのほかの要因によって回転は抑えられてしまう事もある。あくまで上限なので回転力が強ければ、この回転速度になる可能性があるけど、これは超えないという値だ。単位は1秒当たりの回転角度のようだ。

角度最大パワーは回転させる力の大きさで、回転速度が角度目標速度になればそれを保つ大きさに調整される。また、この値が小さければ回転加速度は小さくなり、今回の例では25.4度/秒以下だと途中で回転が止まる現象が起きた。どうもヒンジコンストレイントとの組み合わせがうなくないようだ。

下のシーンは手前のZ軸のモーターの角度最大パワーを300、上のY軸のモーターの角度最大パワーを200にしてみたものだ。このようにどれもX軸で回転するようになった。

fig14

Z軸とY軸のモーターで出力を変えたのは、Y軸上の球がヒンジに対して真上の地点から回転が開始されるのに対してZ軸の方はヒンジの真横から回転が開始されるために両者で最初から位置エネルギーに差があり、Z軸の球は真横から真上まで持ち上げるぶんだけ余計にエネルギーが必要なためだ。

もっと角度最大パワーを大きくとって、5000にしてみたのが下のシーンだ。もう重力の影響は殆ど見られず、あっという間に高速回転を始めた。

fig15

ここでZ軸の方のモーターの角度目標速度を60に絞ってみた。するとこのように、回転力は大きくても、毎秒60度の速度で回転速度が飽和して定速回転になった。

fig16

以上はモーターの回転軸とヒンジの回転軸の方向が一致した場合の話だ。面白いのはモーターは回転モーメントを与えるだけなので、回転軸が平行であれば軸の位置が一致している必要が無い事だ。

例えば上記の例でヒンジをこのように動かせば、

fig17

回転軸が移動するだけだ。

fig18

また、モーターとヒンジの回転軸が平行じゃない場合は、モータの回転軸周りに円を描いてヒンジの軸側から見るとその円が楕円に見えるように、回転力はヒンジの回転角度によって変化する事になり、回転力が強くなったり弱くなったりすることになり、互いに90度ならばモーターの回転力はヒンジの回転には寄与しなくなる。

なかなか奥が深そうだけど、止まっちゃう現象はどうにかしてもらいたいなぁ。

それではまた次回。

カテゴリー別ページ



take_z_ultima at 12:14|この記事のURLComments(0)TrackBack(0)modo | CG

2012年11月27日

2013の新機能を探る その52 3dsmax 2013 SP2

今回もMassFXツールを調べてみたい。

「World Parameters(ワールドパラメータ)」の「Scene Settings(シーン設定)」ロールアウトの「Rigid Bodies(リジッドボディ)」グループにはリジッドボディの運動計算に関する共通パラメータが集められている。

fig01

「Substeps(サブステップ)」は1フレーム更新する間を何分割してシミュレーション計算するかを決める値。0〜159までの値が設定でき、値が大きいほどシミュレーションの精度は上がるが、そのぶんだけ計算量は増える。例えばフレームレートが10FPSの場合、アニメーションが1フレーム進むと0.1秒経過する事になる。この時に「Substeps(サブステップ)」が0ならシミュレーション計算を0.1秒の刻みで1回だけ行う事になる。1にすると0.1秒を1回分割して0.05秒単位で2回のシミュレーション計算をする。2なら0.1秒を3等分して0.03秒単位で3回のシミュレーション計算をすると言った具合だ。

例えば下のシーンは高速で小さな球体が平面に衝突するシーン。1フレームで球体が平面を飛び越してしまうので、衝突判定がうまく機能せずにすっぽ抜けてしまった。

fig11

また、計算間隔が粗いと、刻々と変化する外力に対しても大雑把な反応になってしまうので、瞬間的に外力が変化する衝突や、コンストレイントによる円運動などで運動がおかしな事になってしまう。

例えば下のシーンは箱の中にボールがいくつも入っていて互いに衝突を繰り返している。衝突すると互いにはじき飛ぶわけだけど、その距離は計算間隔が長いと、次の衝突の検知なしに大きく動くし、次の移動地点が現在位置より大きく動くことになる。だからこのような振動がいつまでもおさまらない状態になったりする。

fig12

「Substeps(サブステップ)」をあげて計算間隔を短くすれば、球体の暴れがへって、安定しやすくなる。

fig13

「Solver Iter.(ソルバ反復)」はコンストレイントソルバの精度を調整するパラメータ。マニュアルには通常30より大きくする必要は無いけど、コンストレイントの数が多かったりの精度が必要な場合は上げる必要があるかもと書いてある。

これらの値の影響を見るために下のようなシーンを用意してみた。これはダイナミックリジッドボディの球体を1軸回転のコンストレイントで拘束し、モーターで回してみたものだ。球体はコンストレイントオブジェクトを中心に回転し、コンストレイントは球体に対して回転の中心方向に向心力を発生させ続けて、回転による遠心力を相殺することでこの運動が成り立っている。

fig02

コンストレイントが発生する向心力は球体が移動するとそれにあわせて方向が刻々と変化する。ソルバはある時刻のコンストレイントによる向心力を球体に作用させて、その結果生じる加速度と現在の球体の慣性速度、設定された1計算あたり更新される経過時間によって次の球体の位置を決定する。この経過時間がもしも球体がコンストレイントを一周するのにかかる時間と同じだったら、球体は同じ位置にいなくちゃならないけど、向心力をどうとって計算しても慣性運動はキャンセルできない(慣性運動と向心力の方向が直角だから向心力の大きさを変えても足してゼロに出来るベクトルの組み合わせが無い)ので、球体はとんでもない場所に移動してしまうのが容易に想像できる。

fig04

そこまで極端にしなくても、経過時間の間隔が回転速度に対して粗ければ、球体は円周軌道から逸れていってしまうことが想像できる。この経過時間の間隔が「Substeps(サブステップ)」と「Solver Iter.(ソルバ反復)」なわけだ。

ここで「Substeps(サブステップ)」を0、「Solver Iter.(ソルバ反復)」を1に設定してみると、予想通り球体の軌道が凸凹になってしまった。

fig03

ここで「Solver Iter.(ソルバ反復)」は1のまま「Substeps(サブステップ)」を10にしてみたら球体の軌道は円に戻った。同様に「Substeps(サブステップ)」を0のまま「Solver Iter.(ソルバ反復)」を30にしても球体の起動は円に戻った。

fig05

このことからどちらのパラメータもリジッドボディの運動計算の精度を高める事がわかった。

そこで今度は両者の違いについて検証してみた。下のシーンは一列に並べた球体をリジッドコンストレイントで数珠繋ぎにし、左端の球体だけ固定したものと、平面に小さなボールを衝突させている。

fig06

このシーンで「Substeps(サブステップ)」を0、「Solver Iter.(ソルバ反復)」を1に設定してみると、このようにコンストレイントの縛りも、衝突判定も精度が落ちてうまく機能しなくなる。

fig07

ここで「Substeps(サブステップ)」を0のまま、「Solver Iter.(ソルバ反復)」を最大値の255に設定してみると、このように球体の衝突判定はすり抜けるけど、コンストレイントによる拘束は精度が向上した。

fig08

今度は「Solver Iter.(ソルバ反復)」を1のまま、「Substeps(サブステップ)」を10に設定してみると、衝突判定の精度があがり、コンストレイントの精度も向上した。

fig09

さらに「Solver Iter.(ソルバ反復)」を30にしてみると、コンストレイントの精度がより高まり、さらに球体衝突の挙動も若干変化を見せた。これは球体の物理シェイプをConvexにしていたせいもあるようで、Sphereにしたら変化は無くなった。「Solver Iter.(ソルバ反復)」は微妙にコンストレイント以外のものにも影響を及ぼすけど、基本はやはりコンストレイントのみの精度に係わってくると考えていいのかな。

fig10

それに対して「Substeps(サブステップ)」はシーン全体の計算精度に影響を及ぼす。当然「Substeps(サブステップ)」の数値を上げれば計算の精度は向上するけど計算量はどんどん増えるので、大量の運動計算をするアイテムが存在する場合、コンストレイントに限定して精度を上げたいなら「Solver Iter.(ソルバ反復)」の方を先に調整してみる方がいいのかも知れない。

それではまた次回。

maxまとめページ



take_z_ultima at 11:41|この記事のURLComments(0)TrackBack(0)3ds Max | CG

2012年11月26日

modo601が来た! その71 modo601SP4

今回はコンストレイントの「設定」ツールの動作について調べてみたよ。設定ツールは前にもちょっと取り上げたけど、複数のリジッドボディ間に自動的にコンストレイントを設定するツールだ。

fig01

設定ツールはコンストレイントを設定したいリジッドボディを複数選択して起動すると、このようなダイアログが出てきて、リジッドボディ間に設定するコンストレイントの種類と、接続しあうリジッドボディの探し方、1つのリジッドボディから接続する(子側の)最大数を設定するようになっている。

fig02

コンストレイントの種類についてはいいとして、検索方法というのがなかなか分かりにくいのでいろいろテストしてみた。

fig03設定ツールで使える検索オプションは9つで、

Nearest」は一番近いリジッドボディを捜す。

例えばこのように並んでいるリジッドボディに対してこれを適用すると、

fig04

このように接続される。わかりやすいように設定されたコンストレイントを上に持ち上げて見せているよ。直線状に並んでいるリジッドボディで一番近いのは隣り合うリジッドボディだからこのようになったわけだね。コンストレイントの基点から伸びている2本の線のうち水色の線は親側(ボディA)に接続され、黄色の線は子側(ボディB)に接続されている。親から子に矢印を描くとこんな感じ。5つのリジッドボディに対して5つのコンストレイントが生成されたために1つ相手がいないコンストレイントが出来てしまっている。これは以前にも紹介した通り困った仕様だ。

fig05

上のテストではリジッドボディは原点からX軸のプラス方向に向けて並べてあったんだけど、これらをX軸マイナス方向にずらして真ん中のリジッドボディが原点に来るようにしてみた(アイテムの選択順は変更していないよ)ら接続がこのように変わった。

fig06

どうやら位置によって探索を開始するアイテムが変わるみたいだ。

直線状にすると1つコンストレイントが余るのでリング状ならどうかと思ってやってみたのが下の画像だ。こうやっても1つ相手がいないコンストレイントが生じて、リングは一周しなかった。よく考えてみるとリング状になると循環参照になって、子の影響がぐるりと回って親に戻ってくるみたいな感じでコンストレイントの解決が難しくなりそうだもんね。そういう事を避ける配慮なんだろうな。

fig07

Farthest」は一番遠いリジッドボディを捜す検索オプション。同じように直前上に並べたリジッドボディで試したらこのような結果になった。子のリジッドボディは右端のものに集中し、左から2つは一番遠いアイテムが一番右のアイテムで、真ん中のものは両端のアイテムが一番遠くて、右から2番目のアイテムは一番左のアイテムが一番遠く、一番右のアイテムは一番左が一番遠いけど循環参照になるから接続出来なかったってところかな。

fig08

「Random」はランダムに接続される。ここでも1つだけ接続されないコンストレイントが残る。

fig09

ちなみにこのランダムにはランダムシードの設定が無いので、実行されるたびにランダム値が変化し、同じ手順を繰り返しても同じ結果は得られない。下のGIFアニメは同じ手順で設定したコンストレイントを3つ比較したものだ。毎回全然違う接続になっているのがわかる。

fig10

「±X,Y,Z」は各軸に沿って「+」は座標値の小さい側から大きい側へ、「−」は大きい側から小さい側へアイテムを検索する。

下の画像はX軸上に並べたリジッドボディに対して「+X」オプションで検索させたものだ。このオプションでは相手がいないコンストレイントは生成されず、綺麗に隣どうしが接続された。これはアイテムの順番を並び替えても同じ結果が得られた。

fig11

今度は同じ条件で「−X」オプションで検索させてみたもの。全部が一番X値の小さいものと接続した。どうも「+」と「−」で検索方法に違いがあるようだ。

fig12

さらに平面に広げて並べて「+X」で検索してみたのが下の画像だ。子のアイテムが1列隣の1つに集中する形で接続して行っているのがわかる。

fig13

同じ事を「−X」でやってみたもの。今度はX座標値が一番小さい1つにコンストレイントの子の設定が集中する形になった。

fig14

「仕様」と言ってしまえばそうなんだろうけど、どうなんだろうか。

それではまた次回。

カテゴリー別ページ



take_z_ultima at 11:34|この記事のURLComments(0)TrackBack(0)modo | CG
Archives