flavius / Cross.cpp secret
Created

Embed URL

HTTPS clone URL

SSH clone URL

You can clone with HTTPS or SSH.

Download Gist
View Cross.cpp
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
#include "Cross.h"
#include <osg/Geometry>
#include <osg/Array>
#include <osgText/Text>
 
 
Cross::Cross(float cross_len) {
geom = new osg::Geometry;
this->addDrawable(geom);
this->vertices = new osg::Vec3Array;
this->vertices->push_back(osg::Vec3(-cross_len, 0.0, 0.0));
this->vertices->push_back(osg::Vec3(cross_len, 0.0, 0.0));
this->vertices->push_back(osg::Vec3(0.0, -cross_len, 0.0));
this->vertices->push_back(osg::Vec3(0.0, cross_len, 0.0));
this->vertices->push_back(osg::Vec3(0.0, 0.0, -cross_len));
this->vertices->push_back(osg::Vec3(0.0, 0.0, cross_len));
this->geom->setVertexArray(this->vertices);
 
lines = new osg::DrawElementsUInt(osg::PrimitiveSet::LINES, 0);
lines->push_back(5);
lines->push_back(4);
lines->push_back(3);
lines->push_back(2);
lines->push_back(1);
lines->push_back(0);
 
geom->addPrimitiveSet(lines);
}
 
void Cross::setVertexLabel(int id, std::string label) {
osg::Vec3 vec = this->vertices[0][id];
osgText::TextBase::AxisAlignment plane;
osgText::TextBase::AlignmentType alignment;
for(int i=0; i < 3; i++) {
if(vec[i] == 0) {
continue;
}
if(vec[i] < 0) {
alignment = osgText::Text::RIGHT_CENTER;
}
else {
alignment = osgText::Text::LEFT_CENTER;
}
}
plane = osgText::Text::XY_PLANE;
osg::Geode *v_geode = new osg::Geode;
osgText::Text *v_text = new osgText::Text;
v_geode->addDrawable(v_text);
this->addDrawable(v_text);
v_text->setPosition(vec);
v_text->setText(label);
v_text->setCharacterSize(10);
v_text->setDrawMode(osgText::Text::TEXT |
osgText::Text::ALIGNMENT |
osgText::Text::BOUNDINGBOX);
v_text->setAlignment(alignment);
v_text->setAxisAlignment(plane);
}
View Cross.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#ifndef _CROSS_H_
#define _CROSS_H_
 
#include <osg/Geode>
#include <osg/Geometry>
#include <string>
 
class Cross : public osg::Geode {
private:
osg::Geometry *geom;
osg::Vec3Array *vertices;
osg::DrawElementsUInt *lines;
public:
Cross(float cross_len);
void setVertexLabel(int id, std::string label);
};
 
#endif
View Cross.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#include "HUD.h"
#include <string>
 
HUD::HUD() {
this->hud_geode = new osg::Geode;
this->hud_text = new osgText::Text;
this->hud_view_m = new osg::MatrixTransform();
 
this->setMatrix(osg::Matrix::ortho2D(0,1024,0,768));
this->hud_view_m->setMatrix(osg::Matrix::identity());
this->hud_view_m->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
this->hud_view_m->addChild(hud_geode);
this->addChild(hud_view_m);
 
this->hud_text->setCharacterSize(10);
//this->hud_text->setFont("C:/WINDOWS/Fonts/impact.ttf");
this->hud_text->setAxisAlignment(osgText::Text::SCREEN);
this->hud_text->setPosition( osg::Vec3(0,750, -1) );
this->hud_geode->addDrawable(hud_text);
}
 
void HUD::setStatus(std::string text) {
this->hud_text->setText(text);
}
View Cross.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#ifndef _HUD_H
#define _HUD_H_
 
#include <osg/Projection>
#include <osg/MatrixTransform>
#include <osgText/Text>
#include <osg/Geode>
#include <string>
 
class HUD : public osg::Projection {
private:
osg::Geode *hud_geode;
osg::MatrixTransform *hud_view_m;
osgText::Text *hud_text;
public:
HUD();
void setStatus(std::string text);
};
 
#endif
View Cross.cpp
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
SRC=Simple.cpp Cross.cpp HUD.cpp
 
CXXFLAGS=-DLINUX
 
INCLUDE = -I. -I/usr/include/ -I/usr/include/X11/ -I/usr/local/include/GL
LDLIBS = -lm -ldl -lGL -lGLU -lpthread -lXext -lX11 -losg -losgViewer -losgSim -losgGA -losgText
LDFLAGS = -L. -L/usr/lib -L/usr/X11R6/lib -L/usr/local/lib
COBJS=$(patsubst %.cpp,%.o,$(SRC))
 
CC=g++
 
EXE=simple
 
all: $(EXE)
 
$(EXE): $(COBJS)
$(CC) -o $(EXE) $(COBJS) $(INCLUDE) $(LDFLAGS) $(LDLIBS)
 
$(COBJS): %.o : %.cpp
$(CC) -c $(CXXFLAGS) -o $@ $<
 
.PHONY: clean
 
clean:
rm -rf $(EXE) $(COBJS)
View Cross.cpp
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
#include <osgViewer/Viewer>
#include <osgGA/TrackballManipulator>
#include <osg/Math>
#include <iostream>
#include <iomanip>
#include <sstream>
 
