close Warning: Can't use blame annotator:
svn blame failed on trunk/lib/FlairSimulator/src/UavVrpnObject_impl.cpp: 200029 - Couldn't perform atomic initialization

source: flair-src/trunk/lib/FlairSimulator/src/UavVrpnObject_impl.cpp@ 286

Last change on this file since 286 was 286, checked in by Sanahuja Guillaume, 5 years ago

draw vrpn axis in simulator

File size: 5.5 KB
RevLine 
1// %flair:license{
2// This file is part of the Flair framework distributed under the
3// CECILL-C License, Version 1.0.
4// %flair:license}
5// created: 2018/12/11
6// filename: UavVrpnObject_impl.cpp
7//
8// author: Guillaume Sanahuja
9// Copyright Heudiasyc UMR UTC/CNRS 7253
10//
11// version: $Id: $
12//
13// purpose: uav vrpn object, can display a real vrpn object in a simulated environment
14//
15/*********************************************************************/
16#ifdef GL
17
18#include "UavVrpnObject_impl.h"
19#include "UavVrpnObject.h"
20#include <TabWidget.h>
21#include <Tab.h>
22#include <DoubleSpinBox.h>
23#include "Simulator.h"
24#include <ISceneManager.h>
25#include <IVideoDriver.h>
26#include "Blade.h"
27#include "MeshSceneNode.h"
28#include "Gui.h"
29#include "FollowMeCamera.h"
30#include <Matrix.h>
31#include <Quaternion.h>
32#include <Euler.h>
33
34#define MOTOR_SPEED 100
35
36using namespace irr::video;
37using namespace irr::scene;
38using namespace irr::core;
39using namespace flair::core;
40using namespace flair::simulator;
41using namespace flair::gui;
42
43UavVrpnObject_impl::UavVrpnObject_impl(UavVrpnObject *self,std::string name)
44 : IODevice(self,name),
45 ISceneNode(getGui()->getSceneManager()->getRootSceneNode(), getGui()->getSceneManager(), -1) {
46 this->self=self;
47
48 // init user interface
49 Tab *tab = new Tab(getSimulator()->GetTabWidget(), ObjectName());
50 arm_length = new DoubleSpinBox(tab->LastRowLastCol(), "arm length (m):",0, 2, 0.1);
51
52 // camera
53 FollowMeCamera* camera = new FollowMeCamera(this,name);
54
55 Draw();
56}
57
58UavVrpnObject_impl::~UavVrpnObject_impl() {
59 // les objets irrlicht seront automatiquement detruits (moteurs, helices,
60 // pales) par parenté
61}
62
63void UavVrpnObject_impl::UpdateFrom(const io_data *data) {
64 const Matrix* input = dynamic_cast<const Matrix*>(data);
65 if (!input) {
66 self->Warn("casting %s to Matrix failed\n",data->ObjectName().c_str());
67 return;
68 }
69
70 Vector3Df vrpnPosition;
71 Quaternion vrpnQuaternion;
72 input->GetMutex();
73 vrpnQuaternion.q0=input->ValueNoMutex(0, 0);
74 vrpnQuaternion.q1=input->ValueNoMutex(1, 0);
75 vrpnQuaternion.q2=input->ValueNoMutex(2, 0);
76 vrpnQuaternion.q3=input->ValueNoMutex(3, 0);
77 vrpnPosition.x=input->ValueNoMutex(4, 0);
78 vrpnPosition.y=input->ValueNoMutex(5, 0);
79 vrpnPosition.z=input->ValueNoMutex(6, 0);
80 input->ReleaseMutex();
81
82 vector3df nodePosition;
83 Quaternion nodeQuaternion;
84 Euler nodeEuler;
85
86 nodePosition = ToIrrlichtCoordinates(vrpnPosition);
87 setPosition(nodePosition);
88 nodeQuaternion = ToIrrlichtOrientation(vrpnQuaternion);
89 nodeQuaternion.ToEuler(nodeEuler);
90 setRotation(Euler::ToDegree(1) * vector3df(nodeEuler.roll,nodeEuler.pitch, nodeEuler.yaw));
91
92 if (arm_length->ValueChanged() == true) {
93 setScale(vector3df(arm_length->Value(), arm_length->Value(), arm_length->Value()));
94 }
95}
96
97void UavVrpnObject_impl::render(void) {
98 IVideoDriver *driver = SceneManager->getVideoDriver();
99 driver->setTransform(ETS_WORLD, AbsoluteTransformation);
100}
101
102void UavVrpnObject_impl::OnRegisterSceneNode(void) {
103 if (IsVisible)
104 SceneManager->registerNodeForRendering(this);
105
106 ISceneNode::OnRegisterSceneNode();
107}
108
109void UavVrpnObject_impl::Draw(void) {
110 // create unite (1m=100cm) UAV; scale will be adapted according to arm_length
111 // parameter
112 // note that the frame used is irrlicht one:
113 // left handed, North East Up
114 const IGeometryCreator *geo;
115 geo = getGui()->getSceneManager()->getGeometryCreator();
116
117 // cylinders are aligned with y axis
118 IMesh *red_arm = geo->createCylinderMesh(2.5, 100, 16, SColor(0, 255, 0, 0));
119 IMesh *black_arm = geo->createCylinderMesh(2.5, 100, 16, SColor(0, 128, 128, 128));
120 IMesh *motor = geo->createCylinderMesh(7.5, 15, 16); //,SColor(0, 128, 128, 128));
121 // geo->drop();
122
123 ITexture *texture = getGui()->getTexture("carbone.jpg");
124 MeshSceneNode *fl_arm = new MeshSceneNode(this, red_arm, vector3df(0, 0, 0),
125 vector3df(0, 0, -135));
126 MeshSceneNode *fr_arm = new MeshSceneNode(this, red_arm, vector3df(0, 0, 0),
127 vector3df(0, 0, -45));
128 MeshSceneNode *rl_arm = new MeshSceneNode(this, black_arm, vector3df(0, 0, 0),
129 vector3df(0, 0, 135), texture);
130 MeshSceneNode *rr_arm = new MeshSceneNode(this, black_arm, vector3df(0, 0, 0),
131 vector3df(0, 0, 45), texture);
132
133 texture = getGui()->getTexture("metal047.jpg");
134 MeshSceneNode *fl_motor = new MeshSceneNode(this, motor, vector3df(70.71, -70.71, 2.5),
135 vector3df(90, 0, 0), texture);
136 MeshSceneNode *fr_motor = new MeshSceneNode(this, motor, vector3df(70.71, 70.71, 2.5),
137 vector3df(90, 0, 0), texture);
138 MeshSceneNode *rl_motor = new MeshSceneNode(this, motor, vector3df(-70.71, -70.71, 2.5),
139 vector3df(90, 0, 0), texture);
140 MeshSceneNode *rr_motor = new MeshSceneNode(this, motor, vector3df(-70.71, 70.71, 2.5),
141 vector3df(90, 0, 0), texture);
142
143 fl_blade = new Blade(this, vector3df(70.71, -70.71, 17.5));
144 fr_blade = new Blade(this, vector3df(70.71, 70.71, 17.5), true);
145 rl_blade = new Blade(this, vector3df(-70.71, -70.71, 17.5), true);
146 rr_blade = new Blade(this, vector3df(-70.71, 70.71, 17.5));
147
148 fl_blade->SetRotationSpeed(MOTOR_SPEED);
149 fr_blade->SetRotationSpeed(-MOTOR_SPEED);
150 rl_blade->SetRotationSpeed(-MOTOR_SPEED);
151 rr_blade->SetRotationSpeed(MOTOR_SPEED);
152
153 setScale(vector3df(arm_length->Value(), arm_length->Value(), arm_length->Value()));
154}
155#endif // GL
Note: See TracBrowser for help on using the repository browser.