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

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

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

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

Q&A

1回答

846閲覧

Processing 縦回転・横回転のやり方

RY54828

総合スコア2

Processing

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

0グッド

0クリップ

投稿2021/12/12 08:38

前提・実現したいこと

現在、ルービックキューブのような立方体を作っていて、それを列ごとに縦回転や横回転ができるようにしたいのですが、実現可能でしょうか?ご解答よろしくおねがいします。

該当のソースコード

processing

float boxSize = 40; float distance = 42; float halfDis; int boxNum = 5; float step = 255/boxNum; float angleX = 30; float angleY = 60; void setup() { fullScreen(P3D); halfDis = distance*(boxNum- 1)/2; } void draw() { background(0); translate(width/2, height/2); rotateX(radians(-angleX)); rotateY(radians(angleY)); rotateX(angleX); rotateY(angleY); for (int z = 0; z < boxNum; z ++) { for (int y = 0; y < boxNum; y ++) { for (int x = 0; x < boxNum; x ++) { pushMatrix(); translate(x*distance - halfDis, y*distance - halfDis, z*distance - halfDis); box(boxSize, boxSize, boxSize); popMatrix(); } } } } float pressed_x; float pressed_y; void mouseDragged() { angleY = (mouseX - pressed_x) * 0.005; angleX = (mouseY - pressed_y) * 0.005; }

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

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

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

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

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

1T2R3M4

2021/12/12 08:54

可能でしょう。
RY54828

2021/12/12 09:33

情報ありがとうございます。参考にさせていただきます。
guest

回答1

0

やってみた。三次元把握できない...
色をつけるとかは勘弁。やるとすれば90度回った時点で「自分の位置」を更新しまくるのでしょうね。

Processing

1float boxSize = 40; 2float distance = 42; 3float halfDis; 4int boxNum = 5; 5float step = 255/boxNum; 6float angleX = 30; 7float angleY = 60; 8 9PVector[][][] boxPos; 10 11int nextAxis; 12int axis; 13int nextPos=boxNum/2; 14int pos=boxNum/2; 15int th; 16 17void setup() { 18 size(600,600,P3D); 19 //各ブロックに「自分の位置」を覚えてもらう 20 boxPos=new PVector[boxNum][][]; 21 for (int z = 0; z < boxNum; z ++) { 22 boxPos[z]=new PVector[boxNum][]; 23 for (int y = 0; y < boxNum; y ++) { 24 boxPos[z][y]=new PVector[boxNum]; 25 for (int x = 0; x < boxNum; x ++) { 26 boxPos[z][y][x]=new PVector(z-boxNum/2, y-boxNum/2, x-boxNum/2); 27 } 28 } 29 } 30 halfDis = distance*(boxNum- 1)/2; 31} 32 33void draw() { 34 background(0); 35 36 translate(width/2, height/2); 37 rotateX(radians(-angleX)); 38 rotateY(radians(angleY)); 39 rotateX(angleX); 40 rotateY(angleY); 41 //90度毎に回転方向のチェック 42 if(++th%90==0){ 43 axis=nextAxis; 44 pos=nextPos; 45 th=0; 46 } 47 float fth=TWO_PI*th/360; 48 for (int z = 0; z < boxNum; z ++) { 49 for (int y = 0; y < boxNum; y ++) { 50 for (int x = 0; x < boxNum; x ++) { 51 52 pushMatrix(); 53 //指定した平面の奴だけ回ってもらう 54 switch(axis) { 55 case 0: 56 if ( boxPos[z][y][x].z==pos) { 57 rotateX(fth); 58 } 59 break; 60 case 1: 61 if ( boxPos[z][y][x].y==pos) { 62 rotateY(fth); 63 } 64 break; 65 case 2: 66 if ( boxPos[z][y][x].x==pos) { 67 rotateZ(fth); 68 } 69 } 70 71 translate(x*distance - halfDis, y*distance - halfDis, 72 z*distance - halfDis); 73 box(boxSize, boxSize, boxSize); 74 popMatrix(); 75 } 76 } 77 } 78} 79 80float pressed_x; 81float pressed_y; 82 83void mouseDragged() { 84 angleY = (mouseX - pressed_x) * 0.005; 85 angleX = (mouseY - pressed_y) * 0.005; 86} 87 88//回転方向?の切り替え 89void keyPressed() { 90 if(key=='1') nextAxis=0; 91 else if(key=='2') nextAxis=1; 92 else if(key=='3') nextAxis=2; 93 else if(key=='4') nextPos=-boxNum/2; 94 else if(key=='5') nextPos=-boxNum/2+1; 95 else if(key=='6') nextPos=-boxNum/2+2; 96 else if(key=='7') nextPos=-boxNum/2+3; 97 else if(key=='8') nextPos=-boxNum/2+4; 98}

投稿2021/12/14 10:21

thkana

総合スコア7659

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問