19 Commits

Author SHA1 Message Date
Endertom dfbe5684a5 Aggiornato readme 2026-06-24 14:58:04 +02:00
Endert0m de272f572b Update README.md 2026-06-24 13:06:17 +02:00
Endertom f4dd508152 Merge branch 'main' of https://github.com/Endert0m/FCG_VisualizzatoreCamminata 2026-06-23 18:58:23 +02:00
Endertom a1c8443b8e Aggiunta relazione 2026-06-23 18:58:15 +02:00
Endert0m 5af236ad44 Update README.md 2026-06-23 13:13:22 +02:00
Endertom 7fadd4a9ef Modifica versione in cmakelists 2026-06-23 13:11:25 +02:00
Endertom 5588ccee31 Aggiunta finestra di controllo visibilità 2026-06-23 12:52:19 +02:00
Endertom c48d0505fc Refactoring collezioni 2026-06-23 11:39:36 +02:00
Endertom 2dfd574814 Preparazione controllo visibilità collezioni 2026-06-23 11:31:19 +02:00
Endertom f74155e9f7 Rimosso demo imGui 2026-06-22 19:42:39 +02:00
Endertom 68b9d89c12 Refactoring main e update di readme 2026-06-22 19:31:38 +02:00
Endertom 1dd7ce812a Aggiunte texture pavimento 2026-06-22 19:20:31 +02:00
Endertom 276e00aee1 Aggiustata direzione texture su YZ 2026-06-22 19:01:14 +02:00
Endertom d2a0256a3e Aggiunta pavimento 2026-06-22 18:57:07 +02:00
Endertom 4e763fc2af Aggiustato cambio direzione texture 2026-06-22 18:37:19 +02:00
Endertom 818677f831 Aggiunta texture 2026-06-22 17:12:46 +02:00
Endertom 37619774f2 Refactoring per inserimento texture 2026-06-22 16:39:59 +02:00
Endertom 821dd67b5b Fix dei warning e posizione texture 2026-06-22 16:08:39 +02:00
Endertom 4ac25779bd Preparazione aggiunta texture 2026-06-22 16:00:08 +02:00
37 changed files with 333 additions and 210 deletions
+2 -2
View File
@@ -53,9 +53,9 @@ target_compile_options(common INTERFACE
set(METHODS_PATH "./src/*/methods/*.cpp") set(METHODS_PATH "./src/*/methods/*.cpp")
set(VERSION "V9") set(VERSION "V11")
file(GLOB_RECURSE METHODS_SRC "${METHODS_PATH}") file(GLOB_RECURSE METHODS_SRC "${METHODS_PATH}")
add_executable(main${VERSION} ./src/testMain.cpp ${METHODS_SRC} ) add_executable(main${VERSION} ./src/Main.cpp ${METHODS_SRC} )
target_link_libraries(main${VERSION} PRIVATE SFML::Graphics ImGui-SFML::ImGui-SFML common glm) target_link_libraries(main${VERSION} PRIVATE SFML::Graphics ImGui-SFML::ImGui-SFML common glm)
target_compile_definitions(main${VERSION} PRIVATE $<$<CONFIG:Debug>:DEBUG_MODE>) target_compile_definitions(main${VERSION} PRIVATE $<$<CONFIG:Debug>:DEBUG_MODE>)
+18 -3
View File
@@ -1,5 +1,7 @@
# FCG_VisualizzatoreCamminata # FCG_VisualizzatoreCamminata
- # **Nella branch All_Releases ci sono tutte le release con istruzioni per la compilazione e la relazione**
## Nella versione versione v0.1 è presente la base del progetto. ## Nella versione versione v0.1 è presente la base del progetto.
@@ -58,10 +60,23 @@ Per spostare l'intera scena si tiene premuto il tasto centrale del mouse.
- Modificata la funzione update di pezzi e collezioni per implementare controllo sul tempo - Modificata la funzione update di pezzi e collezioni per implementare controllo sul tempo
- Aggiunta finestra con slider per selezione moltiplicatore del tempo - Aggiunta finestra con slider per selezione moltiplicatore del tempo
## Nella versione v1.0
- Aggiunta controllo texture
- Aggiunta pavimento
- Refactoring generale
- Definizione main finale (non più di test)
## Nella versione v1.1
- Aggiunta controllo visibilità collezioni su GUI
- Refactoring collezioni
# Per compilare: # Per compilare:
cmake --build mkdir build //se non esiste già
cd build
cmake ..
cmake --build . -j$(nproc)
# Per lanciare: # Per lanciare:
cd bin
./build/bin/mainV9 ./mainV11
+6 -1
View File
@@ -5,6 +5,7 @@ Size=400,400
[Window][Dear ImGui Demo] [Window][Dear ImGui Demo]
Pos=487,44 Pos=487,44
Size=455,873 Size=455,873
Collapsed=1
[Window][Hello, world!] [Window][Hello, world!]
Pos=11,12 Pos=11,12
@@ -43,6 +44,10 @@ Pos=400,0
Size=400,30 Size=400,30
[Window][Set time multiplier] [Window][Set time multiplier]
Pos=400,640 Pos=400,639
Size=400,30 Size=400,30
[Window][Set overlap]
Pos=500,31
Size=300,70
BIN
View File
Binary file not shown.
Binary file not shown.
BIN
View File
Binary file not shown.
+77
View File
@@ -0,0 +1,77 @@
#include "include.hpp"
int main() {
CSVProcessor processor;
// inizializzo variabili per gestire l'intervallo di visualizzazione
unsigned int min = 0;
unsigned int pos = 0;
unsigned int maj = 100;
//Costruisco la GUI
State gs(800, 700, "Visualizzatore passo",&maj,&min,&pos);
gs.window.setFramerateLimit(70);
printf("Costruisco gli oggetti\n");
try{
processor.readCSVFile (DATA_PATH + "coscia_filt.csv"); //utilizzo questo file per definire la dimensione dei dati
const auto& coscia = processor.getData();
gs.setIntervall(coscia.size());
//provo ad aggiungere una collection
//gs.collections.push_back(new Gamba({220,0,220},&pos,"coscia_filt.csv","caviglia_filt.csv"));
std::vector<gamba_data> data;
gamba_data d;
d.dataPos = &pos;
d.cavigliaData = "caviglia_dx.csv";
d.cosciaData = "coscia_dx.csv";
gamba_data s;
s.dataPos = &pos;
s.cavigliaData = "caviglia_sx.csv";
s.cosciaData = "coscia_sx.csv";
data.push_back(d);
data.push_back(s);
gs.collections.push_back(new Lower_Body(rb::Vector3{200,200,100},data));
//aggiungo il pavimento
gs.pieces.push_back(new Pavimento({200,200,550},_Float16(0.2) ));
gs.pieces[0]->body.setRot({0,-0.03,0});
printf("Ho costruito tutto!\n");
}
catch(char* e){
printf("%s\n",e);
}
printf("Avvio l'interfaccia grafica\n");
unsigned int curTime = 0;
unsigned int freq = 50; //frequenza campionamento sensori
const unsigned int T = 1000/freq; //i sensori hanno una freq di campionamento di 50hz
//Avvio il loop della GUI
gs.clock.start();
gs.updateCollections();
sf::Clock mainClock;
while (gs.window.isOpen())
{
curTime += mainClock.restart().asMilliseconds() *(*gs.tMul) ;
if (curTime > T){
if (gs.play && pos+curTime/T < maj) pos += curTime / T;
curTime = 0;
}
// Show update
gs.update();
doGraphics(gs);
}
return 0;
}
@@ -11,10 +11,27 @@ struct collection{
class CollectionInterface{ class CollectionInterface{
protected:
float transparency = 1.0;
bool isVisible = true;
public: public:
virtual collection create(ReferencePlane plane) = 0; virtual collection create(ReferencePlane plane) = 0;
virtual void update(sf::Clock cl, float multiplier) = 0; virtual void update(sf::Clock cl, float multiplier) = 0;
virtual bool setTransparency(float alpha) = 0; virtual bool setTransparency(float alpha) {
if (alpha < 0 || alpha > 1) return false;
transparency = alpha;
return true;
};
virtual bool getVisibility(){
return isVisible;
}
virtual float getTransparency() {
return transparency;
}
virtual void setVisibility(bool c) {
isVisible = c;
}
virtual ~CollectionInterface(){}; virtual ~CollectionInterface(){};
}; };
-1
View File
@@ -14,7 +14,6 @@ class Gamba : public CollectionInterface {
collection create(ReferencePlane plane) override; collection create(ReferencePlane plane) override;
PieceInterface* getJointPiece(); PieceInterface* getJointPiece();
void setDirection(Direction dir); void setDirection(Direction dir);
bool setTransparency(float alpha) override;
void update(sf::Clock cl, float multiplier)override {}; void update(sf::Clock cl, float multiplier)override {};
float getZ_Acc(); float getZ_Acc();
}; };
-2
View File
@@ -34,8 +34,6 @@ public:
Lower_Body(rb::Vector3 pos, std::vector<gamba_data> data); Lower_Body(rb::Vector3 pos, std::vector<gamba_data> data);
~Lower_Body(); ~Lower_Body();
void update(sf::Clock cl, float multiplier) override; void update(sf::Clock cl, float multiplier) override;
void setVisibility(bool c);
bool setTransparency(float alpha) override;
collection create(ReferencePlane plane) override; collection create(ReferencePlane plane) override;
}; };
+2 -16
View File
@@ -32,9 +32,11 @@ Gamba::Gamba(rb::Vector3 pos, unsigned int* dataPos, std::string cosciaData, std
collection Gamba::create(ReferencePlane plane){ collection Gamba::create(ReferencePlane plane){
collection coll; collection coll;
for(auto e : pezzi){ for(auto e : pezzi){
e->setTransparency(transparency);
coll.pieces.push_back(e); coll.pieces.push_back(e);
} }
for(auto e : sensori){ for(auto e : sensori){
e->setTransparency(transparency);
coll.pieces.push_back(e); coll.pieces.push_back(e);
} }
@@ -58,26 +60,10 @@ void Gamba::setDirection(Direction dir){
} }
} }
bool Gamba::setTransparency(float alpha){
for (auto i : pezzi){
if (!i->setTransparency(alpha)) return false;
}
for (auto i : sensori){
if (!i->setTransparency(alpha)) return false;
}
return true;
}
float Gamba::getZ_Acc(){ float Gamba::getZ_Acc(){
float totZ_Acc = 0; float totZ_Acc = 0;
/*
for (auto i : sensori){
totZ_Acc += i->getZ_Acc();
}*/
totZ_Acc = sensori[0]->getZ_Acc() + sensori[1]->getZ_Acc(); totZ_Acc = sensori[0]->getZ_Acc() + sensori[1]->getZ_Acc();
//printf("TotAccGamba %f\n", totZ_Acc);
return totZ_Acc; return totZ_Acc;
} }
+34 -43
View File
@@ -18,42 +18,43 @@ Lower_Body::Lower_Body(rb::Vector3 pos,std::vector<gamba_data> data){
collection Lower_Body::create(ReferencePlane plane){ collection Lower_Body::create(ReferencePlane plane){
collection coll; collection coll;
sx->setTransparency(1); sx->setTransparency(transparency);
dx->setTransparency(1); dx->setTransparency(transparency);
t->setTransparency(transparency);
coll.joints.push_back(jsx); if (isVisible){
coll.joints.push_back(jdx); coll.joints.push_back(jsx);
coll.joints.push_back(jdx);
switch (plane) switch (plane)
{ {
case ReferencePlane::XZN: case ReferencePlane::XZN:
dx->setTransparency(0.5); dx->setTransparency(0.5 * transparency);
dx->setDirection(Direction::L); dx->setDirection(Direction::L);
sx->setDirection(Direction::R); sx->setDirection(Direction::R);
coll = coll + dx->create(plane); coll = coll + dx->create(plane);
coll = coll + sx->create(plane); coll = coll + sx->create(plane);
break; break;
case ReferencePlane::XZ: case ReferencePlane::XZ:
sx->setTransparency(0.5); sx->setTransparency(0.5 * transparency);
dx->setDirection(Direction::R); dx->setDirection(Direction::R);
sx->setDirection(Direction::L); sx->setDirection(Direction::L);
coll = coll + sx->create(plane); coll = coll + sx->create(plane);
coll = coll + dx->create(plane); coll = coll + dx->create(plane);
break; break;
case ReferencePlane::YZ: case ReferencePlane::YZ:
sx->setDirection(Direction::R); sx->setDirection(Direction::R);
dx->setDirection(Direction::L); dx->setDirection(Direction::L);
coll = coll + dx->create(plane); coll = coll + dx->create(plane);
coll = coll + sx->create(plane); coll = coll + sx->create(plane);
break; break;
default: default:
break; break;
}
coll.pieces.push_back(t);
} }
coll.pieces.push_back(t);
return coll; return coll;
} }
@@ -65,23 +66,13 @@ Lower_Body::~Lower_Body(){
delete jsx; delete jsx;
} }
void Lower_Body::setVisibility(bool c){
}
bool Lower_Body::setTransparency(float alpha){
if (!sx->setTransparency(alpha)) return false;
dx->setTransparency(alpha);
t->setTransparency(alpha);
return true;
}
void Lower_Body::update(sf::Clock cl, float multiplier){ void Lower_Body::update(sf::Clock cl, float multiplier){
float sxAcc = sx->getZ_Acc() ; float sxAcc = sx->getZ_Acc() ;
float dxAcc = dx->getZ_Acc() ; float dxAcc = dx->getZ_Acc() ;
int64_t Dtime = cl.getElapsedTime().asMicroseconds(); int64_t Dtime = cl.getElapsedTime().asMicroseconds();
if (prevT == 0) prevT >= Dtime; if (prevT == 0) prevT = Dtime;
float dt = (float(Dtime) / 1000000.0) - (float(prevT) / 1000000.0); float dt = (float(Dtime) / 1000000.0) - (float(prevT) / 1000000.0);
prevT = Dtime; prevT = Dtime;
+2 -1
View File
@@ -5,7 +5,8 @@
#include "pieces/headers/caviglia.hpp" #include "pieces/headers/caviglia.hpp"
#include "pieces/headers/sensore.hpp" #include "pieces/headers/sensore.hpp"
#include "pieces/headers/torso.hpp" #include "pieces/headers/torso.hpp"
#include "pieces/headers/pavimento.hpp"
#include "joints/headers/rigid_joint.hpp" #include "joints/headers/rigid_joint.hpp"
#include "joints/headers/pivot_joint.hpp" #include "joints/headers/pivot_joint.hpp"
#include "collections/headers/gamba.hpp" #include "collections/headers/gamba.hpp"
#include "collections/headers/lower_body.hpp" #include "collections/headers/lower_body.hpp"
+4 -1
View File
@@ -3,11 +3,14 @@
#ifndef CAVIGLIA_H #ifndef CAVIGLIA_H
#define CAVIGLIA_H #define CAVIGLIA_H
class Caviglia : public PieceInterface{ class Caviglia : public PieceInterface{
private: private:
const sf::Vector3f caviglia_Dim = {60, 200, 60}; const sf::Vector3f caviglia_Dim = {60, 200, 60};
const sf::Color caviglia_Col = sf::Color(230,160,11,255); const sf::Color caviglia_Col = sf::Color(230,160,11,255);
const std::string TEXTURE_F = std::string("cavigliaF.png");
const std::string TEXTURE_L = std::string("cavigliaL.png");
public: public:
+4
View File
@@ -5,11 +5,15 @@
class Coscia : public PieceInterface{ class Coscia : public PieceInterface{
private: private:
const sf::Vector3f coscia_Dim = {80, 200, 80}; const sf::Vector3f coscia_Dim = {80, 200, 80};
const sf::Color coscia_Col = sf::Color::Yellow; const sf::Color coscia_Col = sf::Color::Yellow;
const std::string TEXTURE_F = std::string("cosciaF.png");
const std::string TEXTURE_L = std::string("cosciaL.png");
public: public:
Coscia(rb::Vector3 coords, _Float16 mass); Coscia(rb::Vector3 coords, _Float16 mass);
-1
View File
@@ -1 +0,0 @@
#include "piece_interface.hpp"
+25
View File
@@ -0,0 +1,25 @@
#include "piece_interface.hpp"
#ifndef PAVIMENTO_H
#define PAVIMENTO_H
class Pavimento : public PieceInterface{
private:
const sf::Vector3f pavimento_Dim = {600, 40, 600};
const sf::Color pavimento_Col = sf::Color(255,255,255,255);
const std::string TEXTURE_F = std::string("pavimentoF.png");
const std::string TEXTURE_L = std::string("pavimentoL.png");
public:
Pavimento(rb::Vector3 coords, _Float16 mass);
~Pavimento();
void update(sf::Clock cl, float multiplier) override {};
sf::Shape* draw(ReferencePlane plane) override;
};
#endif
+17
View File
@@ -2,6 +2,7 @@
#include <math.h> #include <math.h>
#include "../../rigidbody/headers/rb.hpp" #include "../../rigidbody/headers/rb.hpp"
#define TEXTUREPATH std::string("./../../textures/")
#ifndef PIECE_INTERFACE_H #ifndef PIECE_INTERFACE_H
#define PIECE_INTERFACE_H #define PIECE_INTERFACE_H
@@ -31,6 +32,22 @@ class PieceInterface{
shapeYZ->setFillColor(color); shapeYZ->setFillColor(color);
} }
Direction direction = Direction::L; Direction direction = Direction::L;
sf::Texture TextureF ;
sf::Texture TextureL ;
void setTextures (std::string F, std::string L){
try{
TextureF = sf::Texture(TEXTUREPATH + F);
TextureL = sf::Texture(TEXTUREPATH + L);
shapeXZ->setTexture(&TextureL);
shapeYZ->setTexture(&TextureF);
}catch(...){
throw "Errore nel caricamento texture.";
}
}
public: public:
sf::Shape* shapeXZ, *shapeYZ; sf::Shape* shapeXZ, *shapeYZ;
rb::Vector3 globalPos; rb::Vector3 globalPos;
+1 -1
View File
@@ -7,7 +7,7 @@
class Sensore : public PieceInterface{ class Sensore : public PieceInterface{
private: private:
const sf::Vector3f sensore_Dim = {30, 60, 30}; const sf::Vector3f sensore_Dim = {15, 20, 15};
const sf::Color sensore_Col = sf::Color::Red; const sf::Color sensore_Col = sf::Color::Red;
std::vector<std::vector<float>> accData; std::vector<std::vector<float>> accData;
+4 -2
View File
@@ -4,12 +4,14 @@
#define TORSO_H #define TORSO_H
class Torso : public PieceInterface{ class Torso : public PieceInterface{
private: private:
const sf::Vector3f torso_Dim = {100, 100, 150}; const sf::Vector3f torso_Dim = {100, 100, 150};
const sf::Color torso_Col = sf::Color::Red; const sf::Color torso_Col = sf::Color::Red;
const std::string TEXTURE_F = std::string("bacinoF.png");
const std::string TEXTURE_L = std::string("bacinoL.png");
public: public:
Torso(rb::Vector3 coords, _Float16 mass); Torso(rb::Vector3 coords, _Float16 mass);
~Torso(); ~Torso();
+10 -2
View File
@@ -7,6 +7,13 @@ Caviglia::Caviglia(rb::Vector3 coords, _Float16 mass){
globalPos = {0,0,0}; globalPos = {0,0,0};
initialize_shapes(caviglia_Dim); initialize_shapes(caviglia_Dim);
try{
setTextures(TEXTURE_F,TEXTURE_L);
}
catch (const char* &e ){
printf("Caviglia: %s\n", e);
}
} }
@@ -31,8 +38,9 @@ sf::Shape* Caviglia::draw(ReferencePlane plane){
sf::Shape* shape = shapeXZ; sf::Shape* shape = shapeXZ;
shape->setRotation(sf::Angle(sf::radians(tmpRot[1]))); shape->setRotation(sf::Angle(sf::radians(tmpRot[1])));
shape->setPosition({tmpPos[0]+globalPos[0],tmpPos[2]+globalPos[2]}); shape->setPosition({tmpPos[0]+globalPos[0],tmpPos[2]+globalPos[2]});
shape->setScale({1,cos(float(tmpRot[0]))}); shape->setScale({plane == ReferencePlane::XZ ? float(1.0) : float(-1.0),cos(float(tmpRot[0]))});
shape->setFillColor(color*sf::Color(255,255,255,transparency*255)); shape->setFillColor(color*sf::Color(255,255,255,transparency*255));
return shape;} return shape;}
break; break;
@@ -41,7 +49,7 @@ sf::Shape* Caviglia::draw(ReferencePlane plane){
sf::Shape* shape = shapeYZ; sf::Shape* shape = shapeYZ;
shape->setRotation(sf::Angle(sf::radians(tmpRot[0]))); shape->setRotation(sf::Angle(sf::radians(tmpRot[0])));
shape->setPosition({tmpPos[1]+globalPos[1],tmpPos[2]+globalPos[2]}); shape->setPosition({tmpPos[1]+globalPos[1],tmpPos[2]+globalPos[2]});
shape->setScale({1,cos(float(tmpRot[1]))}); shape->setScale({direction == Direction::R ? float(1.0) : float(-1.0),cos(float(tmpRot[1]))});
shape->setFillColor(color*sf::Color(255,255,255,transparency*255)); shape->setFillColor(color*sf::Color(255,255,255,transparency*255));
return shape;} return shape;}
break; break;
+9 -2
View File
@@ -6,6 +6,13 @@ Coscia::Coscia(rb::Vector3 coords, _Float16 mass){
color = coscia_Col; color = coscia_Col;
globalPos = {0,0,0}; globalPos = {0,0,0};
initialize_shapes(coscia_Dim); initialize_shapes(coscia_Dim);
try{
setTextures(TEXTURE_F,TEXTURE_L);
}
catch (const char* &e ){
printf("Coscia: %s\n", e);
}
} }
Coscia::~Coscia(){ Coscia::~Coscia(){
@@ -30,7 +37,7 @@ sf::Shape* Coscia::draw(ReferencePlane plane){
sf::Shape* shape = shapeXZ; sf::Shape* shape = shapeXZ;
shape->setRotation(sf::Angle(sf::radians(tmpRot[1]))); shape->setRotation(sf::Angle(sf::radians(tmpRot[1])));
shape->setPosition({tmpPos[0]+globalPos[0],tmpPos[2]+globalPos[2]}); shape->setPosition({tmpPos[0]+globalPos[0],tmpPos[2]+globalPos[2]});
shape->setScale({1,cos(float(tmpRot[0]))}); shape->setScale({plane == ReferencePlane::XZ ? float(1.0) : float(-1.0),cos(float(tmpRot[0]))});
shape->setFillColor(color*sf::Color(255,255,255,transparency*255)); shape->setFillColor(color*sf::Color(255,255,255,transparency*255));
return shape;} return shape;}
break; break;
@@ -41,7 +48,7 @@ sf::Shape* Coscia::draw(ReferencePlane plane){
shape->setRotation(sf::Angle(sf::radians(tmpRot[0]))); shape->setRotation(sf::Angle(sf::radians(tmpRot[0])));
shape->setPosition({tmpPos[1]+globalPos[1],tmpPos[2]+globalPos[2]}); shape->setPosition({tmpPos[1]+globalPos[1],tmpPos[2]+globalPos[2]});
shape->setFillColor(color*sf::Color(255,255,255,transparency*255)); shape->setFillColor(color*sf::Color(255,255,255,transparency*255));
shape->setScale({1,cos(float(tmpRot[1]))}); shape->setScale({direction == Direction::R ? float(1.0) : float(-1.0),cos(float(tmpRot[1]))});
return shape;} return shape;}
break; break;
+57
View File
@@ -0,0 +1,57 @@
#include "../headers/pavimento.hpp"
Pavimento::Pavimento(rb::Vector3 coords, _Float16 mass){
rb::Vector3 com = {pavimento_Dim.x/2,pavimento_Dim.z/2,pavimento_Dim.y/2};
body = rb::rigidbody(coords, com, mass, pavimento_Dim.z/2);
color = pavimento_Col;
globalPos = {0,0,0};
initialize_shapes(pavimento_Dim);
try{
setTextures(TEXTURE_F,TEXTURE_L);
}
catch (const char* &e ){
printf("Pavimento: %s\n", e);
}
}
Pavimento::~Pavimento(){
delete shapeXZ;
delete shapeYZ;
}
sf::Shape* Pavimento::draw(ReferencePlane plane){
rb::Vector3 tmpPos = body.getPos();
rb::Vector3 tmpRot = body.getRot();
switch (plane)
{
case ReferencePlane::XZ : case ReferencePlane::XZN:
{
sf::Shape* shape = shapeXZ;
shape->setRotation(sf::Angle(sf::radians(tmpRot[1])));
shape->setPosition({tmpPos[0]+globalPos[0],tmpPos[2]+globalPos[2]});
shape->setScale({plane == ReferencePlane::XZ ? float(1.0) : float(-1.0),cos(float(tmpRot[0]))});
shape->setFillColor(color*sf::Color(255,255,255,transparency*255));
return shape;}
break;
case ReferencePlane::YZ:
{
sf::Shape* shape = shapeYZ;
shape->setRotation(sf::Angle(sf::radians(tmpRot[0])));
shape->setPosition({tmpPos[1]+globalPos[1],tmpPos[2]+globalPos[2]});
shape->setFillColor(color*sf::Color(255,255,255,transparency*255));
shape->setScale({1,cos(float(tmpRot[1]))});
return shape;}
break;
default:
break;
}
return nullptr;
}
+3 -1
View File
@@ -76,6 +76,7 @@ sf::Shape* Sensore::draw(ReferencePlane plane){
shape->setRotation(sf::Angle(sf::radians(tmpRot[1]))); shape->setRotation(sf::Angle(sf::radians(tmpRot[1])));
shape->setPosition({tmpPos[0]+globalPos[0],tmpPos[2]+globalPos[2]}); shape->setPosition({tmpPos[0]+globalPos[0],tmpPos[2]+globalPos[2]});
shape->setFillColor(color*sf::Color(255,255,255,transparency*255)); shape->setFillColor(color*sf::Color(255,255,255,transparency*255));
shape->setScale({plane == ReferencePlane::XZ ? float(1.0) : float(-1.0),1});
return shape;} return shape;}
break; break;
@@ -85,6 +86,7 @@ sf::Shape* Sensore::draw(ReferencePlane plane){
shape->setRotation(sf::Angle(sf::radians(tmpRot[0]))); shape->setRotation(sf::Angle(sf::radians(tmpRot[0])));
shape->setPosition({tmpPos[1]+globalPos[1],tmpPos[2]+globalPos[2]}); shape->setPosition({tmpPos[1]+globalPos[1],tmpPos[2]+globalPos[2]});
shape->setFillColor(color*sf::Color(255,255,255,transparency*255)); shape->setFillColor(color*sf::Color(255,255,255,transparency*255));
shape->setScale({direction == Direction::R ? float(1.0) : float(-1.0),1});
return shape;} return shape;}
break; break;
@@ -115,7 +117,7 @@ void Sensore::calcRotWithG(unsigned int index){ // calcolo rotazione con valori
} }
float Sensore::getZ_Acc(){ float Sensore::getZ_Acc(){
int id = *dataPos; //int id = *dataPos;
float tmpAcc = 0; float tmpAcc = 0;
rb::Vector3 acc = body.getAcc(); rb::Vector3 acc = body.getAcc();
+8
View File
@@ -7,6 +7,13 @@ Torso::Torso(rb::Vector3 coords, _Float16 mass){
globalPos = {0,0,0}; globalPos = {0,0,0};
initialize_shapes(torso_Dim); initialize_shapes(torso_Dim);
try{
setTextures(TEXTURE_F,TEXTURE_L);
}
catch (const char* &e){
printf("Caviglia: %s\n", e);
}
} }
Torso::~Torso(){ Torso::~Torso(){
@@ -31,6 +38,7 @@ sf::Shape* Torso::draw(ReferencePlane plane){
sf::Shape* shape = shapeXZ; sf::Shape* shape = shapeXZ;
shape->setRotation(sf::Angle(sf::radians(tmpRot[1]))); shape->setRotation(sf::Angle(sf::radians(tmpRot[1])));
shape->setPosition({tmpPos[0]+globalPos[0],tmpPos[2]+globalPos[2]}); shape->setPosition({tmpPos[0]+globalPos[0],tmpPos[2]+globalPos[2]});
shape->setScale({plane == ReferencePlane::XZ ? float(1.0) : float(-1.0),cos(float(tmpRot[0]))});
shape->setFillColor(color*sf::Color(255,255,255,transparency*255)); shape->setFillColor(color*sf::Color(255,255,255,transparency*255));
return shape;} return shape;}
break; break;
+1 -1
View File
@@ -87,7 +87,7 @@ void rigidbody::calcPos(const float Dtime){
void rigidbody::step(const sf::Clock time, float multiplier){ void rigidbody::step(const sf::Clock time, float multiplier){
int64_t Dtime = time.getElapsedTime().asMicroseconds(); int64_t Dtime = time.getElapsedTime().asMicroseconds();
if (prevT == 0) prevT >= Dtime; if (prevT == 0) prevT = Dtime;
float dt = ((float(Dtime) / 1000000.0) - (float(prevT) / 1000000.0)) * multiplier; float dt = ((float(Dtime) / 1000000.0) - (float(prevT) / 1000000.0)) * multiplier;
+31 -7
View File
@@ -5,6 +5,7 @@
#include "collections/headers/collection_interface.hpp" #include "collections/headers/collection_interface.hpp"
#include <imgui.h> #include <imgui.h>
#include <imgui-SFML.h> #include <imgui-SFML.h>
#include <format>
template <typename T1, typename T2> template <typename T1, typename T2>
double dist(sf::Vector2<T1> p1, sf::Vector2<T2> p2) double dist(sf::Vector2<T1> p1, sf::Vector2<T2> p2)
@@ -287,14 +288,12 @@ void handle_resize(const sf::Event::Resized &resized, State &gs)
/// Graphics /// Graphics
void doGUI(State &gs) void doGUI(State &gs)
{ {
// TODO: here code to display the menus
//Bottoni //Bottoni
sf::Time elapsed = gs.clock.restart(); sf::Time elapsed = gs.clock.restart();
unsigned int zero = 0; unsigned int zero = 0;
ImGui::SFML::Update(gs.window, elapsed); ImGui::SFML::Update(gs.window, elapsed);
ImGui::ShowDemoWindow();
//Finestra gestione posizione nei dati //Finestra gestione posizione nei dati
ImGuiWindowFlags sdp_flags = ImGuiWindowFlags_NoMove| ImGuiWindowFlags sdp_flags = ImGuiWindowFlags_NoMove|
@@ -302,7 +301,9 @@ void doGUI(State &gs)
ImGuiWindowFlags_NoScrollbar| ImGuiWindowFlags_NoScrollbar|
ImGuiWindowFlags_NoCollapse| ImGuiWindowFlags_NoCollapse|
ImGuiWindowFlags_NoTitleBar; ImGuiWindowFlags_NoTitleBar;
// Finestra gestione posizione dati
ImGui::Begin("Set data position", 0,sdp_flags); ImGui::Begin("Set data position", 0,sdp_flags);
ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x * 0.3); ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x * 0.3);
ImGui::SliderScalar("Start", ImGuiDataType_U32 ,gs.intervalMinLimit,&zero,gs.intervalMajLimit); ImGui::SliderScalar("Start", ImGuiDataType_U32 ,gs.intervalMinLimit,&zero,gs.intervalMajLimit);
@@ -347,9 +348,29 @@ void doGUI(State &gs)
*gs.tMul = TimeMul[Timeid]; *gs.tMul = TimeMul[Timeid];
ImGui::End(); ImGui::End();
//Finestra controllo sovrapposizione //Finestra controllo sovrapposizione (solo su collezioni)
ImGui::Begin("Set overlap", 0,sdp_flags);
int c = 0;
for (auto i : gs.collections){
std::stringstream s;
s <<"Collezione :" << c;
ImGui::Text(s.str().c_str());
float tmpTr = i->getTransparency();
if (ImGui::SliderFloat("Transparency ", &tmpTr,0.0,1.0)) {
gs.updateCollections();
i->setTransparency(tmpTr);
}
bool tmpVs = i->getVisibility();
if (ImGui::Checkbox("is visible", &tmpVs)) {
i->setVisibility(tmpVs);
gs.updateCollections();
}
c++;
ImGui::Separator();
}
ImGui::End();
sf::Vector2u wsize = gs.window.getSize(); sf::Vector2u wsize = gs.window.getSize();
@@ -357,8 +378,11 @@ void doGUI(State &gs)
ImGui::SetWindowSize("Set data position",ImVec2(wsize.x,30)); ImGui::SetWindowSize("Set data position",ImVec2(wsize.x,30));
ImGui::SetWindowPos("Set visualization plane",ImVec2(wsize.x-400,0)); ImGui::SetWindowPos("Set visualization plane",ImVec2(wsize.x-400,0));
ImGui::SetWindowSize("Set visualization plane",ImVec2(400,30)); ImGui::SetWindowSize("Set visualization plane",ImVec2(400,30));
ImGui::SetWindowPos("Set time multiplier",ImVec2(wsize.x-400,wsize.y - 60)); ImGui::SetWindowPos("Set time multiplier",ImVec2(wsize.x-400,wsize.y - 61));
ImGui::SetWindowSize("Set time multiplier",ImVec2(400,30)); ImGui::SetWindowSize("Set time multiplier",ImVec2(400,30));
ImGui::SetWindowPos("Set overlap",ImVec2(wsize.x-300,31));
ImGui::SetWindowSize("Set overlap",ImVec2(300,70*gs.collections.size()));
ImGui::SFML::Render(gs.window); ImGui::SFML::Render(gs.window);
} }
-122
View File
@@ -1,122 +0,0 @@
#include "include.hpp"
int main() {
CSVProcessor processor;
try {
processor.readCSVFile("data.csv");
// Access headers
const auto& headers = processor.getHeaders();
for (const auto& header : headers) {
std::cout << header << "\t";
}
std::cout << std::endl;
// Access data
int n = 0;
const auto& data = processor.getData();
for (const auto& row : data) {
if (n++ >40) break;
for (float value : row) {
std::cout << value << "\t";
}
std::cout << std::endl;
}
} catch (const std::exception& e) {
std::cerr << "Error: " << e.what() << std::endl;
}
// inizializzo variabili per gestire l'intervallo di visualizzazione
unsigned int min = 0;
unsigned int pos = 0;
unsigned int maj = 100;
//Costruisco la GUI
State gs(800, 700, "Visualizzatore passo",&maj,&min,&pos);
gs.window.setFramerateLimit(70);
printf("Costruisco gli oggetti\n");
try{
processor.readCSVFile (DATA_PATH + "coscia_filt.csv");
const auto& coscia = processor.getData();
gs.setIntervall(coscia.size());
/*
gs.pieces.push_back(new Coscia (rb::Vector3{0,0,0},2));
gs.pieces.push_back(new Sensore (rb::Vector3{300,300,300},_Float16( 0.2 ),&pos,coscia));
gs.pieces.push_back(new Caviglia (rb::Vector3{300,300,500},1));
gs.pieces[1]->body.setRot({0,0,0});
processor.readCSVFile(DATA_PATH + "caviglia_filt.csv");
const auto& caviglia = processor.getData();
gs.pieces.push_back(new Sensore (rb::Vector3{300,300,500},_Float16( 0.2 ),&pos,caviglia));
gs.pieces.push_back(new Torso(rb::Vector3{300,400,150},2));
// modifico la rotazione relativa della gamba
gs.pieces[1]->body.setRot({_Float16 (1.3),_Float16 (1.7),0});
gs.pieces[3]->body.setRot({_Float16 (1.8),_Float16 (1.7),0});
// aggiungo i joint
gs.joints.push_back(new PivotJoint(gs.pieces[4], {gs.pieces[1]}, rb::Vector3{0,-100,50}));
gs.joints.push_back(new RigidJoint(gs.pieces[1], {gs.pieces[0]}));
gs.joints.push_back(new PivotJoint(gs.pieces[1], {gs.pieces[3]}, rb::Vector3{0,0,100}));
gs.joints.push_back(new RigidJoint(gs.pieces[3], {gs.pieces[2]}));
gs.pieces[2]->setDirection(Direction::R);
*/
//provo ad aggiungere una collection
//gs.collections.push_back(new Gamba({220,0,220},&pos,"coscia_filt.csv","caviglia_filt.csv"));
std::vector<gamba_data> data;
gamba_data d;
d.dataPos = &pos;
d.cavigliaData = "caviglia_dx.csv";
d.cosciaData = "coscia_dx.csv";
gamba_data s;
s.dataPos = &pos;
s.cavigliaData = "caviglia_sx.csv";
s.cosciaData = "coscia_sx.csv";
data.push_back(d);
data.push_back(s);
gs.collections.push_back(new Lower_Body(rb::Vector3{200,200,100},data));
printf("Ho costruito tutto!\n");
}
catch(char* e){
printf("%s\n",e);
}
printf("Avvio l'interfaccia grafica\n");
unsigned int curTime = 0;
unsigned int freq = 50;
const unsigned int T = 1000/freq; //i sensori hanno una freq di campionamento di 50hz
//Avvio il loop della GUI
gs.clock.start();
gs.updateCollections();
sf::Clock mainClock;
while (gs.window.isOpen())
{
curTime += mainClock.restart().asMilliseconds() *(*gs.tMul) ;
if (curTime > T){
if (gs.play && pos+curTime/T < maj) pos += curTime / T;
curTime = 0;
}
// Show update
gs.update();
doGraphics(gs);
}
return 0;
}
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB