Я использую openframeworks (который визуализируется через OpenGL), и я пытаюсь повернуть изображение из его центра.
Я знаю, что я должен использовать ofRotate()
а также ofTranslate()
но мне не удалось понять это самостоятельно. Вот что я пробовал до сих пор:
ofPushMatrix();
ofRotate(ofRandom(10),0.0,0.0,1.0);
leafImg.draw(100,100);
ofPopMatrix();
Не занимаясь слишком большой математикой, вы можете использовать вложенную систему координат, смещающую изображение так, чтобы при вращении вы вращались из центра. Короче говоря, вы будете делать это:
В коде это будет:
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. Несмотря на то, что это для обработки, принцип точно такой же, а синтаксис очень похож, поэтому я рекомендую эту статью: 2D трансформации
Других решений пока нет …