-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhooman.h
111 lines (85 loc) · 2.61 KB
/
hooman.h
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
#ifndef __HOOMAN_H__
#define __HOOMAN_H__
#include <Box2D.h>
#include <cairo.h>
#include <iostream>
#include <vector>
#include <map>
class Hooman {
private:
// Ragdoll model from http://rednuht.org/genetic_walkers/
static constexpr double TORSO_UPPER_WIDTH = 0.25;
static constexpr double TORSO_UPPER_HEIGHT = 0.45 ;
static constexpr double TORSO_LOWER_WIDTH = 0.25 ;
static constexpr double TORSO_LOWER_HEIGHT = 0.2 ;
static constexpr double FEMUR_WIDTH = 0.18 ;
static constexpr double FEMUR_LENGTH = 0.45 ;
static constexpr double TIBIA_WIDTH = 0.13 ;
static constexpr double TIBIA_LENGTH = 0.38 ;
static constexpr double FOOT_HEIGHT = 0.08 ;
static constexpr double FOOT_LENGTH = 0.28 ;
static constexpr double ARM_WIDTH = 0.12 ;
static constexpr double ARM_LENGTH = 0.37 ;
static constexpr double FOREARM_WIDTH = 0.1 ;
static constexpr double FOREARM_LENGTH = 0.42 ;
static constexpr double HEAD_WIDTH = 0.22 ;
static constexpr double HEAD_HEIGHT = 0.22 ;
static constexpr double NECK_WIDTH = 0.1 ;
static constexpr double NECK_HEIGHT = 0.08 ;
b2Body* head ;
b2Body* neck ;
b2Body* upper_torso ;
b2Body* lower_torso ;
b2Body* left_arm_upper ;
b2Body* left_arm_lower ;
b2Body* right_arm_upper ;
b2Body* right_arm_lower ;
b2Body* left_leg_upper ;
b2Body* left_leg_lower ;
b2Body* left_leg_foot ;
b2Body* right_leg_upper ;
b2Body* right_leg_lower ;
b2Body* right_leg_foot ;
std::map<const b2Body*, b2Vec2> sizes ;
std::vector<b2RevoluteJoint*> joints ;
std::vector<b2Body*> bodies ;
double rr, gg, bb ;
protected:
b2World& world ;
b2Body* createBoxElement(const b2Vec2& size,
const b2Vec2& position) ;
b2Joint* createRevoluteJoint(b2Body* bodyA,
b2Body* bodyB,
const b2Vec2& deltaPosition,
double minAngle = 0,
double maxAngle = 6.28318530718,
bool enableMotor=false,
double maxMotorTorque=0) ;
b2Joint* createWeldJoint(b2Body* bodyA,
b2Body* bodyB,
const b2Vec2& anchorA,
const b2Vec2& anchorB,
double referenceAngle=0) ;
public:
Hooman(b2World& world) ;
~Hooman() ;
bool isAlive() const {
return (head->GetPosition()(1) > lower_torso->GetPosition()(1)) ;
}
size_t variableCount() const {
return joints.size() ;
}
void setVariable(size_t i, double d) {
joints[i]->SetMotorSpeed(d) ;
}
double getX() const {
b2Vec2 pos(0,0) ;
size_t i ;
for (i=0 ; i < bodies.size() ; i++) {
pos += bodies[i]->GetPosition() ;
}
return pos(0)/i ;
}
void render_to_cairo(cairo_t* cr) ;
} ;
#endif /* __HOOMAN_H__ */