[ Video ]
[ About ]
Surfaceのセンサー情報を取得してみたいなと思って、調べてみました。下記のサイトが参考になりました。
WindowsでC++で加速度センサーの値をとりたい
http://blog.okazuki.jp/entry/2015/04/07/195929
Sensor API について
https://msdn.microsoft.com/ja-jp/library/windows/desktop/dd318913(v=vs.85).aspx
[C++] Native Code (VC++) で Windows 7 Sensor API を使う
https://code.msdn.microsoft.com/C-Native-Code-VC-Windows-7-dcc465d0/
どちらもWindows7/8向けで少し古い情報でしたが、Windows 10 SDKに記載のヘッダーやライブラリがあったので大丈夫でした。C#だとセンサ関係のクラスが用意されているようなので基本的にはそっちの方を推奨なのでしょうね。
加速度センサーから値を取得しています(たぶん)。自分の想像していた加速度センサーの値とは、取れる値の形が違ったのですが、きっと自分の勉強不足でしょう。
取れた値は、傾きと連動しているっぽいのでofxBox2dの物理ライブラリの重力と値をリンクさせて傾けた方向にオブジェクトが落ちていくようにしました。
Windows固有のライブラリの使い方は慣れていなかったり、センサーの値の出力のされ方など、色々と調べていかないといけない点は多そうですが、とりあえずは動くものが作れたので、カスタマイズしていきたいですね。
[ Source ]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
#pragma once #include "ofMain.h" #include "ofxBox2d.h" #include <SensorsApi.h> #include <sensors.h> #pragma comment(lib, "Sensorsapi.lib") class ofApp : public ofBaseApp { public: 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) {}; // Make Member ofFbo fbo; ofTrueTypeFont font; ofxBox2d box2d; vector<shared_ptr<ofxBox2dCircle>> circles; ofPoint sensor_point; // Make Method ofPoint get_accelerometer_3d(); }; |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 |
#include "ofApp.h" //-------------------------------------------------------------- void ofApp::setup() { ofSetFrameRate(30); ofBackground(239); ofSetWindowTitle("Insta"); this->fbo.allocate(ofGetWidth(), ofGetHeight()); this->font.loadFont("fonts/Kazesawa-Bold.ttf", 50, true, false, true); this->box2d.init(); this->box2d.setGravity(0, 50); this->box2d.createBounds(); this->box2d.setFPS(30); for (int i = 0; i < 39 * 2; i++) { shared_ptr<ofxBox2dCircle> circle = shared_ptr<ofxBox2dCircle>(new ofxBox2dCircle); circle.get()->setPhysics(3.0, 0.5, 0.1); circle.get()->setup(this->box2d.getWorld(), ofRandom(ofGetWidth()), ofRandom(ofGetHeight()), ofRandom(9, 39)); this->circles.push_back(circle); } } //-------------------------------------------------------------- void ofApp::update() { ofSeedRandom(39); this->sensor_point = this->get_accelerometer_3d(); this->box2d.setGravity(this->sensor_point.x * 30, this->sensor_point.y * -30); this->box2d.update(); this->fbo.begin(); ofClear(0); ofSetColor(39, 139); this->font.drawString("X = " + std::to_string(this->sensor_point.x), 0, 100); this->font.drawString("Y = " + std::to_string(this->sensor_point.y), 0, 200); this->font.drawString("Z = " + std::to_string(this->sensor_point.z), 0, 300); for (int i = 0; i < this->circles.size(); i++) { ofColor circle_color; circle_color.setHsb(ofRandom(255), 239, 239); ofSetColor(circle_color); ofPushMatrix(); ofTranslate(this->circles[i]->getPosition()); ofBeginShape(); for (int deg = 0; deg <= 360; deg++) { ofVertex(this->circles[i]->getRadius() * cos(deg * DEG_TO_RAD), this->circles[i]->getRadius() * sin(deg * DEG_TO_RAD)); } ofEndShape(); ofPopMatrix(); } this->fbo.end(); } //-------------------------------------------------------------- void ofApp::draw() { this->fbo.draw(0, 0); } //-------------------------------------------------------------- ofPoint ofApp::get_accelerometer_3d() { ISensorManager* sensor_manager = nullptr; ISensorCollection* sensor_collection = nullptr; ISensor* sensor = nullptr; ISensorDataReport* data = nullptr; if (!SUCCEEDED(::CoInitializeEx(NULL, COINIT_MULTITHREADED))) { return ofPoint(); } if (!SUCCEEDED(::CoCreateInstance(CLSID_SensorManager, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&sensor_manager)))) { return ofPoint(); } if (!SUCCEEDED(sensor_manager->GetSensorsByCategory(SENSOR_TYPE_ACCELEROMETER_3D, &sensor_collection))) { sensor_manager->Release(); return ofPoint(); } if (!SUCCEEDED(sensor_collection->GetAt(0, &sensor))) { sensor_collection->Release(); sensor_manager->Release(); return ofPoint(); } if (!SUCCEEDED(sensor->GetData(&data))) { sensor->Release(); sensor_collection->Release(); sensor_manager->Release(); return ofPoint(); } PROPVARIANT x = {}; if (!SUCCEEDED(data->GetSensorValue(SENSOR_DATA_TYPE_ACCELERATION_X_G, &x))) { data->Release(); sensor->Release(); sensor_collection->Release(); sensor_manager->Release(); return ofPoint(); } PROPVARIANT y = {}; if (!SUCCEEDED(data->GetSensorValue(SENSOR_DATA_TYPE_ACCELERATION_Y_G, &y))) { data->Release(); sensor->Release(); sensor_collection->Release(); sensor_manager->Release(); return ofPoint(); } PROPVARIANT z = {}; if (!SUCCEEDED(data->GetSensorValue(SENSOR_DATA_TYPE_ACCELERATION_Z_G, &z))) { data->Release(); sensor->Release(); sensor_collection->Release(); sensor_manager->Release(); return ofPoint(); } data->Release(); sensor->Release(); sensor_collection->Release(); sensor_manager->Release(); return ofPoint(x.dblVal, y.dblVal, z.dblVal); } //-------------------------------------------------------------- int main() { ofSetupOpenGL(1280, 720, OF_WINDOW); ofRunApp(new ofApp()); } |