Openframeworks - 通过OpenGL调用从中心旋转图像

时间:2012-09-20 16:05:54

标签: c++ opengl openframeworks

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

我知道我应该使用ofRotate()ofTranslate(),但我还没有成功解决这个问题。这是我到目前为止所尝试的内容:

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

1 个答案:

答案 0 :(得分:8)

如果不做太多的数学计算,您可以使用嵌套坐标系统偏移图像,这样当您旋转时,您可以从中心旋转。总之,你会这样做:

  1. 将坐标系移动到图像的中心
  2. 从那里旋转
  3. 在该坐标系内,做一个更深的水平,然后将图像尺寸的一半转回,这样你就可以偏移回'0,0'
  4. 在代码中,这将是:

    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调用。虽然这是针对Processing的,但原理完全相同且语法非常相似,所以我推荐这篇文章:2D Transformations