Commit 9c55c1f0 by Adrian Hoppe

vr anbindung

parent 2895ae6b
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>H:\Repositories\MasterArbeit\3_PointCloud\glm;D:\Dropbox\Studium\MasterArbeit\3_PointCloud\glm;..\openvr\headers;glew-2.0.0-win32\glew-2.0.0\include;freeglut-MSVC-3.0.0-2.mp\freeglut\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> <AdditionalIncludeDirectories>glm;..\openvr\headers;glew-2.0.0-win32\glew-2.0.0\include;freeglut-MSVC-3.0.0-2.mp\freeglut\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ClCompile> </ClCompile>
<Link> <Link>
<TargetMachine>MachineX86</TargetMachine> <TargetMachine>MachineX86</TargetMachine>
......
...@@ -17,11 +17,18 @@ std::string SteamTracking::getDeviceTypeAsString(vr::ETrackedDeviceClass device_ ...@@ -17,11 +17,18 @@ std::string SteamTracking::getDeviceTypeAsString(vr::ETrackedDeviceClass device_
return type; return type;
} }
glm::mat3x4* SteamTracking::convertMatrix(vr::HmdMatrix34_t in) glm::mat4x4* SteamTracking::convertMatrix(vr::HmdMatrix34_t in)
{ {
return new glm::mat3x4(in.m[0][0], in.m[0][1], in.m[0][2], in.m[0][3], /*
in.m[1][0], in.m[1][1], in.m[1][2], in.m[1][3], return new glm::mat4x4( in.m[0][0], in.m[0][1], in.m[0][2], in.m[0][3],
in.m[2][0], in.m[2][1], in.m[2][2], in.m[2][3] ); in.m[1][0], in.m[1][1], in.m[1][2], in.m[1][3],
in.m[2][0], in.m[2][1], in.m[2][2], in.m[2][3],
0.0F, 0.0F, 0.0F, 1.0F);
*/
return new glm::mat4x4( in.m[0][0], in.m[1][0], in.m[2][0], 0.0F,
in.m[0][1], in.m[1][1], in.m[2][1], 0.0F,
in.m[0][2], in.m[1][2], in.m[2][2], 0.0F,
in.m[0][3], in.m[1][3], in.m[2][3], 1.0F );
} }
...@@ -77,6 +84,15 @@ void SteamTracking::printVRDevices() { ...@@ -77,6 +84,15 @@ void SteamTracking::printVRDevices() {
} }
} }
void SteamTracking::processEvents()
{
vr::VREvent_t event;
while (vr_system_->PollNextEvent(&event, sizeof(event)))
{
processEvent(event);
}
}
void SteamTracking::printMatrix(const vr::HmdMatrix34_t &htm) void SteamTracking::printMatrix(const vr::HmdMatrix34_t &htm)
{ {
...@@ -93,18 +109,52 @@ void SteamTracking::printMatrix(const vr::HmdMatrix34_t &htm) ...@@ -93,18 +109,52 @@ void SteamTracking::printMatrix(const vr::HmdMatrix34_t &htm)
} }
} }
glm::mat3x4* SteamTracking::getTransformationForDevice(int nDevice) void SteamTracking::processEvent(vr::VREvent_t event)
{
switch (event.eventType)
{
case vr::VREvent_TrackedDeviceActivated:
if (debugEvents) printf("Device %u attached.\n", event.trackedDeviceIndex);
break;
case vr::VREvent_TrackedDeviceDeactivated:
if (debugEvents) printf("Device %u detached.\n", event.trackedDeviceIndex);
break;
case vr::VREvent_TrackedDeviceUpdated:
if (debugEvents) printf("Device %u updated.\n", event.trackedDeviceIndex);
break;
case vr::VREvent_ButtonPress:
if (onButtonPress) onButtonPress(event);
if (debugEvents) printf("Device %u Button pressed %u.\n", event.trackedDeviceIndex, event.data.controller.button);
break;
case vr::VREvent_ButtonUnpress:
if (debugEvents) printf("Device %u Button unpressed %u.\n", event.trackedDeviceIndex, event.data.controller.button);
break;
case vr::VREvent_ButtonTouch:
if (debugEvents) printf("Device %u Button touched %u.\n", event.trackedDeviceIndex, event.data.controller.button);
break;
case vr::VREvent_ButtonUntouch:
if (debugEvents) printf("Device %u Button untouched %u.\n", event.trackedDeviceIndex, event.data.controller.button);
break;
default:
if (debugEvents) printf("Event: %u\n", event.eventType);
break;
}
}
glm::mat4x4* SteamTracking::getTransformationForDevice(int nDevice)
{ {
if (!vr_system_) { if (!vr_system_) {
return new glm::mat3x4(); if (debug) std::cout << " NO VR System ";
return new glm::mat4x4();
} }
vr_system_->GetDeviceToAbsoluteTrackingPose(vr::TrackingUniverseRawAndUncalibrated, 0, tracked_device_poses_, vr::k_unMaxTrackedDeviceCount); vr_system_->GetDeviceToAbsoluteTrackingPose(vr::TrackingUniverseRawAndUncalibrated, 0, tracked_device_poses_, vr::k_unMaxTrackedDeviceCount);
if (!tracked_device_poses_[nDevice].bPoseIsValid) if (!tracked_device_poses_[nDevice].bPoseIsValid)
{ {
if (debug) std::cout << " Device " << nDevice << "Pois is Invalid"; if (debug) std::cout << " Device " << nDevice << "Pos is Invalid";
return new glm::mat3x4(); return new glm::mat4x4();
} }
vr::ETrackedDeviceClass device_class = vr_system_->GetTrackedDeviceClass(nDevice); vr::ETrackedDeviceClass device_class = vr_system_->GetTrackedDeviceClass(nDevice);
...@@ -112,7 +162,7 @@ glm::mat3x4* SteamTracking::getTransformationForDevice(int nDevice) ...@@ -112,7 +162,7 @@ glm::mat3x4* SteamTracking::getTransformationForDevice(int nDevice)
if (device_class == vr::TrackedDeviceClass_Invalid) if (device_class == vr::TrackedDeviceClass_Invalid)
{ {
if (debug) std::cout << " Device " << nDevice << "ist Invalid"; if (debug) std::cout << " Device " << nDevice << "ist Invalid";
return new glm::mat3x4(); return new glm::mat4x4();
} }
vr::HmdMatrix34_t htm = tracked_device_poses_[nDevice].mDeviceToAbsoluteTracking; vr::HmdMatrix34_t htm = tracked_device_poses_[nDevice].mDeviceToAbsoluteTracking;
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
#include <sstream> #include <sstream>
#include <openvr.h> #include <openvr.h>
#include <glm/mat3x4.hpp> #include <glm/mat4x4.hpp>
class SteamTracking class SteamTracking
...@@ -15,18 +15,28 @@ private: ...@@ -15,18 +15,28 @@ private:
std::string getDeviceTypeAsString(vr::ETrackedDeviceClass device_class); std::string getDeviceTypeAsString(vr::ETrackedDeviceClass device_class);
glm::mat3x4* convertMatrix(vr::HmdMatrix34_t in); glm::mat4x4* convertMatrix(vr::HmdMatrix34_t in);
void printMatrix(const vr::HmdMatrix34_t &htm); void printMatrix(const vr::HmdMatrix34_t &htm);
void processEvent(vr::VREvent_t evnt);
public: public:
bool debug = false; bool debug = false;
bool debugEvents = false;
SteamTracking(); SteamTracking();
~SteamTracking(); ~SteamTracking();
void printVRDevices(); void printVRDevices();
void processEvents();
glm::mat4x4* getTransformationForDevice(int nDevice);
glm::mat3x4* getTransformationForDevice(int nDevice); void (*onButtonPress)(vr::VREvent_t) = nullptr;
}; };
...@@ -12,9 +12,10 @@ ...@@ -12,9 +12,10 @@
#include <vector> #include <vector>
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>
#include <sstream> #include <sstream>
#include <glm/vec3.hpp> #include <glm/vec3.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <Kinect.h> #include <Kinect.h>
...@@ -22,8 +23,8 @@ ...@@ -22,8 +23,8 @@
GLuint vboId; GLuint vboId;
GLuint cboId; GLuint cboId;
GLuint vboIdArrow; GLuint vboIdExport;
GLuint cboIdArrow; GLuint cboIdExport;
float arrowPoints[] = { 1, 0 , 0, 0, 1, 0, 0, 0, 1 float arrowPoints[] = { 1, 0 , 0, 0, 1, 0, 0, 0, 1
}; };
...@@ -47,7 +48,7 @@ IMultiSourceFrameReader* reader; // Kinect data source ...@@ -47,7 +48,7 @@ IMultiSourceFrameReader* reader; // Kinect data source
ICoordinateMapper* mapper; // Converts between depth, color, and 3d coordinates ICoordinateMapper* mapper; // Converts between depth, color, and 3d coordinates
SteamTracking* steamTracking = nullptr; SteamTracking* steamTracking = nullptr;
glm::mat3x4* currentControlerPos = nullptr; glm::mat4x4* currentControlerPos = nullptr;
static bool writeFile = false; static bool writeFile = false;
static bool captureFrame = false; static bool captureFrame = false;
...@@ -182,7 +183,7 @@ void getKinectData(bool writeFrameInVector) { ...@@ -182,7 +183,7 @@ void getKinectData(bool writeFrameInVector) {
IMultiSourceFrame* frame = NULL; IMultiSourceFrame* frame = NULL;
if (SUCCEEDED(reader->AcquireLatestFrame(&frame))) { if (SUCCEEDED(reader->AcquireLatestFrame(&frame))) {
delete currentControlerPos; delete currentControlerPos;
currentControlerPos = steamTracking->getTransformationForDevice(0); currentControlerPos = steamTracking->getTransformationForDevice(1);
getDepthData(frame); getDepthData(frame);
getRgbData(frame, writeFrameInVector); getRgbData(frame, writeFrameInVector);
...@@ -233,16 +234,20 @@ void writePointCloud() { ...@@ -233,16 +234,20 @@ void writePointCloud() {
void rotateCamera() { void rotateCamera() {
static double angle = 0.; static double angle = 0.;
static double radius = 4.; static double radius = 20.;
double x = radius*sin(angle); double x = radius*sin(angle);
double z = radius*(1-cos(angle)) - radius/2; double z = radius*(1-cos(angle)) - radius/2;
//gluLookAt(0, 0, 0, 0, 5, 0, 0, 1, 0);
gluLookAt(x,0,z,0,0,radius/2,0,1,0); gluLookAt(x,0,z,0,0,radius/2,0,1,0);
//angle += 0.002; //angle += 0.002;
} }
void drawKinectData() { void drawKinectData() {
if (steamTracking)
steamTracking->processEvents();
getKinectData(captureFrame); getKinectData(captureFrame);
//add points to point cloud //add points to point cloud
...@@ -253,12 +258,23 @@ void drawKinectData() { ...@@ -253,12 +258,23 @@ void drawKinectData() {
points.reserve(points.size() + width*height); points.reserve(points.size() + width*height);
colors.reserve(colors.size() + width*height * 3); colors.reserve(colors.size() + width*height * 3);
for (int i = 0; i < snapshotPoints.size(); i++) { for (unsigned int i = 0; i < snapshotPoints.size(); i++) {
points.push_back(/*currentControlerPos */ snapshotPoints[i]); points.push_back(*currentControlerPos * glm::vec4(snapshotPoints[i], 1.0f));
colors.push_back(snapshotColors[i * 3]); colors.push_back(snapshotColors[i * 3]);
colors.push_back(snapshotColors[i * 3 + 1]); colors.push_back(snapshotColors[i * 3 + 1]);
colors.push_back(snapshotColors[i * 3 + 2]); colors.push_back(snapshotColors[i * 3 + 2]);
} }
/*
glBindBuffer(GL_ARRAY_BUFFER, vboIdExport);
glBufferData(GL_ARRAY_BUFFER, points.size() * sizeof(glm::vec3), &points[0], GL_DYNAMIC_DRAW);
glUnmapBuffer(GL_ARRAY_BUFFER);
glBindBuffer(GL_ARRAY_BUFFER, cboIdExport);
glBufferData(GL_ARRAY_BUFFER, colors.size() * sizeof(GLfloat), &colors[0], GL_DYNAMIC_DRAW);
glUnmapBuffer(GL_ARRAY_BUFFER);*/
} }
captureFrame = false; captureFrame = false;
...@@ -269,9 +285,9 @@ void drawKinectData() { ...@@ -269,9 +285,9 @@ void drawKinectData() {
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); glLoadIdentity();
rotateCamera(); rotateCamera();
if(currentControlerPos)
glMultMatrixf(glm::value_ptr(*currentControlerPos));
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
...@@ -287,7 +303,7 @@ void drawKinectData() { ...@@ -287,7 +303,7 @@ void drawKinectData() {
glDrawArrays(GL_POINTS, 0, width*height); glDrawArrays(GL_POINTS, 0, width*height);
glPushMatrix(); glPushMatrix();
float scale = 1.0 / 10; float scale = 1.0f / 10;
glScalef(scale, scale, scale); glScalef(scale, scale, scale);
//drawArrow(); //drawArrow();
...@@ -304,11 +320,11 @@ void keyPressed(unsigned char key, int x, int y) ...@@ -304,11 +320,11 @@ void keyPressed(unsigned char key, int x, int y)
{ {
switch (key) { switch (key) {
case 'a': case 'a':
std::cout << "Caturing Frame"<< std::endl; std::cout << "Caturing Frame Keyboard"<< std::endl;
captureFrame = true; captureFrame = true;
break; break;
case 's': case 's':
std::cout << "writing File"<< std::endl; std::cout << "writing File" << std::endl;
writeFile = true; writeFile = true;
break; break;
default: default:
...@@ -319,20 +335,31 @@ void keyPressed(unsigned char key, int x, int y) ...@@ -319,20 +335,31 @@ void keyPressed(unsigned char key, int x, int y)
instantly */ instantly */
} }
void captureNextFrame(vr::VREvent_t event)
{
if (event.trackedDeviceIndex == 1 && event.data.controller.button == 33) {
std::cout << "Caturing Frame controler Button" << std::endl;
captureFrame = true;
}
}
int main(int argc, char* argv[]) { int main(int argc, char* argv[]) {
std::cout << "Starting Kinect VR Point Cloud creator"; std::cout << "Starting Kinect VR Point Cloud creator";
if (!init(argc, argv)) return 1; if (!init(argc, argv)) return 1;
if (!initKinect()) return 1; if (!initKinect()) return 1;
if (!initVR()) if (!initVR())
{ {
shutdownVR(); shutdownVR();
} }
steamTracking = new SteamTracking(); steamTracking = new SteamTracking();
steamTracking->printVRDevices();
steamTracking->onButtonPress = captureNextFrame;
// OpenGL setup // OpenGL setup
...@@ -347,18 +374,17 @@ int main(int argc, char* argv[]) { ...@@ -347,18 +374,17 @@ int main(int argc, char* argv[]) {
float* fdest2 = (float*)framePositions; float* fdest2 = (float*)framePositions;
for (int j = 0; j < height; j++) { for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) { for (int i = 0; i < width; i++) {
*fdest++ = 1.0 * i / width; *fdest++ = 1.0f * i / width;
*fdest++ = 1.0 *j / height; *fdest++ = 1.0f *j / height;
*fdest++ = 1; *fdest++ = 1;
snapshotPoints.push_back(glm::vec3(1.0 * i / width, 1.0 *j / height, 0)); snapshotPoints.push_back(glm::vec3(1.0 * i / width, 1.0 *j / height, 0));
snapshotColors.push_back(1.0 *i / width*255); snapshotColors.push_back((unsigned char) 1.0 *i / width * 255);
snapshotColors.push_back(1.0 *j / height*255); snapshotColors.push_back((unsigned char) 1.0 *j / height*255);
snapshotColors.push_back(0); snapshotColors.push_back(0);
*fdest2++ = 1.0f *i / width;
*fdest2++ = 1.0 *i / width; *fdest2++ = 1.0f *j / height;;
*fdest2++ = 1.0 *j / height;;
*fdest2++ = 0; *fdest2++ = 0;
} }
...@@ -388,7 +414,6 @@ int main(int argc, char* argv[]) { ...@@ -388,7 +414,6 @@ int main(int argc, char* argv[]) {
// Main loop // Main loop
atexit(close); atexit(close);
execute(); execute();
//drawKinectData();
...@@ -399,3 +424,7 @@ int main(int argc, char* argv[]) { ...@@ -399,3 +424,7 @@ int main(int argc, char* argv[]) {
void close() { void close() {
delete steamTracking; delete steamTracking;
} }
void drawGround()
{
}
#pragma once #pragma once
#include <openvr.h>
const int width = 512; const int width = 512;
const int height = 424; const int height = 424;
const int colorwidth = 1920; const int colorwidth = 1920;
...@@ -6,8 +7,10 @@ const int colorheight = 1080; ...@@ -6,8 +7,10 @@ const int colorheight = 1080;
void drawKinectData(); void drawKinectData();
void keyPressed(unsigned char key, int x, int y); void keyPressed(unsigned char key, int x, int y);
void captureNextFrame(vr::VREvent_t event);
void writePointCloud(); void writePointCloud();
void close(); void close();
void drawGround();
struct pntsHeader { struct pntsHeader {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment