質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

2回答

988閲覧

Processing 運動のアニメーションについての質問

Chuchuchu

総合スコア16

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2018/04/26 11:43

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
processingを用いてpackmanを左から右に口をパクパクさせながら動かすプログラムを作成しているのですが口を開かせることはこのコードで可能なのですがある一定の角度(j=30)に行った時に口を閉じていかせるような動作の実現が出来ません。分かる方いたらアドバイスよろしくお願いします。

発生している問題・エラーメッセージ

packmanの口が閉じない

該当のソースコード

processing

1ソースコード```processing 2void setup(){ 3 size(400,400); 4 smooth(); 5 noStroke(); 6 frameRate(20); 7} 8 9int i=0,j=0,k=0; 10void draw(){ 11 background(255); 12 fill(200,255,200); 13 arc(i,200,50,50,radians(j),radians(360-k)); 14 i+=5; 15 j+=5; 16 k+=5; 17 18}
### 試したこと 条件式でjの値が30を越したらj、kも値を5ずつ少なくしていくなど...。そうするとjが25になった時にまた30に戻ってしまうためうまくいかない。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

この言語?を知らないので、具体的なコードを提示することはできませんが、自分だったらこうするという考え方を説明いたします

ずばり上顎の動作をサイン波にしてしまうことです。つまり、
上顎の角度 = 上顎の最大角度*sin(j)とします。

同様にして下顎は、
下顎の角度 = -下顎の最大角度*sin(j)
のようにします。

余談ですが、質問者様の例・私の例に共通していえることとして、変数kは必要ありません(どうせ上顎も下顎も同じ角度で開くのですから、jがあれば十分です)

投稿2018/04/26 12:25

chankane

総合スコア139

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chuchuchu

2018/04/27 01:56

回答ありがとうございます。その考えは思いつきませんでした。 試してみます、有難うございます。
guest

0

ベストアンサー

chankaneさん回答の戦術はうまい方法の一つだと思います。

別案として、より一般的に複雑な動作を考えるとき「今どういう段階にあるか」という情報に基づき変化を制御することもよくやると思います。

本件の例ですと、「口の角度(j)」とは別に「口を開けようとしているのか、閉じようとしているのか」を表す情報(変数)を追加するというものです。

仮にそれをmouth_actionとし、1なら開き中、-1なら閉じ中としておきますと、jを変化させる際にmouth_actionが1なら角度を増やし、-1なら減らせばよいわけです。なぜ開き中を1、閉じ中を-1とするかといえば

j += mouth_action * delta;

のように開き中でも閉じ中でも共通の式で表現できそうというトリックのためです。状態を反転させる際に負号を逆転させればいいという手軽さもありますね。

java

1int mouth_action = 1; 2int j = 0; 3... 4void draw() { 5 j += mouth_action * 5; 6 if (j > 30 || j < 0) { 7 mouth_action = -mouth_action; // 限界まで口を変化させたら動きを反転 8 } 9 // 描画など 10}

(ただこうしたテクニックはトリックの類に近いので明解なプログラミングとはいいきれません。複雑なプログラムになるほど(あるいは厳密さが求められる場面になればなるほど)、単なる整数でなくもっと明解に意味を表現することが好まれるかも知れません。例えばenumにしたりとか。)

投稿2018/04/26 14:05

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chuchuchu

2018/04/27 02:01

回答ありがとうございます。こちらの発想も思い浮かびませんでした。言われてみるととても良いやり方だと感じました。有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問