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

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

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

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

Q&A

解決済

2回答

3678閲覧

地球儀の地軸で回したい

jurinayuria11

総合スコア14

Processing

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

0グッド

0クリップ

投稿2018/11/15 03:01

前提・実現したいこと

Processingで地球儀を作成しています。
自動で回転する機能を実装中に変な回転になってしまいました。

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

自動で回転の際におかしな回転をする。

該当のソースコード

java

1 1. import java.awt.*; 2 2. import java.awt.event.*; 3 3. Frame f; 4 4. Button b1; 5 5. int r; 6 6. PShape earth; 7 7. PImage earth_tex; 8 8. float rotx; 9 9. float rotz; 1010. void mouseDragged() { 1111. rotx+=(pmouseY-mouseY)*0.01; 1212. rotz+=(mouseX-pmouseX)*0.01; 1313. } 1414. void setup() { 1515. size(400, 400, P3D); 1616. earth_tex=loadImage("Albedo.jpg"); 1717. noStroke(); 1818. earth=createShape(SPHERE, 100); 1919. earth.setTexture(earth_tex); 2020. f=new Frame(); 2121 f.setSize(200, 100); 2222. f.setLayout(new FlowLayout()); 2323. b1=new Button("rotation"); 2424. f.add(b1); 2525. b1.addActionListener(new ActionListener() { 2626. public void actionPerformed(ActionEvent ae) { 2727. if (b1.getLabel().equals("rotation")) { 2828. b1.setLabel("stop"); 2929. } else { 3030. b1.setLabel("rotation"); 3131. } 3232. } 3333. } 3434. ); 3535. f.setVisible(true); 3636. } 3737. void draw() { 3838. background(0); 3939. translate(width/2, height/2); 4040. if (b1.getLabel().equals("stop")) { 4141. r+=3; 4242. rotateX(radians(r)); 4343. rotateY(radians(r)); 4444. } else { 4545. rotateX(rotx); 4646. rotateZ(rotz); 4747. } 4848. shape(earth); 4949. }

試したこと

42、43行目のroteをうまく回るように数値を変換しました。

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

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

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

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

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

guest

回答2

0

ベストアンサー

おそらく「特定の軸を中心に回転」させたいのだろうと思います。

Processingがサポートしている回転はオイラー角によるX, Y, Zいずれかの軸の周りの回転なのですがそれを合成しても、つまり「X軸の周りにrx回転させてからZ軸の周りにrz回転する」という操作を繰り返しても「一定の軸の周りの回転にはならない」のです。

一定の軸の周りに回転させるためには「ある軸の周りに回転」という演算をしなければなりません。(言葉でいうとわけわかりませんが・・・)
JavaFXやOpenCVなどですと「回転軸を指定して、その軸の周りに回転」という機能(つまりいわゆるクォータニオンによる回転)がありますがProcessingではそれはサポートされていない(?)ようです。そこでProcessingでも平易に記述するための方法を挙げますと

A) まず回転の軸を特定の軸(例えばY軸)に固定する。
B) プログラム上のrotx, rotzはY軸を本来回転させる軸の方向へ合わせるための角度と考えます。
C) drawの処理
C1) 現在の座標系を-rotz, -rotx回転させ、回転軸をY軸に一致させるようにする
C2) Y軸の周りにroty回転させる
C3) C1と逆方向に回転させ元の座標系に戻す

とすればよいと思います。具体的にはdrawを次のように書き換えてみてください。

Java

1float roty = 0; 2 3void draw() { 4 background(0); 5 translate(width/2, height/2); 6 if (b1.getLabel().equals("stop")) { 7 // 回転中は上記に述べた方法で座標系の回転とモデルの回転に分けて行う。 8 roty += radians(3); 9 // 回転軸がY軸になるよう回転(座標系を回転の都合に合うように回転すると考える) 10 rotateZ(-rotz); 11 rotateX(-rotx); 12 // モデルの回転 13 rotateY(roty); 14 // Y軸が回転軸になるよう回転(座標系をもとにもどすと考える) 15 rotateX(rotx); 16 rotateZ(rotz); 17 } else { 18 // 止めているときには何もしない 19 } 20 shape(earth); 21}

投稿2018/11/15 04:01

KSwordOfHaste

総合スコア18392

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

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

0

Processingの3D周りうといですが、球自体を回転させたらいいので

Java

1import java.awt.*; 2import java.awt.event.*; 3Frame f; 4Button b1; 5int r; 6PShape earth; 7PImage earth_tex; 8float rotx; 9float rotz; 10void mouseDragged() { 11 rotx=(pmouseY-mouseY)*0.01; 12 rotz=(mouseX-pmouseX)*0.01; 13} 14void setup() { 15 size(400, 400, P3D); 16 earth_tex=loadImage("Albedo.jpg"); 17 noStroke(); 18 earth=createShape(SPHERE, 100); 19 earth.setTexture(earth_tex); 20 f=new Frame(); 21 f.setSize(200, 100); 22 f.setLayout(new FlowLayout()); 23 b1=new Button("rotation"); 24 f.add(b1); 25 b1.addActionListener(new ActionListener() { 26 public void actionPerformed(ActionEvent ae) { 27 if (b1.getLabel().equals("rotation")) { 28 b1.setLabel("stop"); 29 } else { 30 b1.setLabel("rotation"); 31 } 32 } 33 } 34 ); 35 f.setVisible(true); 36} 37void draw() { 38 background(0); 39 translate(width/2, height/2); 40 if (b1.getLabel().equals("stop")) { 41 r=3; 42 earth.rotateX(radians(r)); 43 earth.rotateY(radians(r)); 44 } else { 45 earth.rotateX(rotx); 46 earth.rotateZ(rotz); 47 } 48 shape(earth); 49}

こういうことかな

投稿2018/11/15 03:16

rururu3

総合スコア5545

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

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

jurinayuria11

2018/11/16 09:42

earth.rotateX(rotx); のように変数名 .rotate()の使い方を初めて知ったのですが、どのような効果があるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問