Сайты:
OF: http://www.openframeworks.cc
P: http://processing.org
Лицензия:
OF: MIT (используемые библиотеки, имеют собственные лицензии)
P: GPL and LGPL
Версия:
OF: 0.061
P: 1.2.1
Wiki:
OF: http://en.wikipedia.org/wiki/OpenFrameworks
P: http://en.wikipedia.org/wiki/Processing_(programming_language)
http://ru.wikipedia.org/wiki/Processing
Документация:
OF: http://www.openframeworks.cc/documentation
P: http://processing.org/reference/
Попробуем портировать скетч Processing-а в программу для OpenFrameworks.
Возьмём скетч Chain.pde (Topics — Simulate)
Цепь. Один массивный объект (окружность) прикрепляется к позиции указателя мышки, а второй объект прикрепляется к первому. На оба объекта действует сила гравитации, которая тянет их вниз.
Т.о. скетч рисует две окружности, соединённых белой линией и одна линия соединяется с текущим положеним указателя мышки.
Вот как это выглядит:
А вот код Processing-а:
/** * Chain. * * One mass is attached to the mouse position and the other * is attached the position of the other mass. The gravity * in the environment pulls down on both. */ Spring2D s1, s2; float gravity = 6.0; float mass = 2.0; void setup() { size(200, 200); smooth(); fill(0); // Inputs: x, y, mass, gravity s1 = new Spring2D(0.0, width/2, mass, gravity); s2 = new Spring2D(0.0, width/2, mass, gravity); } void draw() { background(204); s1.update(mouseX, mouseY); s1.display(mouseX, mouseY); s2.update(s1.x, s1.y); s2.display(s1.x, s1.y); } class Spring2D { float vx, vy; // The x- and y-axis velocities float x, y; // The x- and y-coordinates float gravity; float mass; float radius = 20; float stiffness = 0.2; float damping = 0.7; Spring2D(float xpos, float ypos, float m, float g) { x = xpos; y = ypos; mass = m; gravity = g; } void update(float targetX, float targetY) { float forceX = (targetX - x) * stiffness; float ax = forceX / mass; vx = damping * (vx + ax); x += vx; float forceY = (targetY - y) * stiffness; forceY += gravity; float ay = forceY / mass; vy = damping * (vy + ay); y += vy; } void display(float nx, float ny) { noStroke(); ellipse(x, y, radius*2, radius*2); stroke(255); line(x, y, nx, ny); } }
Попробуем портировать его на OpenFrameworks.
В директории examples создаём новую папку, которую назовём myofChain.
Копируем туда содержимое директории emptyExample, переименовываем файлы проекта и вносим в них требуемые изменения (этот шаг подробно описан во вводной статье про OpenFrameworks)
Первым делом нужно создать файлы Spring.h и Spring.cpp
— в них будет храниться класс Spring2D:
Spring.h:
#ifndef _SPRING_H_ #define _SPRING_H_ // // openFrameworks vs Processing // // Chain.pde // #include "ofMain.h" class Spring2D { public: float vx, vy; // The x- and y-axis velocities float x, y; // The x- and y-coordinates float gravity; float mass; float radius; float stiffness; float damping; Spring2D(); ~Spring2D(); Spring2D(float xpos, float ypos, float m, float g); void update(float targetX, float targetY); void display(float nx, float ny); }; #endif //#ifndef _SPRING_H_
Spring.cpp:
#include "Spring.h" Spring2D::Spring2D(): radius(20), stiffness(0.2), damping(0.7) { } Spring2D::~Spring2D() { } Spring2D::Spring2D(float xpos, float ypos, float m, float g): radius(20), stiffness(0.2), damping(0.7) { x = xpos; y = ypos; mass = m; gravity = g; } void Spring2D::update(float targetX, float targetY) { float forceX = (targetX - x) * stiffness; float ax = forceX / mass; vx = damping * (vx + ax); x += vx; float forceY = (targetY - y) * stiffness; forceY += gravity; float ay = forceY / mass; vy = damping * (vy + ay); y += vy; } void Spring2D::display(float nx, float ny) { //noStroke(); //ellipse(x, y, radius*2, radius*2); //stroke(255); //line(x, y, nx, ny); ofSetColor(0x000000); ofEllipse(x, y, radius*2, radius*2); ofSetColor(0xFFFFFF); ofLine(x, y, nx, ny); }
Тут всё просто. Делаем все данные и методы публичными, добавляем конструктор и деструктор.
Присваивание значений переменным выносим в инициализацию конструктора.
Более важные изменения вносятся в метод display(). Функции рисования Processing необходимо заменить на соответствующие функции OpenFrameworks-а.
Переходим к функции начальной установки setup():
float gravity = 6.0; float mass = 2.0; void setup() { size(200, 200); smooth(); fill(0); // Inputs: x, y, mass, gravity s1 = new Spring2D(0.0, width/2, mass, gravity); s2 = new Spring2D(0.0, width/2, mass, gravity); }
и просто переносим данный код в аналогичный метод:
void testApp::setup(){ width = 200; height = 200; //-------------------------- gravity = 6.0; mass = 2.0; //size(200, 200); ofSetWindowShape(200, 200); // размер окна //smooth(); ofEnableSmoothing(); //fill(0); ofBackground(0, 0, 0); // чёрный фон // Inputs: x, y, mass, gravity s1 = new Spring2D(0.0, width/2, mass, gravity); s2 = new Spring2D(0.0, width/2, mass, gravity); //------------------------ //lets make our circles look a little nicer! ofSetCircleResolution(50); ofSetVerticalSync(true); ofSetFrameRate(50); mouseX=0; mouseY=0; mouseClickX=0; mouseClickY=0; }
В класс testApp необходимо добавить переменные width и height для хранения размеров окна. А так же переменные mouseX и mouseY, которые понадобятся в методе draw() и которые содержат текущие координаты указателя мышки:
void testApp::mouseMoved(int x, int y ){ printf("[i][mouseMoved] x: %d y: %d\n", x, y); mouseX=x; mouseY=y; }
Осталось переписать функцию
void draw() { background(204); s1.update(mouseX, mouseY); s1.display(mouseX, mouseY); s2.update(s1.x, s1.y); s2.display(s1.x, s1.y); }
в одноимённом методе
void testApp::draw(){ //background(204); ofBackground(204, 204, 204); // серый фон //s1.update(mouseX, mouseY); //s1.display(mouseX, mouseY); //s2.update(s1.x, s1.y); //s2.display(s1.x, s1.y); if(s1){ s1->update(mouseX, mouseY); s1->display(mouseX, mouseY); } if(s2){ s2->update(s1->x, s1->y); s2->display(s1->x, s1->y); } }
Вот и всё! Вот что получилось:
Скачать программу + исходники. (1.9 Mb)
Для запуска программы, в каталоге bin должны находиться все требуемые dll-библиотеки.
Вывод:
openFrameworks ещё доволно молод и по сравнению с Processing-ом многих простых функций ему ещё очень не хватает. Но его простота и прозрачность — это замечательный плюс, который позволяет программировать на С++ захватывающие графические и интерактивные приложения.
Ссылки
http://thomas-gerhardt.com/itp/2008/04/03/open-frameworks-vs-processing/
0 комментариев на «“openFrameworks vs Processing”»
— хорошая статейка (и предыдущая о openFrameworks), очень меня заинтересовала эта библиотека, буду изучать! =)
усехов 🙂 можно начать с перевода скетчей Processing-а 😉