質問: 言葉でうまく表現できないのですが、下の画像を見ていただいてイメージが伝わると幸いです。 3D空間状に画像のようなトゲを持った球体を描いているのですが、それぞれのトゲは球体の動きの影響を受けるようになっています。 ![画像の説明をここに入力](https://i.stack.imgur.com/TVF0K.gif) ただしこのようトゲが全て一定の方向を向いているのではなく、それぞれのトゲの向きが全方向を向くようにしたいと思っています。その上で球体が動いた時に上の画像のような影響を受けるという風にしたいです。 ``` for (int i=0; i
回答: > > トゲ一つ一つは上記のようなコードになっており、一つのクラスとしてまとめています。... > > > まずコードがクラスやメソッドになっていませんが、クラスはどんな設計でしょうか? 次の解釈で合っていますでしょうか? そうである前提で進めます。 * このfor文全体は1つのトゲを構成する円集合の描画処理である * `x` `y` `z` 配列要素は円の絶対座標を示すクラスのフィールドであり、前回の描画時の座標が記憶されている * `_x` `_y` `_z` はトゲの原点の絶対座標を示すクラスのフィールドである * `kakudo` `kakudo2` は球を基準としたトゲの球面座標系の角度を示すクラスのフィールドである まずfor文末の3行は非効率かつ分かりづらいので行列スタックを使ってください。 行列スタックとは回転や平行移動等の操作を保存したり戻したりできる機能のことです。 `pushMatrix()`と`popMatrix()`を使います。 次に目的ですが、トゲの各円を放射的(球面の法線方向)に並べたいという解釈でよいでしょうか。 そうであれば、あなたが示した絶対座標系のZ軸ではなく、rotateされた後のローカル座標系に対してZ軸を操作することで達成できます。 ``` for (int i=0; i > 試しにこのクラスを丸ごと回転するようにrotateを使ってみたのですがうまくできませんでした。 > > > その手法であってもできると思います。できなかったのは座標が全て絶対座標だったからだと思われます。それらを球からの相対座標に変えて、トゲ(クラス)を丸ごと回転するだけでなく球からの並行移動もすれば上記と似た結果が導けるはずです。 ただし、トゲの先が遅れて動くような実装は絶対座標に基づく為、座標系の変換が必要になります。ややこしいので先に説明した方法をお勧めします。 補足ですが、`rotate`や`translate`、`scale`、`popMatrix`などの変換操作の振る舞いですが、これは「座標系」を変えるメソッドです。円や球などを動かすメソッド、と考えると不正確なので注意しましょう。 詳しくは「Processing pushMatrix rotate」で調べてください。