[work 21] Box2d study
![[work 21] Box2d study](https://i0.wp.com/tsukuru.hayato-works.com/wp-content/uploads/2019/03/outFrameImg0400.png?fit=1280%2C720&ssl=1)
Movie
Source code
about
- 物理演算エンジン(Box2d)のopenframeworksアドオンであるofxBox2dの使い方を学ぶ
file
- 上部にあるファイル名が表示されているボタンを押すと、表示されるファイルが切り替わります
- 別ウィンドウ表示したい時や行番号などが無いRawMode表示したい時は、コード内右上のボタンを押してください(ボタンはマウスオーバーすると表示されます)
#include "ofMain.h"
#include "ofApp.h"
//================================
int main( ){
// 4K:4096x2160
// 2K:2048x1080
// FullHD:1920x1080
// HD:1440x1080
// HD720p:1280x720
// DVD:720x480
// setup the GL context
ofSetupOpenGL(1280,720, OF_WINDOW);
// this kicks off the running of my app
// can be OF_WINDOW or OF_FULLSCREEN
// pass in width and height too:
ofRunApp( new ofApp());
}
#pragma once
#include "ofMain.h"
#include "Box.hpp"
#include "ofxBox2d.h"
class ofApp : public ofBaseApp{
public:
ofApp();
~ofApp();
void setup();
void update();
void draw();
void keyPressed(int key);
void keyReleased(int key);
void mouseMoved(int x, int y);
void mouseDragged(int x, int y, int button);
void mousePressed(int x, int y, int button);
void mouseReleased(int x, int y, int button);
void mouseEntered(int x, int y);
void mouseExited(int x, int y);
void windowResized(int w, int h);
void dragEvent(ofDragInfo dragInfo);
void gotMessage(ofMessage msg);
private:
ofxBox2d box2d;
std::vector<std::shared_ptr<Box>> boxes;
std::vector<std::shared_ptr<ofxBox2dEdge>> surfacies;
};
#include "ofApp.h"
ofApp::ofApp(){
}
ofApp::~ofApp(){
}
//--------------------------------------------------------------
void ofApp::setup(){
double fps = 30;
ofSetFrameRate(fps);
ofBackground(0);
ofSetBackgroundAuto(true);
box2d.init();
box2d.setGravity(0, 10);
box2d.createGround(); // create wall around window
box2d.setFPS(30.0);
box2d.registerGrabbing(); // grab object
float angle = 0;
float time = 0;
auto edge = std::make_shared<ofxBox2dEdge>();
for (int x = 0; x < ofGetWidth(); x += 10) {
float y0 = std::sin(angle) * 100;
angle += TWO_PI / (ofGetWidth() / 10);
float y1 = ofSignedNoise(time) * 50;
time += 0.1;
edge.get()->addVertex(x, (ofGetHeight() / 2 + 100) + y0 + y1);
}
edge.get()->create(box2d.getWorld());
surfacies.push_back(edge);
}
//--------------------------------------------------------------
void ofApp::update(){
boxes.push_back(std::shared_ptr<Box>(new Box()));
boxes.back().get()->setPhysics(ofRandom(0.1, 0.4), ofRandom(0.1, 0.5), ofRandom(0.1, 0.3));
boxes.back().get()->setup(box2d.getWorld(), ofRectangle(ofRandomWidth(), 100, ofRandom(16, 32), ofRandom(16, 32)));
box2d.update();
ofRemove(boxes, ofxBox2dBaseShape::shouldRemoveOffScreen);
}
//--------------------------------------------------------------
void ofApp::draw(){
ofSetColor(0);
surfacies.back().get()->draw();
for (std::shared_ptr<Box> &b : boxes) {
b->display();
}
}
#ifndef Box_hpp
#define Box_hpp
#include <stdio.h>
#include "ofMain.h"
#include "ofxBox2d.h"
class Box : public ofxBox2dRect{
public:
Box();
~Box();
void display();
private:
ofColor color;
};
#endif /* Box_hpp */
#include "Box.hpp"
Box::Box()
{
color = ofColor(ofRandom(255), ofRandom(255), ofRandom(255));
}
Box::~Box()
{
}
void Box::display()
{
float w = getWidth();
float h = getHeight();
float a = getRotation(); // deg
glPushMatrix();
glTranslatef(getPosition().x, getPosition().y, 0);
glRotatef(a, 0, 0, 1);
ofFill();
ofSetColor(color);
ofSetRectMode(OF_RECTMODE_CENTER);
ofDrawRectangle(0, 0, w, h);
glPopMatrix();
}
Link to the reference page
ソースコードで使用したAPIの中から要点になりそうなものをいくつか選んでリストアップしました。
| category | API/Lib |
| openframeworks | ofxBox2d |
| c++ | std::shared_ptr |
Development environment
- openframeworks 0.10.1
- c++
- macOS
- Xcode