#include "Cross.h"
#include "HUD.h"
 
//#define S std::setw(4)
#define S '\t'
 
#define DEBUG_MATD(matd, s) s.fill(' '); s \
<< S << matd(0,0) << S << ' ' << S << matd(0, 1) << S << ' ' << S << matd(0, 2) << S << ' ' << S << matd(0, 3) << '\n' \
<< S << matd(1,0) << S << ' ' << S << matd(1, 1) << S << ' ' << S << matd(1, 2) << S << ' ' << S << matd(1, 3) << '\n' \
<< S << matd(2,0) << S << ' ' << S << matd(2, 1) << S << ' ' << S << matd(2, 2) << S << ' ' << S << matd(2, 3) << '\n' \
<< S << matd(3,0) << S << ' ' << S << matd(3, 1) << S << ' ' << S << matd(3, 2) << S << ' ' << S << matd(3, 3) << '\n'
 
std::string getMatrixRepresentation(osg::Matrixd &m) {
std::stringstream s;
s.fill(' ');
s.setf(std::ios::right, std::ios::adjustfield);
for(int i=0; i < 4; i++) {
for(int j=0; j < 4; j++) {
s << std::setw(10) << m(i, j);
}
s << '\n';
}
return s.str();
}
 
int main(void) {
osgViewer::Viewer viewer;
osg::Group *root = new osg::Group();
viewer.setSceneData(root);
osgGA::TrackballManipulator *cameraManipulator = new osgGA::TrackballManipulator();
viewer.setCameraManipulator(cameraManipulator);
viewer.realize();
 
osg::Matrixd camera_pos(
1.0, 0.0, 0.0, 0.0,
0.0, 1.0, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 500.0, 1.0 //position along x,y,z-axes (panning)
);
#define RAD 1
#define DEG 45.0
 
#if RAD
float q_sin = sinf(osg::DegreesToRadians(DEG));
float q_cos = cosf(osg::DegreesToRadians(DEG));
#else
float q_sin = sinf(DEG);
float q_cos = cosf(DEG);
#endif
osg::Matrixd rotate_x(
1.0, 0.0, 0.0, 0.0,
0.0, q_cos, -q_sin, 0.0,
0.0, q_sin, q_cos, 0.0,
0.0, 0.0, 0.0, 1.0
);
osg::Matrixd rotate_y(
q_cos, 0.0, q_sin, 0.0,
0.0, 1.0, 0.0, 0.0,
-q_sin, 0.0, q_cos, 0.0,
0.0, 0.0, 0.0, 1.0
);
osg::Matrixd rotate_z(
q_cos, -q_sin, 0.0, 0.0, // 90 deg rotation to the left
q_sin, q_cos, 0.0, 0.0, // along the z axis (roll). reason: sin(90°) = 1
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0
);
camera_pos = camera_pos * rotate_x;
camera_pos = camera_pos * rotate_y;
//camera_pos = camera_pos * rotate_z; // we do not want to rotate along the
//z-axis
osg::Matrixd correction(
cosf(90), 0.0, sinf(90), 0.0,
0.0, 1.0, 0.0, 0.0,
-sinf(90), 0.0, cosf(90), 0.0,
0.0, 0.0, 0.0, 1.0
);
//camera_pos = camera_pos * correction;
cameraManipulator->setByMatrix(camera_pos);
 
Cross *crossGeode = new Cross(100.0);
crossGeode->setVertexLabel(0, "-X");
crossGeode->setVertexLabel(1, "X");
crossGeode->setVertexLabel(2, "-Y");
crossGeode->setVertexLabel(3, "Y");
crossGeode->setVertexLabel(4, "-Z");
crossGeode->setVertexLabel(5, "Z");
 
/*
osg::MatrixTransform *cross_pos = new osg::MatrixTransform;
cross_pos->addChild(crossGeode);
osg::Matrixd *cross_matrix = new osg::Matrixd(
);
cross_pos->setMatrix(*cross_matrix);
*/
//root->addChild(cross_pos);
 
root->addChild(crossGeode);
 
 
HUD *hudGeode = new HUD();
root->addChild(hudGeode);
 
#define ANIMATE 0
#define DEG_DELTA 0.1
 
#if ANIMATE
float dir=DEG_DELTA;
float deg=0;
q_cos = cosf(osg::DegreesToRadians(DEG_DELTA));
q_sin = sinf(osg::DegreesToRadians(DEG_DELTA));
osg::Matrixd rotate(
q_cos, 0.0, q_sin, 0.0,
0.0, 1.0, 0.0, 0.0,
-q_sin, 0.0, q_cos, 0.0,
0.0, 0.0, 0.0, 1.0
);
#endif
osg::Matrixd camM;
while(!viewer.done()) {
#if ANIMATE
camM = cameraManipulator->getMatrix();
//viewer.getCamera()->setViewMatrix(rotate);
cameraManipulator->setByMatrix(camM * rotate);
std::stringstream oss;
deg = (camM.getRotate().y());
deg = osg::RadiansToDegrees(camM.getRotate().y());
oss << getMatrixRepresentation(camM) << " DEG: " << deg;
hudGeode->setStatus(oss.str());
#else
camM = cameraManipulator->getMatrix();
hudGeode->setStatus(getMatrixRepresentation(camM));
#endif
viewer.frame();
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Something went wrong with that request. Please try again.