ARGoS  3
A parallel, multi-engine simulator for swarm robotics
qtopengl_footbot.cpp
Go to the documentation of this file.
1 
7 #include "qtopengl_footbot.h"
8 #include "footbot_entity.h"
10 #include "footbot_turret_entity.h"
11 #include <argos3/core/simulator/entity/embodied_entity.h>
12 #include <argos3/core/utility/math/vector2.h>
13 #include <argos3/core/utility/math/vector3.h>
14 #include <argos3/plugins/simulator/entities/led_equipped_entity.h>
15 #include <argos3/plugins/simulator/entities/gripper_equipped_entity.h>
16 #include <argos3/plugins/simulator/visualizations/qt-opengl/qtopengl_widget.h>
17 
18 namespace argos {
19 
20  /****************************************/
21  /****************************************/
22 
23  /* All measures are in meters */
24 
25  /* General */
26  static const Real INTER_MODULE_GAP = 0.0015f;
27  static const Real HEIGHT = 0.258f;
28  /* Wheel measures */
29  static const Real WHEEL_WIDTH = 0.022031354f;
30  static const Real HALF_WHEEL_WIDTH = WHEEL_WIDTH * 0.5f;
31  static const Real WHEEL_RADIUS = 0.029112741f;
32  static const Real WHEEL_DIAMETER = WHEEL_RADIUS * 2.0f;
33  static const Real INTERWHEEL_DISTANCE = 0.127f;
34  static const Real HALF_INTERWHEEL_DISTANCE = INTERWHEEL_DISTANCE * 0.5f;
35  /* Track measures */
36  static const Real INTERTRACK_DISTANCE = 0.064600514f;
37  static const Real HALF_INTERTRACK_DISTANCE = INTERTRACK_DISTANCE * 0.5f;
38  static const Real TRACK_WHEELS_DISTANCE = 0.100156677f;
39  static const Real HALF_TRACK_WHEELS_DISTANCE = TRACK_WHEELS_DISTANCE * 0.5f;
40  /* Base module measures */
41  static const Real BATTERY_SOCKET_ELEVATION = 0.006f;
42  static const Real BATTERY_SOCKET_LENGTH = 0.150302467f;
43  static const Real HALF_BATTERY_SOCKET_LENGTH = BATTERY_SOCKET_LENGTH * 0.5f;
44  static const Real BATTERY_SOCKET_WIDTH = 0.037600133f;
45  static const Real HALF_BATTERY_SOCKET_WIDTH = BATTERY_SOCKET_WIDTH * 0.5f;
46  static const Real BASE_MODULE_HEIGHT = 0.0055f;
47  static const Real BASE_MODULE_RADIUS = 0.085036758f;
48  static const Real PROXIMITY_SENSOR_HEIGHT = 0.004f; // unused
49  static const Real PROXIMITY_SENSOR_WIDTH = 0.007f; // unused
50  static const Real PROXIMITY_SENSOR_DEPTH = 0.0025f; // unused
51  /* Gripper module measures */
52  static const Real GRIPPER_MODULE_ELEVATION = BATTERY_SOCKET_ELEVATION + WHEEL_DIAMETER + BASE_MODULE_HEIGHT + INTER_MODULE_GAP;
53  static const Real GRIPPER_MODULE_HEIGHT = 0.027f;
54  static const Real GRIPPER_MODULE_HALF_HEIGHT = GRIPPER_MODULE_HEIGHT * 0.5f;
55  static const Real GRIPPER_MODULE_INNER_RADIUS = 0.069f;
56  static const Real GRIPPER_MODULE_BARRIER_HEIGHT = 0.0075f;
57  static const Real GRIPPER_MECHANICS_LENGTH = 0.026094485f;
58  static const Real GRIPPER_MECHANICS_WIDTH = 0.02f;
59  static const Real GRIPPER_MECHANICS_HALF_WIDTH = GRIPPER_MECHANICS_WIDTH * 0.5f;
60  static const Real GRIPPER_CLAW_LENGTH = 0.01f;
61  static const Real GRIPPER_CLAW_WIDTH = 0.013f;
62  static const Real GRIPPER_CLAW_HALF_WIDTH = GRIPPER_CLAW_WIDTH * 0.5f;
63  static const Real GRIPPER_CLAW_OFFSET = GRIPPER_MODULE_INNER_RADIUS + GRIPPER_MECHANICS_LENGTH;
64  static const Real GRIPPER_CLAW_ELEVATION = GRIPPER_MODULE_ELEVATION + GRIPPER_MODULE_HALF_HEIGHT;
65  /* RAB measures */
66  static const Real RAB_ELEVATION = GRIPPER_MODULE_ELEVATION + GRIPPER_MODULE_HEIGHT + INTER_MODULE_GAP;
67  static const Real RAB_HEIGHT = 0.0086f;
68  static const Real RAB_MAX_RADIUS = 0.08f;
69  static const Real RAB_MIN_RADIUS = 0.075f;
70  /* Distance scanner measures */
71  static const Real DISTANCE_SCANNER_ELEVATION = RAB_ELEVATION + RAB_HEIGHT;
72  static const Real DISTANCE_SCANNER_RADIUS = 0.05f;
73  static const Real DISTANCE_SCANNER_HEIGHT = 0.0235f;
74  static const Real DISTANCE_SCANNER_SENSOR_WIDTH = 0.035858477f;
75  static const Real DISTANCE_SCANNER_SENSOR_HALF_WIDTH = DISTANCE_SCANNER_SENSOR_WIDTH * 0.5f;
76  static const Real DISTANCE_SCANNER_SENSOR_HEIGHT = 0.021124933f;
77  static const Real DISTANCE_SCANNER_SENSOR_DEPTH = 0.018f;
78  /* iMX module */
79  static const Real IMX_MODULE_ELEVATION = DISTANCE_SCANNER_ELEVATION + DISTANCE_SCANNER_HEIGHT;
80  static const Real IMX_MODULE_RADIUS = 0.065f;
81  static const Real IMX_MODULE_HEIGHT = 0.010199866f;
82  /* Beacon */
83  static const Real BEACON_ELEVATION = IMX_MODULE_ELEVATION + IMX_MODULE_HEIGHT;
84  static const Real BEACON_RADIUS = 0.021f;
85  static const Real BEACON_HEIGHT = 0.0201f;
86  /* Camera */
87  static const Real CAMERA_ELEVATION = BEACON_ELEVATION + BEACON_HEIGHT;
88  static const Real CAMERA_RADIUS = BEACON_RADIUS;
89  static const Real CAMERA_HEIGHT = 0.104f;
90 
91  /****************************************/
92  /****************************************/
93 
95  m_unVertices(40),
96  m_fLEDAngleSlice(360.0f / 12.0f) {
97  /* Reserve the needed display lists */
98  m_unLists = glGenLists(13);
99 
100  /* Assign indices for better referencing (later) */
101  m_unBasicWheelList = m_unLists;
102  m_unWheelList = m_unLists + 1;
103  m_unTrackList = m_unLists + 2;
104  m_unBaseList = m_unLists + 3;
105  m_unGrippableSliceList = m_unLists + 4;
106  m_unGripperMechanicsList = m_unLists + 5;
107  m_unGripperClawList = m_unLists + 6;
108  m_unRABList = m_unLists + 7;
109  m_unDistanceScannerSensorList = m_unLists + 8;
110  m_unDistanceScannerList = m_unLists + 9;
111  m_unIMXList = m_unLists + 10;
112  m_unBeaconList = m_unLists + 11;
113  m_unCameraList = m_unLists + 12;
114 
115  /* Create the materialless wheel display list */
116  glNewList(m_unBasicWheelList, GL_COMPILE);
117  MakeWheel();
118  glEndList();
119 
120  /* Create the wheel display list */
121  glNewList(m_unWheelList, GL_COMPILE);
122  RenderWheel();
123  glEndList();
124 
125  /* Create the track display list */
126  glNewList(m_unTrackList, GL_COMPILE);
127  RenderTrack();
128  glEndList();
129 
130  /* Create the base module display list */
131  glNewList(m_unBaseList, GL_COMPILE);
132  RenderBase();
133  glEndList();
134 
135  /* Create the grippable slice display list */
136  glNewList(m_unGrippableSliceList, GL_COMPILE);
138  glEndList();
139 
140  /* Create the gripper mechanics display list */
141  glNewList(m_unGripperMechanicsList, GL_COMPILE);
143  glEndList();
144 
145  /* Create the gripper claw display list */
146  glNewList(m_unGripperClawList, GL_COMPILE);
148  glEndList();
149 
150  /* Create the gripper claw display list */
151  glNewList(m_unRABList, GL_COMPILE);
152  RenderRAB();
153  glEndList();
154 
155  /* Create the single distance scanner sensor display list */
156  glNewList(m_unDistanceScannerSensorList, GL_COMPILE);
158  glEndList();
159 
160  /* Create the distance scanner display list */
161  glNewList(m_unDistanceScannerList, GL_COMPILE);
163  glEndList();
164 
165  /* Create the iMX display list */
166  glNewList(m_unIMXList, GL_COMPILE);
167  RenderIMX();
168  glEndList();
169 
170  /* Create the beacon display list */
171  glNewList(m_unBeaconList, GL_COMPILE);
172  RenderBeacon();
173  glEndList();
174 
175  /* Create the camera display list */
176  glNewList(m_unCameraList, GL_COMPILE);
177  RenderCamera();
178  glEndList();
179  }
180 
181  /****************************************/
182  /****************************************/
183 
185  glDeleteLists(m_unLists, 13);
186  }
187 
188  /****************************************/
189  /****************************************/
190 
192  /* Place the wheels */
193  glPushMatrix();
194  glTranslatef(0.0f, HALF_INTERWHEEL_DISTANCE, 0.0f);
195  glCallList(m_unWheelList);
196  glPopMatrix();
197  glPushMatrix();
198  glTranslatef(0.0f, -HALF_INTERWHEEL_DISTANCE, 0.0f);
199  glCallList(m_unWheelList);
200  glPopMatrix();
201  /* Place the tracks */
202  glPushMatrix();
203  glTranslatef(0.0f, HALF_INTERTRACK_DISTANCE, 0.0f);
204  glCallList(m_unTrackList);
205  glPopMatrix();
206  glPushMatrix();
207  glTranslatef(0.0f, -HALF_INTERTRACK_DISTANCE, 0.0f);
208  glCallList(m_unTrackList);
209  glPopMatrix();
210  /* Place the tracks */
211  glCallList(m_unBaseList);
212  /* Place the gripper module */
213  glPushMatrix();
214  /* Read gripper orientation from footbot entity */
215  GLfloat fGripperOrientation = ToDegrees(c_entity.GetTurretEntity().GetRotation()).GetValue();
216  glRotatef(fGripperOrientation, 0.0f, 0.0f, 1.0f);
217  /* Place the grippable part of the gripper module (LEDs) */
218  glPushMatrix();
219  CLEDEquippedEntity& cLEDEquippedEntity = c_entity.GetLEDEquippedEntity();
220  for(UInt32 i = 0; i < 12; i++) {
221  const CColor& cColor = cLEDEquippedEntity.GetLED(i).GetColor();
222  glRotatef(m_fLEDAngleSlice, 0.0f, 0.0f, 1.0f);
223  SetLEDMaterial(cColor.GetRed() / 255.0f,
224  cColor.GetGreen() / 255.0f,
225  cColor.GetBlue() / 255.0f);
226  glCallList(m_unGrippableSliceList);
227  }
228  glPopMatrix();
229  /* Place the gripper mechanics */
230  glCallList(m_unGripperMechanicsList);
231  /* Place the gripper claws */
232  /* Read the gripper aperture from footbot entity */
233  GLfloat fGripperAperture = c_entity.GetGripperEquippedEntity().GetLockState() * 90.0f;
234  glTranslatef(GRIPPER_CLAW_OFFSET, 0.0f, GRIPPER_CLAW_ELEVATION);
235  glPushMatrix();
236  glRotatef(fGripperAperture, 0.0f, 1.0f, 0.0f);
237  glCallList(m_unGripperClawList);
238  glPopMatrix();
239  glPushMatrix();
240  glRotatef(-fGripperAperture, 0.0f, 1.0f, 0.0f);
241  glCallList(m_unGripperClawList);
242  glPopMatrix();
243  glPopMatrix();
244  /* Place the RAB */
245  glCallList(m_unRABList);
246  /* Place the distance scanner */
247  glCallList(m_unDistanceScannerList);
248  glPushMatrix();
249  /* Read dist scanner orientation from footbot entity */
250  GLfloat fDistanceScannerOrientation = ToDegrees(c_entity.GetDistanceScannerEquippedEntity().GetRotation()).GetValue();
251  glRotatef(fDistanceScannerOrientation, 0.0f, 0.0f, 1.0f);
252  glCallList(m_unDistanceScannerSensorList);
253  glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
254  glCallList(m_unDistanceScannerSensorList);
255  glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
256  glCallList(m_unDistanceScannerSensorList);
257  glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
258  glCallList(m_unDistanceScannerSensorList);
259  glPopMatrix();
260  /* Place the iMX module */
261  glCallList(m_unIMXList);
262  /* Place the beacon */
263  const CColor& cBeaconColor = cLEDEquippedEntity.GetLED(12).GetColor();
264  SetLEDMaterial(cBeaconColor.GetRed() / 255.0f,
265  cBeaconColor.GetGreen() / 255.0f,
266  cBeaconColor.GetBlue() / 255.0f);
267  glCallList(m_unBeaconList);
268  /* Place the camera */
269  glCallList(m_unCameraList);
270  }
271 
272  /****************************************/
273  /****************************************/
274 
276  /* Right side */
277  CVector2 cVertex(WHEEL_RADIUS, 0.0f);
278  CRadians cAngle(CRadians::TWO_PI / m_unVertices);
279  CVector3 cNormal(-1.0f, -1.0f, 0.0f);
280  cNormal.Normalize();
281  glBegin(GL_POLYGON);
282  for(GLuint i = 0; i <= m_unVertices; i++) {
283  glNormal3f(cNormal.GetX(), cNormal.GetY(), cNormal.GetZ());
284  glVertex3f(cVertex.GetX(), -HALF_WHEEL_WIDTH, WHEEL_RADIUS + cVertex.GetY());
285  cVertex.Rotate(cAngle);
286  cNormal.RotateY(cAngle);
287  }
288  glEnd();
289  /* Left side */
290  cVertex.Set(WHEEL_RADIUS, 0.0f);
291  cNormal.Set(-1.0f, 1.0f, 0.0f);
292  cNormal.Normalize();
293  cAngle = -cAngle;
294  glBegin(GL_POLYGON);
295  for(GLuint i = 0; i <= m_unVertices; i++) {
296  glNormal3f(cNormal.GetX(), cNormal.GetY(), cNormal.GetZ());
297  glVertex3f(cVertex.GetX(), HALF_WHEEL_WIDTH, WHEEL_RADIUS + cVertex.GetY());
298  cVertex.Rotate(cAngle);
299  cNormal.RotateY(cAngle);
300  }
301  glEnd();
302  /* Tire */
303  cNormal.Set(1.0f, 0.0f, 0.0f);
304  cVertex.Set(WHEEL_RADIUS, 0.0f);
305  cAngle = -cAngle;
306  glBegin(GL_QUAD_STRIP);
307  for(GLuint i = 0; i <= m_unVertices; i++) {
308  glNormal3f(cNormal.GetX(), cNormal.GetY(), cNormal.GetZ());
309  glVertex3f(cVertex.GetX(), -HALF_WHEEL_WIDTH, WHEEL_RADIUS + cVertex.GetY());
310  glVertex3f(cVertex.GetX(), HALF_WHEEL_WIDTH, WHEEL_RADIUS + cVertex.GetY());
311  cVertex.Rotate(cAngle);
312  cNormal.RotateY(cAngle);
313  }
314  glEnd();
315  }
316 
317  /****************************************/
318  /****************************************/
319 
321  const GLfloat pfColor[] = { 1.0f, 1.0f, 1.0f, 1.0f };
322  const GLfloat pfSpecular[] = { 0.9f, 0.9f, 0.9f, 1.0f };
323  const GLfloat pfShininess[] = { 100.0f };
324  const GLfloat pfEmission[] = { 0.0f, 0.0f, 0.0f, 1.0f };
325  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, pfColor);
326  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, pfSpecular);
327  glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, pfShininess);
328  glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, pfEmission);
329  }
330 
331  /****************************************/
332  /****************************************/
333 
335  const GLfloat pfColor[] = { 0.0f, 0.0f, 0.0f, 1.0f };
336  const GLfloat pfSpecular[] = { 0.0f, 0.0f, 0.0f, 1.0f };
337  const GLfloat pfShininess[] = { 0.0f };
338  const GLfloat pfEmission[] = { 0.0f, 0.0f, 0.0f, 1.0f };
339  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, pfColor);
340  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, pfSpecular);
341  glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, pfShininess);
342  glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, pfEmission);
343  }
344 
345  /****************************************/
346  /****************************************/
347 
349  const GLfloat pfColor[] = { 0.0f, 0.0f, 1.0f, 1.0f };
350  const GLfloat pfSpecular[] = { 0.5f, 0.5f, 1.0f, 1.0f };
351  const GLfloat pfShininess[] = { 10.0f };
352  const GLfloat pfEmission[] = { 0.0f, 0.0f, 0.0f, 1.0f };
353  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, pfColor);
354  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, pfSpecular);
355  glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, pfShininess);
356  glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, pfEmission);
357  }
358 
359  /****************************************/
360  /****************************************/
361 
362  void CQTOpenGLFootBot::SetLEDMaterial(GLfloat f_red, GLfloat f_green, GLfloat f_blue) {
363  const GLfloat fEmissionFactor = 10.0f;
364  const GLfloat pfColor[] = { f_red, f_green, f_blue, 1.0f };
365  const GLfloat pfSpecular[] = { 0.0f, 0.0f, 0.0f, 1.0f };
366  const GLfloat pfShininess[] = { 0.0f };
367  const GLfloat pfEmission[] = { f_red * fEmissionFactor, f_green * fEmissionFactor, f_blue * fEmissionFactor, 1.0f };
368  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, pfColor);
369  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, pfSpecular);
370  glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, pfShininess);
371  glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, pfEmission);
372  }
373 
374  /****************************************/
375  /****************************************/
376 
378  /* Set material */
380  /* Right side */
381  CVector2 cVertex(WHEEL_RADIUS, 0.0f);
382  CRadians cAngle(CRadians::TWO_PI / m_unVertices);
383  CVector3 cNormal(-1.0f, -1.0f, 0.0f);
384  cNormal.Normalize();
385  glBegin(GL_POLYGON);
386  for(GLuint i = 0; i <= m_unVertices; i++) {
387  glNormal3f(cNormal.GetX(), cNormal.GetY(), cNormal.GetZ());
388  glVertex3f(cVertex.GetX(), -HALF_WHEEL_WIDTH, WHEEL_RADIUS + cVertex.GetY());
389  cVertex.Rotate(cAngle);
390  cNormal.RotateY(cAngle);
391  }
392  glEnd();
393  /* Left side */
394  cVertex.Set(WHEEL_RADIUS, 0.0f);
395  cAngle = -cAngle;
396  cNormal.Set(-1.0f, 1.0f, 0.0f);
397  cNormal.Normalize();
398  glBegin(GL_POLYGON);
399  for(GLuint i = 0; i <= m_unVertices; i++) {
400  glNormal3f(cNormal.GetX(), cNormal.GetY(), cNormal.GetZ());
401  glVertex3f(cVertex.GetX(), HALF_WHEEL_WIDTH, WHEEL_RADIUS + cVertex.GetY());
402  cVertex.Rotate(cAngle);
403  cNormal.RotateY(cAngle);
404  }
405  glEnd();
406  /* Tire */
408  cNormal.Set(1.0f, 0.0f, 0.0f);
409  cVertex.Set(WHEEL_RADIUS, 0.0f);
410  cAngle = -cAngle;
411  glBegin(GL_QUAD_STRIP);
412  for(GLuint i = 0; i <= m_unVertices; i++) {
413  glNormal3f(cNormal.GetX(), cNormal.GetY(), cNormal.GetZ());
414  glVertex3f(cVertex.GetX(), -HALF_WHEEL_WIDTH, WHEEL_RADIUS + cVertex.GetY());
415  glVertex3f(cVertex.GetX(), HALF_WHEEL_WIDTH, WHEEL_RADIUS + cVertex.GetY());
416  cVertex.Rotate(cAngle);
417  cNormal.RotateY(cAngle);
418  }
419  glEnd();
420  }
421 
422  /****************************************/
423  /****************************************/
424 
426  /* Set material */
428  /* Place two basic wheels */
429  glPushMatrix();
430  glTranslatef(HALF_TRACK_WHEELS_DISTANCE, 0.0f, 0.0f);
431  glCallList(m_unBasicWheelList);
432  glPopMatrix();
433  glPushMatrix();
434  glTranslatef(-HALF_TRACK_WHEELS_DISTANCE, 0.0f, 0.0f);
435  glCallList(m_unBasicWheelList);
436  glPopMatrix();
437  /* Render the track itself */
438  /* Set material */
440  glEnable(GL_POLYGON_OFFSET_FILL); // Correct flickering due to overlapping surfaces
441  glPolygonOffset(-0.1, 1.0); // Correct flickering due to overlapping surfaces
442  /* Top part */
443  glBegin(GL_POLYGON);
444  glVertex3f(-HALF_TRACK_WHEELS_DISTANCE, -HALF_WHEEL_WIDTH, WHEEL_DIAMETER);
445  glVertex3f( HALF_TRACK_WHEELS_DISTANCE, -HALF_WHEEL_WIDTH, WHEEL_DIAMETER);
446  glVertex3f( HALF_TRACK_WHEELS_DISTANCE, HALF_WHEEL_WIDTH, WHEEL_DIAMETER);
447  glVertex3f(-HALF_TRACK_WHEELS_DISTANCE, HALF_WHEEL_WIDTH, WHEEL_DIAMETER);
448  glEnd();
449  /* Bottom part */
450  glBegin(GL_POLYGON);
451  glVertex3f(-HALF_TRACK_WHEELS_DISTANCE, -HALF_WHEEL_WIDTH, 0.0f);
452  glVertex3f( HALF_TRACK_WHEELS_DISTANCE, -HALF_WHEEL_WIDTH, 0.0f);
453  glVertex3f( HALF_TRACK_WHEELS_DISTANCE, HALF_WHEEL_WIDTH, 0.0f);
454  glVertex3f(-HALF_TRACK_WHEELS_DISTANCE, HALF_WHEEL_WIDTH, 0.0f);
455  glEnd();
456  /* Round parts */
457  CVector2 cVertex(0.0f, WHEEL_RADIUS);
458  CVector2 cNormal(0.0f, 1.0f);
459  CRadians cAngle(CRadians::TWO_PI / m_unVertices);
460  /* Front */
461  glBegin(GL_QUAD_STRIP);
462  for(GLuint i = 0; i <= m_unVertices / 2; i++) {
463  glNormal3f(cNormal.GetX(), 0.0f, cNormal.GetY());
464  glVertex3f(-HALF_TRACK_WHEELS_DISTANCE + cVertex.GetX(), -HALF_WHEEL_WIDTH, WHEEL_RADIUS + cVertex.GetY());
465  glVertex3f(-HALF_TRACK_WHEELS_DISTANCE + cVertex.GetX(), HALF_WHEEL_WIDTH, WHEEL_RADIUS + cVertex.GetY());
466  cVertex.Rotate(cAngle);
467  cNormal.Rotate(cAngle);
468  }
469  glEnd();
470  /* Back */
471  glBegin(GL_QUAD_STRIP);
472  for(GLuint i = 0; i <= m_unVertices / 2; i++) {
473  glNormal3f(cNormal.GetX(), 0.0f, cNormal.GetY());
474  glVertex3f(HALF_TRACK_WHEELS_DISTANCE + cVertex.GetX(), -HALF_WHEEL_WIDTH, WHEEL_RADIUS + cVertex.GetY());
475  glVertex3f(HALF_TRACK_WHEELS_DISTANCE + cVertex.GetX(), HALF_WHEEL_WIDTH, WHEEL_RADIUS + cVertex.GetY());
476  cVertex.Rotate(cAngle);
477  cNormal.Rotate(cAngle);
478  }
479  glEnd();
480  glDisable(GL_POLYGON_OFFSET_FILL); // Not needed anymore
481  }
482 
483  /****************************************/
484  /****************************************/
485 
487  /* Battery socket */
488  /* Set material */
490  /* This part covers the top and bottom faces (parallel to XY) */
491  glBegin(GL_QUADS);
492  /* Bottom face */
493  glNormal3f(0.0f, 0.0f, -1.0f);
494  glVertex3f( HALF_BATTERY_SOCKET_LENGTH, HALF_BATTERY_SOCKET_WIDTH, BATTERY_SOCKET_ELEVATION);
495  glVertex3f( HALF_BATTERY_SOCKET_LENGTH, -HALF_BATTERY_SOCKET_WIDTH, BATTERY_SOCKET_ELEVATION);
496  glVertex3f(-HALF_BATTERY_SOCKET_LENGTH, -HALF_BATTERY_SOCKET_WIDTH, BATTERY_SOCKET_ELEVATION);
497  glVertex3f(-HALF_BATTERY_SOCKET_LENGTH, HALF_BATTERY_SOCKET_WIDTH, BATTERY_SOCKET_ELEVATION);
498  /* Top face */
499  glNormal3f(0.0f, 0.0f, 1.0f);
500  glVertex3f(-HALF_BATTERY_SOCKET_LENGTH, -HALF_BATTERY_SOCKET_WIDTH, BATTERY_SOCKET_ELEVATION + WHEEL_DIAMETER);
501  glVertex3f( HALF_BATTERY_SOCKET_LENGTH, -HALF_BATTERY_SOCKET_WIDTH, BATTERY_SOCKET_ELEVATION + WHEEL_DIAMETER);
502  glVertex3f( HALF_BATTERY_SOCKET_LENGTH, HALF_BATTERY_SOCKET_WIDTH, BATTERY_SOCKET_ELEVATION + WHEEL_DIAMETER);
503  glVertex3f(-HALF_BATTERY_SOCKET_LENGTH, HALF_BATTERY_SOCKET_WIDTH, BATTERY_SOCKET_ELEVATION + WHEEL_DIAMETER);
504  glEnd();
505  /* This part covers the faces (South, East, North, West) */
506  glBegin(GL_QUAD_STRIP);
507  /* Starting side */
508  glNormal3f(-1.0f, 0.0f, 0.0f);
509  glVertex3f(-HALF_BATTERY_SOCKET_LENGTH, -HALF_BATTERY_SOCKET_WIDTH, BATTERY_SOCKET_ELEVATION + WHEEL_DIAMETER);
510  glVertex3f(-HALF_BATTERY_SOCKET_LENGTH, -HALF_BATTERY_SOCKET_WIDTH, BATTERY_SOCKET_ELEVATION);
511  /* South face */
512  glVertex3f( HALF_BATTERY_SOCKET_LENGTH, -HALF_BATTERY_SOCKET_WIDTH, BATTERY_SOCKET_ELEVATION + WHEEL_DIAMETER);
513  glVertex3f( HALF_BATTERY_SOCKET_LENGTH, -HALF_BATTERY_SOCKET_WIDTH, BATTERY_SOCKET_ELEVATION);
514  /* East face */
515  glNormal3f(0.0f, -1.0f, 0.0f);
516  glVertex3f( HALF_BATTERY_SOCKET_LENGTH, HALF_BATTERY_SOCKET_WIDTH, BATTERY_SOCKET_ELEVATION + WHEEL_DIAMETER);
517  glVertex3f( HALF_BATTERY_SOCKET_LENGTH, HALF_BATTERY_SOCKET_WIDTH, BATTERY_SOCKET_ELEVATION);
518  /* North face */
519  glNormal3f(1.0f, 0.0f, 0.0f);
520  glVertex3f(-HALF_BATTERY_SOCKET_LENGTH, HALF_BATTERY_SOCKET_WIDTH, BATTERY_SOCKET_ELEVATION + WHEEL_DIAMETER);
521  glVertex3f(-HALF_BATTERY_SOCKET_LENGTH, HALF_BATTERY_SOCKET_WIDTH, BATTERY_SOCKET_ELEVATION);
522  /* West face */
523  glNormal3f(0.0f, 1.0f, 0.0f);
524  glVertex3f(-HALF_BATTERY_SOCKET_LENGTH, -HALF_BATTERY_SOCKET_WIDTH, BATTERY_SOCKET_ELEVATION + WHEEL_DIAMETER);
525  glVertex3f(-HALF_BATTERY_SOCKET_LENGTH, -HALF_BATTERY_SOCKET_WIDTH, BATTERY_SOCKET_ELEVATION);
526  glEnd();
527  /* Circuit board */
528  CVector2 cVertex(BASE_MODULE_RADIUS, 0.0f);
529  CRadians cAngle(-CRadians::TWO_PI / m_unVertices);
530  /* Bottom part */
531  glBegin(GL_POLYGON);
532  glNormal3f(0.0f, 0.0f, -1.0f);
533  for(GLuint i = 0; i <= m_unVertices; i++) {
534  glVertex3f(cVertex.GetX(), cVertex.GetY(), BATTERY_SOCKET_ELEVATION + WHEEL_DIAMETER);
535  cVertex.Rotate(cAngle);
536  }
537  glEnd();
538  /* Side surface */
539  cAngle = -cAngle;
540  CVector2 cNormal(1.0f, 0.0f);
541  cVertex.Set(BASE_MODULE_RADIUS, 0.0f);
542  glBegin(GL_QUAD_STRIP);
543  for(GLuint i = 0; i <= m_unVertices; i++) {
544  glNormal3f(cNormal.GetX(), cNormal.GetY(), 0.0f);
545  glVertex3f(cVertex.GetX(), cVertex.GetY(), BATTERY_SOCKET_ELEVATION + WHEEL_DIAMETER + BASE_MODULE_HEIGHT);
546  glVertex3f(cVertex.GetX(), cVertex.GetY(), BATTERY_SOCKET_ELEVATION + WHEEL_DIAMETER);
547  cVertex.Rotate(cAngle);
548  cNormal.Rotate(cAngle);
549  }
550  glEnd();
551  /* Top part */
552  /* Set material */
554  glBegin(GL_POLYGON);
555  glNormal3f(0.0f, 0.0f, 1.0f);
556  cVertex.Set(BASE_MODULE_RADIUS, 0.0f);
557  for(GLuint i = 0; i <= m_unVertices; i++) {
558  glVertex3f(cVertex.GetX(), cVertex.GetY(), BATTERY_SOCKET_ELEVATION + WHEEL_DIAMETER + BASE_MODULE_HEIGHT);
559  cVertex.Rotate(cAngle);
560  }
561  glEnd();
562  }
563 
564  /****************************************/
565  /****************************************/
566 
568  glDisable(GL_CULL_FACE); // This way we can see both faces of the grippable slice
569  /* Bottom part */
570  CVector2 cVertex(BASE_MODULE_RADIUS, 0.0f);
571  cVertex.Rotate(-CRadians::TWO_PI / 12);
572  CRadians cAngle(CRadians::TWO_PI / (m_unVertices * 12));
573  glBegin(GL_TRIANGLE_FAN);
574  glNormal3f(0.0f, 0.0f, -1.0f);
575  glVertex3f(0.0f, 0.0f, GRIPPER_MODULE_ELEVATION);
576  for(GLuint i = 0; i <= m_unVertices; i++) {
577  glVertex3f(cVertex.GetX(), cVertex.GetY(), GRIPPER_MODULE_ELEVATION);
578  cVertex.Rotate(cAngle);
579  }
580  glEnd();
581  cAngle = -CRadians::TWO_PI / (m_unVertices * 12);
582  /* Side barrier surface (bottom) */
583  CVector2 cNormal(1.0f, 0.0f);
584  cVertex.Set(BASE_MODULE_RADIUS, 0.0f);
585  glBegin(GL_QUAD_STRIP);
586  for(GLuint i = 0; i <= m_unVertices; i++) {
587  glNormal3f(cVertex.GetX(), cVertex.GetY(), 0.0f);
588  glVertex3f(cVertex.GetX(), cVertex.GetY(), GRIPPER_MODULE_ELEVATION + GRIPPER_MODULE_BARRIER_HEIGHT);
589  glVertex3f(cVertex.GetX(), cVertex.GetY(), GRIPPER_MODULE_ELEVATION);
590  cVertex.Rotate(cAngle);
591  cNormal.Rotate(cAngle);
592  }
593  glEnd();
594  /* Side barrier surface (top) */
595  cNormal.Set(1.0f, 0.0f);
596  cVertex.Set(BASE_MODULE_RADIUS, 0.0f);
597  glBegin(GL_QUAD_STRIP);
598  for(GLuint i = 0; i <= m_unVertices; i++) {
599  glNormal3f(cVertex.GetX(), cVertex.GetY(), 0.0f);
600  glVertex3f(cVertex.GetX(), cVertex.GetY(), GRIPPER_MODULE_ELEVATION + GRIPPER_MODULE_HEIGHT);
601  glVertex3f(cVertex.GetX(), cVertex.GetY(), GRIPPER_MODULE_ELEVATION + GRIPPER_MODULE_HEIGHT - GRIPPER_MODULE_BARRIER_HEIGHT);
602  cVertex.Rotate(cAngle);
603  cNormal.Rotate(cAngle);
604  }
605  glEnd();
606  /* Internal rod (bottom) */
607  cNormal.Set(BASE_MODULE_RADIUS - GRIPPER_MODULE_INNER_RADIUS,
608  GRIPPER_MODULE_HALF_HEIGHT);
609  cNormal.Normalize();
610  cVertex.Set(BASE_MODULE_RADIUS, 0.0f);
611  CVector2 cVertex2(GRIPPER_MODULE_INNER_RADIUS, 0.0f);
612  glBegin(GL_QUAD_STRIP);
613  for(GLuint i = 0; i <= m_unVertices; i++) {
614  glNormal3f(cVertex.GetX(), cVertex.GetY(), 0.0f);
615  glVertex3f(cVertex2.GetX(), cVertex2.GetY(), GRIPPER_MODULE_ELEVATION + GRIPPER_MODULE_HALF_HEIGHT);
616  glVertex3f(cVertex.GetX(), cVertex.GetY(), GRIPPER_MODULE_ELEVATION);
617  cVertex.Rotate(cAngle);
618  cVertex2.Rotate(cAngle);
619  cNormal.Rotate(cAngle);
620  }
621  glEnd();
622  /* Internal rod (top) */
623  cNormal.Set( BASE_MODULE_RADIUS - GRIPPER_MODULE_INNER_RADIUS,
624  -GRIPPER_MODULE_HALF_HEIGHT);
625  cNormal.Normalize();
626  cVertex.Set(BASE_MODULE_RADIUS, 0.0f);
627  cVertex2.Set(GRIPPER_MODULE_INNER_RADIUS, 0.0f);
628  glBegin(GL_QUAD_STRIP);
629  for(GLuint i = 0; i <= m_unVertices; i++) {
630  glNormal3f(cVertex.GetX(), cVertex.GetY(), 0.0f);
631  glVertex3f(cVertex.GetX(), cVertex.GetY(), GRIPPER_MODULE_ELEVATION + GRIPPER_MODULE_HEIGHT);
632  glVertex3f(cVertex2.GetX(), cVertex2.GetY(), GRIPPER_MODULE_ELEVATION + GRIPPER_MODULE_HALF_HEIGHT);
633  cVertex.Rotate(cAngle);
634  cVertex2.Rotate(cAngle);
635  cNormal.Rotate(cAngle);
636  }
637  glEnd();
638  /* Top part */
639  cVertex.Set(BASE_MODULE_RADIUS, 0.0f);
640  glBegin(GL_TRIANGLE_FAN);
641  glNormal3f(0.0f, 0.0f, 1.0f);
642  glVertex3f(0.0f, 0.0f, GRIPPER_MODULE_ELEVATION + GRIPPER_MODULE_HEIGHT);
643  for(GLuint i = 0; i <= m_unVertices; i++) {
644  glVertex3f(cVertex.GetX(), cVertex.GetY(), GRIPPER_MODULE_ELEVATION + GRIPPER_MODULE_HEIGHT);
645  cVertex.Rotate(cAngle);
646  }
647  glEnd();
648  glEnable(GL_CULL_FACE); // Back to normal setting: cull back faces
649  }
650 
651  /****************************************/
652  /****************************************/
653 
655  /* Set material */
656  const GLfloat pfColor[] = { 0.0f, 0.0f, 0.0f, 1.0f };
657  const GLfloat pfSpecular[] = { 0.0f, 0.0f, 0.0f, 1.0f };
658  const GLfloat pfShininess[] = { 0.0f };
659  const GLfloat pfEmission[] = { 0.0f, 0.0f, 0.0f, 1.0f };
660  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, pfColor);
661  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, pfSpecular);
662  glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, pfShininess);
663  glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, pfEmission);
664  /* This part covers the top and bottom faces (parallel to XY) */
665  glEnable(GL_POLYGON_OFFSET_FILL); // Correct flickering due to overlapping surfaces
666  glPolygonOffset(-0.1, 1.0); // Correct flickering due to overlapping surfaces
667  glBegin(GL_QUADS);
668  /* Bottom face */
669  glNormal3f(0.0f, 0.0f, -1.0f);
670  glVertex3f(GRIPPER_MECHANICS_LENGTH + GRIPPER_MODULE_INNER_RADIUS, GRIPPER_MECHANICS_HALF_WIDTH, GRIPPER_MODULE_ELEVATION);
671  glVertex3f(GRIPPER_MECHANICS_LENGTH + GRIPPER_MODULE_INNER_RADIUS, -GRIPPER_MECHANICS_HALF_WIDTH, GRIPPER_MODULE_ELEVATION);
672  glVertex3f( GRIPPER_MODULE_INNER_RADIUS, -GRIPPER_MECHANICS_HALF_WIDTH, GRIPPER_MODULE_ELEVATION);
673  glVertex3f( GRIPPER_MODULE_INNER_RADIUS, GRIPPER_MECHANICS_HALF_WIDTH, GRIPPER_MODULE_ELEVATION);
674  /* Top face */
675  glNormal3f(0.0f, 0.0f, 1.0f);
676  glVertex3f( GRIPPER_MODULE_INNER_RADIUS, -GRIPPER_MECHANICS_HALF_WIDTH, GRIPPER_MODULE_ELEVATION + GRIPPER_MODULE_HEIGHT);
677  glVertex3f(GRIPPER_MECHANICS_LENGTH + GRIPPER_MODULE_INNER_RADIUS, -GRIPPER_MECHANICS_HALF_WIDTH, GRIPPER_MODULE_ELEVATION + GRIPPER_MODULE_HEIGHT);
678  glVertex3f(GRIPPER_MECHANICS_LENGTH + GRIPPER_MODULE_INNER_RADIUS, GRIPPER_MECHANICS_HALF_WIDTH, GRIPPER_MODULE_ELEVATION + GRIPPER_MODULE_HEIGHT);
679  glVertex3f( GRIPPER_MODULE_INNER_RADIUS, GRIPPER_MECHANICS_HALF_WIDTH, GRIPPER_MODULE_ELEVATION + GRIPPER_MODULE_HEIGHT);
680  glEnd();
681  glDisable(GL_POLYGON_OFFSET_FILL); // Not needed anymore
682  /* This part covers the faces (South, East, North, West) */
683  glBegin(GL_QUAD_STRIP);
684  glNormal3f(0.0f, -1.0f, 0.0f);
685  /* Starting vertex */
686  glVertex3f( GRIPPER_MODULE_INNER_RADIUS, -GRIPPER_MECHANICS_HALF_WIDTH, GRIPPER_MODULE_ELEVATION + GRIPPER_MODULE_HEIGHT);
687  glVertex3f( GRIPPER_MODULE_INNER_RADIUS, -GRIPPER_MECHANICS_HALF_WIDTH, GRIPPER_MODULE_ELEVATION);
688  /* East face */
689  glNormal3f(1.0f, 0.0f, 0.0f);
690  glVertex3f(GRIPPER_MECHANICS_LENGTH + GRIPPER_MODULE_INNER_RADIUS, -GRIPPER_MECHANICS_HALF_WIDTH, GRIPPER_MODULE_ELEVATION + GRIPPER_MODULE_HEIGHT);
691  glVertex3f(GRIPPER_MECHANICS_LENGTH + GRIPPER_MODULE_INNER_RADIUS, -GRIPPER_MECHANICS_HALF_WIDTH, GRIPPER_MODULE_ELEVATION);
692  /* North face */
693  glNormal3f(0.0f, 1.0f, 0.0f);
694  glVertex3f(GRIPPER_MECHANICS_LENGTH + GRIPPER_MODULE_INNER_RADIUS, GRIPPER_MECHANICS_HALF_WIDTH, GRIPPER_MODULE_ELEVATION + GRIPPER_MODULE_HEIGHT);
695  glVertex3f(GRIPPER_MECHANICS_LENGTH + GRIPPER_MODULE_INNER_RADIUS, GRIPPER_MECHANICS_HALF_WIDTH, GRIPPER_MODULE_ELEVATION);
696  /* West face */
697  glNormal3f(-1.0f, 0.0f, 0.0f);
698  glVertex3f( GRIPPER_MODULE_INNER_RADIUS, GRIPPER_MECHANICS_HALF_WIDTH, GRIPPER_MODULE_ELEVATION + GRIPPER_MODULE_HEIGHT);
699  glVertex3f( GRIPPER_MODULE_INNER_RADIUS, GRIPPER_MECHANICS_HALF_WIDTH, GRIPPER_MODULE_ELEVATION);
700  glEnd();
701  }
702 
703  /****************************************/
704  /****************************************/
705 
707  /* Set material */
708  const GLfloat pfColor[] = { 0.5f, 0.5f, 0.5f, 1.0f };
709  const GLfloat pfSpecular[] = { 0.5f, 0.5f, 0.5f, 1.0f };
710  const GLfloat pfShininess[] = { 10.0f };
711  const GLfloat pfEmission[] = { 0.0f, 0.0f, 0.0f, 1.0f };
712  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, pfColor);
713  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, pfSpecular);
714  glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, pfShininess);
715  glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, pfEmission);
716  /* Draw the claw */
717  glDisable(GL_CULL_FACE); // In this way, we can see both sides of the claw
718  glNormal3f(0.0f, 0.0f, 1.0f);
719  glBegin(GL_QUADS);
720  glVertex3f( 0.0f, GRIPPER_CLAW_HALF_WIDTH, 0.0f);
721  glVertex3f( 0.0f, -GRIPPER_CLAW_HALF_WIDTH, 0.0f);
722  glVertex3f(GRIPPER_CLAW_LENGTH, -GRIPPER_CLAW_HALF_WIDTH, 0.0f);
723  glVertex3f(GRIPPER_CLAW_LENGTH, GRIPPER_CLAW_HALF_WIDTH, 0.0f);
724  glEnd();
725  glEnable(GL_CULL_FACE); // Restore back face culling
726  }
727 
728  /****************************************/
729  /****************************************/
730 
732  /* Set material */
734  /* Bottom part */
735  CVector2 cVertex(RAB_MAX_RADIUS, 0.0f);
736  CRadians cAngle(-CRadians::TWO_PI / m_unVertices);
737  glBegin(GL_POLYGON);
738  glNormal3f(0.0f, 0.0f, -1.0f);
739  for(GLuint i = 0; i <= m_unVertices; i++) {
740  glVertex3f(cVertex.GetX(), cVertex.GetY(), RAB_ELEVATION);
741  cVertex.Rotate(cAngle);
742  }
743  glEnd();
744  /* Side surface */
745  cAngle = -cAngle;
746  CVector3 cNormal(RAB_MAX_RADIUS - RAB_MIN_RADIUS, 0.0f, RAB_HEIGHT);
747  cNormal.Normalize();
748  cVertex.Set(RAB_MAX_RADIUS, 0.0f);
749  CVector2 cVertex2(RAB_MIN_RADIUS, 0.0f);
750  glBegin(GL_QUAD_STRIP);
751  for(GLuint i = 0; i <= m_unVertices; i++) {
752  glNormal3f(cNormal.GetX(), cNormal.GetY(), cNormal.GetZ());
753  glVertex3f(cVertex2.GetX(), cVertex2.GetY(), RAB_ELEVATION + RAB_HEIGHT);
754  glVertex3f(cVertex.GetX(), cVertex.GetY(), RAB_ELEVATION);
755  cVertex.Rotate(cAngle);
756  cVertex2.Rotate(cAngle);
757  cNormal.RotateZ(cAngle);
758  }
759  glEnd();
760  /* Top part */
761  /* Set material */
763  cVertex.Set(RAB_MIN_RADIUS, 0.0f);
764  glBegin(GL_POLYGON);
765  glNormal3f(0.0f, 0.0f, 1.0f);
766  for(GLuint i = 0; i <= m_unVertices; i++) {
767  glVertex3f(cVertex.GetX(), cVertex.GetY(), RAB_ELEVATION + RAB_HEIGHT);
768  cVertex.Rotate(cAngle);
769  }
770  glEnd();
771  }
772 
773  /****************************************/
774  /****************************************/
775 
777  /* Set material */
778  const GLfloat pfColor[] = { 0.0f, 0.0f, 0.0f, 1.0f };
779  const GLfloat pfSpecular[] = { 0.0f, 0.0f, 0.0f, 1.0f };
780  const GLfloat pfShininess[] = { 0.0f };
781  const GLfloat pfEmission[] = { 0.0f, 0.0f, 0.0f, 1.0f };
782  glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, pfColor);
783  glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, pfSpecular);
784  glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, pfShininess);
785  glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, pfEmission);
786  /* This part covers the top and bottom faces (parallel to XY) */
787  glBegin(GL_QUADS);
788  /* Bottom face */
789  glNormal3f(0.0f, 0.0f, -1.0f);
790  glVertex3f(DISTANCE_SCANNER_SENSOR_DEPTH + DISTANCE_SCANNER_RADIUS, DISTANCE_SCANNER_SENSOR_HALF_WIDTH, DISTANCE_SCANNER_ELEVATION);
791  glVertex3f(DISTANCE_SCANNER_SENSOR_DEPTH + DISTANCE_SCANNER_RADIUS, -DISTANCE_SCANNER_SENSOR_HALF_WIDTH, DISTANCE_SCANNER_ELEVATION);
792  glVertex3f( DISTANCE_SCANNER_RADIUS, -DISTANCE_SCANNER_SENSOR_HALF_WIDTH, DISTANCE_SCANNER_ELEVATION);
793  glVertex3f( DISTANCE_SCANNER_RADIUS, DISTANCE_SCANNER_SENSOR_HALF_WIDTH, DISTANCE_SCANNER_ELEVATION);
794  /* Top face */
795  glNormal3f(0.0f, 0.0f, 1.0f);
796  glVertex3f( DISTANCE_SCANNER_RADIUS, -DISTANCE_SCANNER_SENSOR_HALF_WIDTH, DISTANCE_SCANNER_ELEVATION + DISTANCE_SCANNER_HEIGHT);
797  glVertex3f(DISTANCE_SCANNER_SENSOR_DEPTH + DISTANCE_SCANNER_RADIUS, -DISTANCE_SCANNER_SENSOR_HALF_WIDTH, DISTANCE_SCANNER_ELEVATION + DISTANCE_SCANNER_HEIGHT);
798  glVertex3f(DISTANCE_SCANNER_SENSOR_DEPTH + DISTANCE_SCANNER_RADIUS, DISTANCE_SCANNER_SENSOR_HALF_WIDTH, DISTANCE_SCANNER_ELEVATION + DISTANCE_SCANNER_HEIGHT);
799  glVertex3f( DISTANCE_SCANNER_RADIUS, DISTANCE_SCANNER_SENSOR_HALF_WIDTH, DISTANCE_SCANNER_ELEVATION + DISTANCE_SCANNER_HEIGHT);
800  glEnd();
801  glDisable(GL_POLYGON_OFFSET_FILL); // Not needed anymore
802  /* This part covers the faces (South, East, North, West) */
803  glBegin(GL_QUAD_STRIP);
804  glNormal3f(0.0f, -1.0f, 0.0f);
805  /* Starting vertex */
806  glVertex3f( DISTANCE_SCANNER_RADIUS, DISTANCE_SCANNER_SENSOR_HALF_WIDTH, DISTANCE_SCANNER_ELEVATION + DISTANCE_SCANNER_HEIGHT);
807  glVertex3f( DISTANCE_SCANNER_RADIUS, DISTANCE_SCANNER_SENSOR_HALF_WIDTH, DISTANCE_SCANNER_ELEVATION);
808  /* South face */
809  glVertex3f( DISTANCE_SCANNER_RADIUS, -DISTANCE_SCANNER_SENSOR_HALF_WIDTH, DISTANCE_SCANNER_ELEVATION + DISTANCE_SCANNER_HEIGHT);
810  glVertex3f( DISTANCE_SCANNER_RADIUS, -DISTANCE_SCANNER_SENSOR_HALF_WIDTH, DISTANCE_SCANNER_ELEVATION);
811  /* East face */
812  glNormal3f(1.0f, 0.0f, 0.0f);
813  glVertex3f(DISTANCE_SCANNER_SENSOR_DEPTH + DISTANCE_SCANNER_RADIUS, -DISTANCE_SCANNER_SENSOR_HALF_WIDTH, DISTANCE_SCANNER_ELEVATION + DISTANCE_SCANNER_HEIGHT);
814  glVertex3f(DISTANCE_SCANNER_SENSOR_DEPTH + DISTANCE_SCANNER_RADIUS, -DISTANCE_SCANNER_SENSOR_HALF_WIDTH, DISTANCE_SCANNER_ELEVATION);
815  /* North face */
816  glNormal3f(0.0f, 1.0f, 0.0f);
817  glVertex3f(DISTANCE_SCANNER_SENSOR_DEPTH + DISTANCE_SCANNER_RADIUS, DISTANCE_SCANNER_SENSOR_HALF_WIDTH, DISTANCE_SCANNER_ELEVATION + DISTANCE_SCANNER_HEIGHT);
818  glVertex3f(DISTANCE_SCANNER_SENSOR_DEPTH + DISTANCE_SCANNER_RADIUS, DISTANCE_SCANNER_SENSOR_HALF_WIDTH, DISTANCE_SCANNER_ELEVATION);
819  /* West face */
820  glNormal3f(-1.0f, 0.0f, 0.0f);
821  glVertex3f( DISTANCE_SCANNER_RADIUS, DISTANCE_SCANNER_SENSOR_HALF_WIDTH, DISTANCE_SCANNER_ELEVATION + DISTANCE_SCANNER_HEIGHT);
822  glVertex3f( DISTANCE_SCANNER_RADIUS, DISTANCE_SCANNER_SENSOR_HALF_WIDTH, DISTANCE_SCANNER_ELEVATION);
823  glEnd();
824  }
825 
826  /****************************************/
827  /****************************************/
828 
830  /* Set material */
832  /* Draw only side surface */
833  CVector2 cVertex(DISTANCE_SCANNER_RADIUS, 0.0f);
834  CRadians cAngle(CRadians::TWO_PI / m_unVertices);
835  CVector2 cNormal(1.0f, 0.0f);
836  glBegin(GL_QUAD_STRIP);
837  for(GLuint i = 0; i <= m_unVertices; i++) {
838  glNormal3f(cVertex.GetX(), cVertex.GetY(), 0.0f);
839  glVertex3f(cVertex.GetX(), cVertex.GetY(), DISTANCE_SCANNER_ELEVATION + DISTANCE_SCANNER_HEIGHT);
840  glVertex3f(cVertex.GetX(), cVertex.GetY(), DISTANCE_SCANNER_ELEVATION);
841  cVertex.Rotate(cAngle);
842  cNormal.Rotate(cAngle);
843  }
844  glEnd();
845  }
846 
847  /****************************************/
848  /****************************************/
849 
851  /* Set material */
853  CVector2 cVertex(IMX_MODULE_RADIUS, 0.0f);
854  CRadians cAngle(-CRadians::TWO_PI / m_unVertices);
855  /* Bottom part */
856  glBegin(GL_POLYGON);
857  glNormal3f(0.0f, 0.0f, -1.0f);
858  for(GLuint i = 0; i <= m_unVertices; i++) {
859  glVertex3f(cVertex.GetX(), cVertex.GetY(), IMX_MODULE_ELEVATION);
860  cVertex.Rotate(cAngle);
861  }
862  glEnd();
863  /* Side surface */
864  cAngle = -cAngle;
865  CVector2 cNormal(1.0f, 0.0f);
866  cVertex.Set(IMX_MODULE_RADIUS, 0.0f);
867  glBegin(GL_QUAD_STRIP);
868  for(GLuint i = 0; i <= m_unVertices; i++) {
869  glNormal3f(cNormal.GetX(), cNormal.GetY(), 0.0f);
870  glVertex3f(cVertex.GetX(), cVertex.GetY(), IMX_MODULE_ELEVATION + IMX_MODULE_HEIGHT);
871  glVertex3f(cVertex.GetX(), cVertex.GetY(), IMX_MODULE_ELEVATION);
872  cVertex.Rotate(cAngle);
873  cNormal.Rotate(cAngle);
874  }
875  glEnd();
876  /* Top part */
877  /* Set material */
879  glBegin(GL_POLYGON);
880  glNormal3f(0.0f, 0.0f, 1.0f);
881  cVertex.Set(IMX_MODULE_RADIUS, 0.0f);
882  for(GLuint i = 0; i <= m_unVertices; i++) {
883  glVertex3f(cVertex.GetX(), cVertex.GetY(), IMX_MODULE_ELEVATION + IMX_MODULE_HEIGHT);
884  cVertex.Rotate(cAngle);
885  }
886  glEnd();
887  }
888 
889  /****************************************/
890  /****************************************/
891 
893  CVector2 cVertex(BEACON_RADIUS, 0.0f);
894  CRadians cAngle(-CRadians::TWO_PI / m_unVertices);
895  /* Bottom part */
896  glBegin(GL_POLYGON);
897  glNormal3f(0.0f, 0.0f, -1.0f);
898  for(GLuint i = 0; i <= m_unVertices; i++) {
899  glVertex3f(cVertex.GetX(), cVertex.GetY(), BEACON_ELEVATION);
900  cVertex.Rotate(cAngle);
901  }
902  glEnd();
903  /* Side surface */
904  cAngle = -cAngle;
905  CVector2 cNormal(1.0f, 0.0f);
906  cVertex.Set(BEACON_RADIUS, 0.0f);
907  glBegin(GL_QUAD_STRIP);
908  for(GLuint i = 0; i <= m_unVertices; i++) {
909  glNormal3f(cNormal.GetX(), cNormal.GetY(), 0.0f);
910  glVertex3f(cVertex.GetX(), cVertex.GetY(), BEACON_ELEVATION + BEACON_HEIGHT);
911  glVertex3f(cVertex.GetX(), cVertex.GetY(), BEACON_ELEVATION);
912  cVertex.Rotate(cAngle);
913  cNormal.Rotate(cAngle);
914  }
915  glEnd();
916  /* Top part */
917  glBegin(GL_POLYGON);
918  glNormal3f(0.0f, 0.0f, 1.0f);
919  cVertex.Set(BEACON_RADIUS, 0.0f);
920  for(GLuint i = 0; i <= m_unVertices; i++) {
921  glVertex3f(cVertex.GetX(), cVertex.GetY(), BEACON_ELEVATION + BEACON_HEIGHT);
922  cVertex.Rotate(cAngle);
923  }
924  glEnd();
925  }
926 
927  /****************************************/
928  /****************************************/
929 
931  /* Set material */
933  CVector2 cVertex(CAMERA_RADIUS, 0.0f);
934  CRadians cAngle(-CRadians::TWO_PI / m_unVertices);
935  /* Bottom part */
936  glBegin(GL_POLYGON);
937  glNormal3f(0.0f, 0.0f, -1.0f);
938  for(GLuint i = 0; i <= m_unVertices; i++) {
939  glVertex3f(cVertex.GetX(), cVertex.GetY(), CAMERA_ELEVATION);
940  cVertex.Rotate(cAngle);
941  }
942  glEnd();
943  /* Side surface */
944  cAngle = -cAngle;
945  CVector2 cNormal(1.0f, 0.0f);
946  cVertex.Set(CAMERA_RADIUS, 0.0f);
947  glBegin(GL_QUAD_STRIP);
948  for(GLuint i = 0; i <= m_unVertices; i++) {
949  glNormal3f(cNormal.GetX(), cNormal.GetY(), 0.0f);
950  glVertex3f(cVertex.GetX(), cVertex.GetY(), CAMERA_ELEVATION + CAMERA_HEIGHT);
951  glVertex3f(cVertex.GetX(), cVertex.GetY(), CAMERA_ELEVATION);
952  cVertex.Rotate(cAngle);
953  cNormal.Rotate(cAngle);
954  }
955  glEnd();
956  /* Top part */
957  glBegin(GL_POLYGON);
958  glNormal3f(0.0f, 0.0f, 1.0f);
959  cVertex.Set(CAMERA_RADIUS, 0.0f);
960  for(GLuint i = 0; i <= m_unVertices; i++) {
961  glVertex3f(cVertex.GetX(), cVertex.GetY(), CAMERA_ELEVATION + CAMERA_HEIGHT);
962  cVertex.Rotate(cAngle);
963  }
964  glEnd();
965  }
966 
967  /****************************************/
968  /****************************************/
969 
971  public:
972  void ApplyTo(CQTOpenGLWidget& c_visualization,
973  CFootBotEntity& c_entity) {
974  static CQTOpenGLFootBot m_cModel;
975  c_visualization.DrawRays(c_entity.GetControllableEntity());
976  c_visualization.DrawEntity(c_entity.GetEmbodiedEntity());
977  m_cModel.Draw(c_entity);
978  }
979  };
980 
982  public:
983  void ApplyTo(CQTOpenGLWidget& c_visualization,
984  CFootBotEntity& c_entity) {
985  c_visualization.DrawBoundingBox(c_entity.GetEmbodiedEntity());
986  }
987  };
988 
989  REGISTER_QTOPENGL_ENTITY_OPERATION(CQTOpenGLOperationDrawNormal, CQTOpenGLOperationDrawFootBotNormal, CFootBotEntity);
990 
991  REGISTER_QTOPENGL_ENTITY_OPERATION(CQTOpenGLOperationDrawSelected, CQTOpenGLOperationDrawFootBotSelected, CFootBotEntity);
992 
993  /****************************************/
994  /****************************************/
995 
996 }
argos::CVector3::Set
void Set(const Real f_x, const Real f_y, const Real f_z)
Sets the vector contents from Cartesian coordinates.
Definition: vector3.h:143
argos::CVector3::GetZ
Real GetZ() const
Returns the z coordinate of this vector.
Definition: vector3.h:125
argos::CFootBotEntity::GetGripperEquippedEntity
CGripperEquippedEntity & GetGripperEquippedEntity()
Definition: footbot_entity.h:74
argos::CLEDEntity::GetColor
const CColor & GetColor() const
Returns the current color of the LED.
Definition: led_entity.h:58
argos::CQTOpenGLOperationDrawFootBotSelected
Definition: qtopengl_footbot.cpp:981
argos::CVector2::Normalize
CVector2 & Normalize()
Normalizes this vector.
Definition: vector2.h:151
argos::CFootBotDistanceScannerEquippedEntity::GetRotation
const CRadians & GetRotation() const
Definition: footbot_distance_scanner_equipped_entity.h:50
footbot_turret_entity.h
argos::CLEDEquippedEntity::GetLED
CLEDEntity & GetLED(UInt32 un_index)
Returns an LED by numeric index.
Definition: led_equipped_entity.cpp:166
argos
The namespace containing all the ARGoS related code.
Definition: ci_actuator.h:12
argos::CVector3
A 3D vector class.
Definition: vector3.h:29
argos::CQTOpenGLFootBot::Draw
virtual void Draw(CFootBotEntity &c_entity)
Definition: qtopengl_footbot.cpp:191
argos::CFootBotEntity::GetTurretEntity
CFootBotTurretEntity & GetTurretEntity()
Definition: footbot_entity.h:66
argos::CFootBotEntity::GetLEDEquippedEntity
CLEDEquippedEntity & GetLEDEquippedEntity()
Definition: footbot_entity.h:82
argos::CRadians
It defines the basic type CRadians, used to store an angle value in radians.
Definition: angles.h:42
argos::CQTOpenGLFootBot::RenderTrack
void RenderTrack()
Renders the tracks.
Definition: qtopengl_footbot.cpp:425
argos::CFootBotTurretEntity::GetRotation
CRadians GetRotation() const
Definition: footbot_turret_entity.cpp:73
argos::CQTOpenGLWidget
Definition: qtopengl_widget.h:56
argos::CQTOpenGLOperationDrawFootBotNormal
Definition: qtopengl_footbot.cpp:970
argos::ToDegrees
CDegrees ToDegrees(const CRadians &c_radians)
Converts CRadians to CDegrees.
Definition: angles.h:489
argos::CColor::GetBlue
UInt8 GetBlue() const
Returns the blue channel of the color.
Definition: color.h:101
argos::CQTOpenGLOperationDrawNormal
Definition: qtopengl_widget.h:40
argos::CVector3::RotateZ
CVector3 & RotateZ(const CRadians &c_angle)
Rotates this vector wrt the z axis.
Definition: vector3.h:265
argos::REGISTER_QTOPENGL_ENTITY_OPERATION
REGISTER_QTOPENGL_ENTITY_OPERATION(CQTOpenGLOperationDrawNormal, CQTOpenGLOperationDrawEPuckNormal, CEPuckEntity)
argos::CQTOpenGLFootBot::MakeWheel
void MakeWheel()
Renders a materialless wheel.
Definition: qtopengl_footbot.cpp:275
argos::CVector2::Set
void Set(Real f_x, Real f_y)
Sets the vector contents from Cartesian coordinates.
Definition: vector2.h:111
argos::CVector2::GetY
Real GetY() const
Returns the y coordinate of this vector.
Definition: vector2.h:94
qtopengl_footbot.h
argos::CQTOpenGLFootBot
Definition: qtopengl_footbot.h:23
argos::CQTOpenGLFootBot::CQTOpenGLFootBot
CQTOpenGLFootBot()
Definition: qtopengl_footbot.cpp:94
argos::CQTOpenGLWidget::DrawEntity
void DrawEntity(CPositionalEntity &c_entity)
Draws a positional entity.
Definition: qtopengl_widget.cpp:468
argos::CVector3::GetX
Real GetX() const
Returns the x coordinate of this vector.
Definition: vector3.h:93
argos::CFootBotEntity
Definition: footbot_entity.h:32
argos::CQTOpenGLFootBot::SetLEDMaterial
void SetLEDMaterial(GLfloat f_red, GLfloat f_green, GLfloat f_blue)
Sets a colored LED material.
Definition: qtopengl_footbot.cpp:362
argos::CColor::GetRed
UInt8 GetRed() const
Returns the red channel of the color.
Definition: color.h:79
argos::CQTOpenGLFootBot::SetBlackTireMaterial
void SetBlackTireMaterial()
Sets a black tire material.
Definition: qtopengl_footbot.cpp:334
argos::CLEDEquippedEntity
A container of CLEDEntity.
Definition: led_equipped_entity.h:36
argos::CQTOpenGLFootBot::RenderCamera
void RenderCamera()
Renders the camera.
Definition: qtopengl_footbot.cpp:930
argos::CQTOpenGLWidget::DrawBoundingBox
void DrawBoundingBox(CEmbodiedEntity &c_entity)
Draws the bounding box of an embodied entity.
Definition: qtopengl_widget.cpp:538
footbot_distance_scanner_equipped_entity.h
argos::CQTOpenGLFootBot::SetWhitePlasticMaterial
void SetWhitePlasticMaterial()
Sets a white plastic material.
Definition: qtopengl_footbot.cpp:320
argos::CQTOpenGLFootBot::RenderDistanceScanner
void RenderDistanceScanner()
Renders the distance scanner.
Definition: qtopengl_footbot.cpp:829
argos::CQTOpenGLFootBot::~CQTOpenGLFootBot
virtual ~CQTOpenGLFootBot()
Definition: qtopengl_footbot.cpp:184
argos::CVector2::GetX
Real GetX() const
Returns the x coordinate of this vector.
Definition: vector2.h:78
argos::CVector3::RotateY
CVector3 & RotateY(const CRadians &c_angle)
Rotates this vector wrt the y axis.
Definition: vector3.h:245
argos::CVector2
A 2D vector class.
Definition: vector2.h:25
argos::CQTOpenGLFootBot::RenderBeacon
void RenderBeacon()
Renders the beacon.
Definition: qtopengl_footbot.cpp:892
argos::CVector3::Normalize
CVector3 & Normalize()
Normalizes this vector.
Definition: vector3.h:215
argos::CFootBotEntity::GetControllableEntity
CControllableEntity & GetControllableEntity()
Definition: footbot_entity.h:58
UInt32
unsigned int UInt32
32-bit unsigned integer.
Definition: datatypes.h:97
argos::CQTOpenGLFootBot::RenderGrippableSlice
void RenderGrippableSlice()
Renders a slice of the gripper module (LEDs)
Definition: qtopengl_footbot.cpp:567
argos::CColor
The basic color type.
Definition: color.h:25
argos::CGripperEquippedEntity::GetLockState
Real GetLockState() const
Returns the lock state of the gripper.
Definition: gripper_equipped_entity.h:153
argos::CDegrees::GetValue
Real GetValue() const
Returns the value in degrees.
Definition: angles.h:322
argos::CQTOpenGLOperationDrawFootBotNormal::ApplyTo
void ApplyTo(CQTOpenGLWidget &c_visualization, CFootBotEntity &c_entity)
Definition: qtopengl_footbot.cpp:972
argos::CQTOpenGLOperationDrawSelected
Definition: qtopengl_widget.h:45
argos::CQTOpenGLFootBot::RenderGripperClaw
void RenderGripperClaw()
Renders the gripper.
Definition: qtopengl_footbot.cpp:706
argos::CQTOpenGLFootBot::RenderWheel
void RenderWheel()
Renders the wheels.
Definition: qtopengl_footbot.cpp:377
argos::CQTOpenGLFootBot::RenderDistanceScannerSensor
void RenderDistanceScannerSensor()
Renders a single sensor of the distance scanner.
Definition: qtopengl_footbot.cpp:776
argos::CFootBotEntity::GetEmbodiedEntity
CEmbodiedEntity & GetEmbodiedEntity()
Definition: footbot_entity.h:70
footbot_entity.h
argos::CQTOpenGLFootBot::RenderGripperMechanics
void RenderGripperMechanics()
Renders the gripper.
Definition: qtopengl_footbot.cpp:654
argos::CVector3::GetY
Real GetY() const
Returns the y coordinate of this vector.
Definition: vector3.h:109
argos::CQTOpenGLFootBot::RenderIMX
void RenderIMX()
Renders the iMX module.
Definition: qtopengl_footbot.cpp:850
argos::CVector2::Rotate
CVector2 & Rotate(const CRadians &c_angle)
Rotates this vector by the wanted angle.
Definition: vector2.h:169
argos::CQTOpenGLWidget::DrawRays
void DrawRays(CControllableEntity &c_entity)
Draws a ray.
Definition: qtopengl_widget.cpp:504
argos::CRadians::TWO_PI
static const CRadians TWO_PI
Set to PI * 2.
Definition: angles.h:54
argos::CQTOpenGLOperationDrawFootBotSelected::ApplyTo
void ApplyTo(CQTOpenGLWidget &c_visualization, CFootBotEntity &c_entity)
Definition: qtopengl_footbot.cpp:983
argos::CQTOpenGLFootBot::RenderBase
void RenderBase()
Renders the base (apart from the wheels)
Definition: qtopengl_footbot.cpp:486
Real
float Real
Collects all ARGoS code.
Definition: datatypes.h:39
argos::CQTOpenGLFootBot::SetCircuitBoardMaterial
void SetCircuitBoardMaterial()
Sets a circuit board material.
Definition: qtopengl_footbot.cpp:348
argos::CQTOpenGLFootBot::RenderRAB
void RenderRAB()
Renders the RAB module.
Definition: qtopengl_footbot.cpp:731
argos::CColor::GetGreen
UInt8 GetGreen() const
Returns the green channel of the color.
Definition: color.h:90
argos::CFootBotEntity::GetDistanceScannerEquippedEntity
CFootBotDistanceScannerEquippedEntity & GetDistanceScannerEquippedEntity()
Definition: footbot_entity.h:62