Impl. walker bobbing head on idle
This commit is contained in:
parent
0611be13f2
commit
270de09894
2 changed files with 29 additions and 2 deletions
|
@ -31,7 +31,8 @@ Walker::Walker(float body_height, float body_feet_radius, float feet_radius)
|
||||||
feet_radius(feet_radius),
|
feet_radius(feet_radius),
|
||||||
lift_start_y(0.0F),
|
lift_start_y(0.0F),
|
||||||
rotation(0.0F),
|
rotation(0.0F),
|
||||||
target_rotation(0.0F) {
|
target_rotation(0.0F),
|
||||||
|
body_idle_move_timer(0.0F) {
|
||||||
const Vector3 nw = Vector3Normalize(Vector3{-1.0F, 0.0F, -1.0F});
|
const Vector3 nw = Vector3Normalize(Vector3{-1.0F, 0.0F, -1.0F});
|
||||||
const Vector3 ne = Vector3Normalize(Vector3{1.0F, 0.0F, -1.0F});
|
const Vector3 ne = Vector3Normalize(Vector3{1.0F, 0.0F, -1.0F});
|
||||||
const Vector3 sw = Vector3Normalize(Vector3{-1.0F, 0.0F, 1.0F});
|
const Vector3 sw = Vector3Normalize(Vector3{-1.0F, 0.0F, 1.0F});
|
||||||
|
@ -71,7 +72,11 @@ void Walker::draw(const Model &model) {
|
||||||
.boneCount = model.boneCount,
|
.boneCount = model.boneCount,
|
||||||
.bones = model.bones,
|
.bones = model.bones,
|
||||||
.bindPose = model.bindPose},
|
.bindPose = model.bindPose},
|
||||||
body_pos, 1.0F, WHITE);
|
Vector3{body_pos.x,
|
||||||
|
body_pos.y + BODY_IDLE_MOVE_AMOUNT *
|
||||||
|
std::sin(body_idle_move_timer + PI),
|
||||||
|
body_pos.z},
|
||||||
|
1.0F, WHITE);
|
||||||
|
|
||||||
// draw legs
|
// draw legs
|
||||||
DrawModel(Model{.transform = model.transform * rotationMatrix,
|
DrawModel(Model{.transform = model.transform * rotationMatrix,
|
||||||
|
|
22
src/walker.h
22
src/walker.h
|
@ -23,6 +23,8 @@ constexpr float FEET_LIFT_SPEED = 5.5F;
|
||||||
constexpr float FEET_HORIZ_MOVE_SPEED = 8.0F;
|
constexpr float FEET_HORIZ_MOVE_SPEED = 8.0F;
|
||||||
constexpr float FEET_INIT_POS_VARIANCE_DIV = 3.0F;
|
constexpr float FEET_INIT_POS_VARIANCE_DIV = 3.0F;
|
||||||
constexpr float BODY_ROTATION_SPEED = 1.0F;
|
constexpr float BODY_ROTATION_SPEED = 1.0F;
|
||||||
|
constexpr float BODY_IDLE_TIMER_RATE = 1.0F;
|
||||||
|
constexpr float BODY_IDLE_MOVE_AMOUNT = 0.2F;
|
||||||
|
|
||||||
class Walker {
|
class Walker {
|
||||||
public:
|
public:
|
||||||
|
@ -64,6 +66,7 @@ class Walker {
|
||||||
float lift_start_y;
|
float lift_start_y;
|
||||||
float rotation;
|
float rotation;
|
||||||
float target_rotation;
|
float target_rotation;
|
||||||
|
float body_idle_move_timer;
|
||||||
};
|
};
|
||||||
|
|
||||||
template <typename TBBS>
|
template <typename TBBS>
|
||||||
|
@ -251,6 +254,25 @@ void Walker::update(float dt, const TBBS &bbs, unsigned int width,
|
||||||
update_leg_fn(target_leg_sw, leg_sw, sw_flags,
|
update_leg_fn(target_leg_sw, leg_sw, sw_flags,
|
||||||
((nw_flags & 7) == 1 ? 1 : 0) + ((ne_flags & 7) == 1 ? 1 : 0) +
|
((nw_flags & 7) == 1 ? 1 : 0) + ((ne_flags & 7) == 1 ? 1 : 0) +
|
||||||
((se_flags & 7) == 1 ? 1 : 0));
|
((se_flags & 7) == 1 ? 1 : 0));
|
||||||
|
|
||||||
|
if ((flags & 3) == 0) {
|
||||||
|
body_idle_move_timer += dt * BODY_IDLE_TIMER_RATE;
|
||||||
|
if (body_idle_move_timer > PI * 2.0F) {
|
||||||
|
body_idle_move_timer -= PI * 2.0F;
|
||||||
|
}
|
||||||
|
} else if (!FloatEquals(body_idle_move_timer, 0.0F)) {
|
||||||
|
if (body_idle_move_timer < PI) {
|
||||||
|
body_idle_move_timer += dt * BODY_IDLE_TIMER_RATE;
|
||||||
|
if (body_idle_move_timer > PI) {
|
||||||
|
body_idle_move_timer = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
body_idle_move_timer += dt * BODY_IDLE_TIMER_RATE;
|
||||||
|
if (body_idle_move_timer > PI * 2.0F) {
|
||||||
|
body_idle_move_timer = 0.0F;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue