Player jumping taking air acceleration into account

This commit is contained in:
2016-01-24 15:20:34 +01:00
parent aaa11d2109
commit 373bb33cf0
3 changed files with 33 additions and 20 deletions
+6 -3
View File
@@ -6,12 +6,13 @@
<Origin X="0" Y="0.772000015" Z="0"/> <Origin X="0" Y="0.772000015" Z="0"/>
<Size X="1" Y="1.60000002" Z="1"/> <Size X="1" Y="1.60000002" Z="1"/>
</c:AABB> </c:AABB>
<c:Collidable/>
<c:Model/> <c:Model/>
<c:Physics> <c:Physics>
<Gravity>false</Gravity> <Velocity X="8.33307467e-09" Y="0" Z="9.82836834e-09"/>
</c:Physics> </c:Physics>
<c:Player> <c:Player>
<MovementSpeed>7</MovementSpeed> <MovementSpeed>5</MovementSpeed>
</c:Player> </c:Player>
<c:Team> <c:Team>
<Team> <Team>
@@ -19,7 +20,8 @@
</Team> </Team>
</c:Team> </c:Team>
<c:Transform> <c:Transform>
<Position X="0" Y="0" Z="7.38143063"/> <Position X="2.84928203" Y="0.0264999866" Z="7.31610918"/>
<Orientation X="0" Y="2.14675093" Z="0"/>
</c:Transform> </c:Transform>
</Components> </Components>
@@ -29,6 +31,7 @@
<c:Camera/> <c:Camera/>
<c:Transform> <c:Transform>
<Position X="0" Y="1.37700009" Z="0"/> <Position X="0" Y="1.37700009" Z="0"/>
<Orientation X="0.921535373" Y="0" Z="0"/>
</c:Transform> </c:Transform>
</Components> </Components>
<Children> <Children>
+1 -1
View File
@@ -31,7 +31,7 @@ void CollisionSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapper& c
} }
if (Collision::AABBVsAABB(boxA, boxB, resolutionVector)) { if (Collision::AABBVsAABB(boxA, boxB, resolutionVector)) {
(glm::vec3&)cTransform["Position"] += resolutionVector; (glm::vec3&)cTransform["Position"] += resolutionVector;
cPhysics["Velocity"] = glm::vec3(0, 0, 0); ((glm::vec3&)cPhysics["Velocity"]).y = 0.f;
} }
} }
+26 -16
View File
@@ -48,8 +48,12 @@ void PlayerMovementSystem::Update(double dt)
} }
glm::vec3& velocity = cPhysics["Velocity"]; glm::vec3& velocity = cPhysics["Velocity"];
ImGui::Text("velocity: (%f, %f, %f)", velocity.x, velocity.y, velocity.z); ImGui::Text("velocity: (%f, %f, %f)", velocity.x, velocity.y, velocity.z);
ImGui::Text("wishDirection: (%f, %f, %f)", wishDirection.x, wishDirection.y, wishDirection.z); glm::vec3 groundVelocity(0.f, 0.f, 0.f);
float currentSpeedProj = glm::dot(velocity, wishDirection); groundVelocity.x = glm::dot(velocity, glm::vec3(1.f, 0.f, 0.f));
groundVelocity.z = glm::dot(velocity, glm::vec3(0.f, 0.f, 1.f));
ImGui::Text("groundVelocity: (%f, %f, %f) |%f|", groundVelocity.x, groundVelocity.y, groundVelocity.z, glm::length(wishDirection));
ImGui::Text("wishDirection: (%f, %f, %f) |%f|", wishDirection.x, wishDirection.y, wishDirection.z, glm::length(wishDirection));
float currentSpeedProj = glm::dot(groundVelocity, wishDirection);
float addSpeed = wishSpeed - currentSpeedProj; float addSpeed = wishSpeed - currentSpeedProj;
ImGui::Text("currentSpeedProj: %f", currentSpeedProj); ImGui::Text("currentSpeedProj: %f", currentSpeedProj);
ImGui::Text("wishSpeed: %f", wishSpeed); ImGui::Text("wishSpeed: %f", wishSpeed);
@@ -58,20 +62,20 @@ void PlayerMovementSystem::Update(double dt)
if (addSpeed > 0) { if (addSpeed > 0) {
static float accel = 15.f; static float accel = 15.f;
ImGui::InputFloat("accel", &accel); ImGui::InputFloat("accel", &accel);
float actualAccel = accel; static float airAccel = 0.5f;
static float surfaceFriction = 1.f; ImGui::InputFloat("airAccel", &airAccel);
float actualAccel = (velocity.y != 0) ? airAccel : accel;
static float surfaceFriction = 5.f;
ImGui::InputFloat("surfaceFriction", &surfaceFriction); ImGui::InputFloat("surfaceFriction", &surfaceFriction);
float accelerationSpeed = actualAccel * (float)dt * wishSpeed * surfaceFriction; float accelerationSpeed = actualAccel * (float)dt * wishSpeed * surfaceFriction;
accelerationSpeed = glm::min(accelerationSpeed, addSpeed); accelerationSpeed = glm::min(accelerationSpeed, addSpeed);
velocity += accelerationSpeed * wishDirection; velocity += accelerationSpeed * wishDirection;
ImGui::Text("velocity: (%f, %f, %f) |%f|", velocity.x, velocity.y, velocity.z, glm::length(velocity)); ImGui::Text("velocity: (%f, %f, %f) |%f|", velocity.x, velocity.y, velocity.z, glm::length(velocity));
} }
//pos += controller->Movement() * glm::inverse(glm::quat(ori)) * speed * (float)dt;
//glm::vec3& velocity = player["Physics"]["Velocity"]; if (controller->Jumping() && !controller->Crouching() && velocity.y == 0.f) {
//if (controller->Jumping() && !controller->Crouching() && velocity.y == 0.f) { velocity.y += 4.f;
// velocity.y += 4.f; }
//}
//if (player.HasComponent("AABB")) { //if (player.HasComponent("AABB")) {
// glm::vec3& size = player["AABB"]["Size"]; // glm::vec3& size = player["AABB"]["Size"];
@@ -93,20 +97,26 @@ void PlayerMovementSystem::UpdateComponent(EntityWrapper& entity, ComponentWrapp
if (!entity.HasComponent("Physics")) { if (!entity.HasComponent("Physics")) {
return; return;
} }
ComponentWrapper& cPhysics = entity["Physics"];
ComponentWrapper& cPhysics = entity["Physics"];
glm::vec3& velocity = cPhysics["Velocity"]; glm::vec3& velocity = cPhysics["Velocity"];
if (cPhysics["Gravity"]) {
velocity.y -= 9.82f * (float)dt;
}
// Ground friction // Ground friction
float speed = glm::length(velocity); float speed = glm::length(velocity);
static float groundFriction = 7.f; static float groundFriction = 7.f;
ImGui::InputFloat("groundFriction", &groundFriction); ImGui::InputFloat("groundFriction", &groundFriction);
static float airFriction = 0.f;
ImGui::InputFloat("airFriction", &airFriction);
float friction = (velocity.y != 0) ? airFriction : groundFriction;
if (speed > 0) { if (speed > 0) {
float drop = speed * groundFriction * (float)dt; float drop = speed * friction * (float)dt;
velocity *= glm::max(speed - drop, 0.f) / speed; float multiplier = glm::max(speed - drop, 0.f) / speed;
velocity.x *= multiplier;
velocity.z *= multiplier;
}
if (cPhysics["Gravity"]) {
velocity.y -= 9.82f * (float)dt;
} }
glm::vec3& position = cTransform["Position"]; glm::vec3& position = cTransform["Position"];