0

私はopenframeworks(OpenGLを介してレンダリングする)を使用しており、画像を中心から回転させようとしています。

ofRotate()andを使用する必要があることはわかっofTranslate()ていますが、自分でそれを理解することはできませんでした。これが私がこれまでに試したことです:

ofPushMatrix();
ofRotate(ofRandom(10),0.0,0.0,1.0);
leafImg.draw(100,100);
ofPopMatrix();
4

1 に答える 1

9

あまり計算しなくても、ネストされた座標系を使用して画像をオフセットし、回転するときに中心から回転させることができます。要するに、これを行うことになります:

  1. 座標系を画像の中心に移動
  2. そこから回転
  3. その座標系内で 1 レベル深くし、画像サイズの半分だけ変換して、「0,0」にオフセットします。

コードでは、これは次のようになります。

ofPushMatrix();
    ofTranslate(leafImg.width/2, leafImg.height/2, 0);//move pivot to centre
    ofRotate(ofGetFrameNum() * .01, 0, 0, 1);//rotate from centre
    ofPushMatrix();
        leafImg.draw(-leafImg.width/2,-leafImg.height/2);//move back by the centre offset
    ofPopMatrix();
ofPopMatrix();

座標系がどのようにネストされているかをより明確にするために、インデントを使用しました。

以下と同じです:

ofPushMatrix();
    ofTranslate(leafImg.width/2, leafImg.height/2, 0);//move pivot to centre
    ofRotate(ofGetFrameNum() * .01, 0, 0, 1);//rotate from centre
    ofPushMatrix();
        ofTranslate(-leafImg.width/2,-leafImg.height/2,0);//move back by the centre offset
        leafImg.draw(0,0);
    ofPopMatrix();
ofPopMatrix();

ご覧のとおり、中心に回転するのはかなり簡単です。暇なときに、任意の点に対して回転する方法を考えてみてください。

舞台裏ではちょっとした線形代数が行われていますが、プッシュ/ポップ行列呼び出しは基本的に要点の行列乗算を処理します。それでも、pushMatrix/popMatrix 呼び出しの操作を理解し、練習する必要があります。これは処理用ですが、原理はまったく同じで、構文も非常に似ているため、次の記事をお勧めします: 2D Transformations

于 2012-09-20T17:40:51.130 に答える