0

我正在使用 openframeworks (通过 OpenGL 渲染),我正在尝试从它的中心旋转图像。

我知道我应该使用ofRotate()ofTranslate()但我自己还没有设法弄清楚。这是我到目前为止所尝试的:

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

1 回答 1

9

无需做太多数学运算,您可以使用嵌套坐标系偏移图像,以便在旋转时从中心旋转。简而言之,您将这样做:

  1. 将坐标系移动到图像的中心
  2. 从那里旋转
  3. 在该坐标系内更深一层并向后平移图像大小的一半,因此您偏移回“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();

如您所见,旋转到中心相当简单。在您的空闲时间尝试找出如何针对任意点旋转。

在幕后有一些线性代数在进行,但是 push/pop 矩阵调用基本上会为您处理基本的矩阵乘法。您仍然需要了解和练习使用 pushMatrix/popMatrix 调用。虽然是Processing,但原理完全一样,语法也很相似,所以推荐这篇文章:2D Transformations

于 2012-09-20T17:40:51.130 回答