Fixing suspension and car collision shape

This commit is contained in:
ViktorLjung
2014-04-29 14:21:14 +02:00
parent f471d7732f
commit dc32316bd7
4 changed files with 57 additions and 34 deletions
+9 -9
View File
@@ -20,11 +20,11 @@ void GameWorld::Initialize()
//transform->Scale = glm::vec3(400.0f, 10.0f, 400.0f);
transform->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, 0.0f));
auto model = AddComponent<Components::Model>(ground, "Model");
model->ModelFile = "Models/TestScene/testScene.obj";
//model->ModelFile = "Models/Placeholders/Terrain/Terrain.obj";
//model->ModelFile = "Models/TestScene/testScene.obj";
model->ModelFile = "Models/Placeholders/Terrain/Terrain.obj";
auto meshShape = AddComponent<Components::MeshShape>(ground, "MeshShape");
//meshShape->ResourceName = "Models/Placeholders/Terrain/Terrain.obj";
meshShape->ResourceName = "Models/TestScene/testScene.obj";
meshShape->ResourceName = "Models/Placeholders/Terrain/Terrain.obj";
//meshShape->ResourceName = "Models/TestScene/testScene.obj";
auto physics = AddComponent<Components::Physics>(ground, "Physics");
physics->Mass = 10;
@@ -49,7 +49,7 @@ void GameWorld::Initialize()
{
auto jeep = CreateEntity();
auto transform = AddComponent<Components::Transform>(jeep, "Transform");
transform->Position = glm::vec3(0, 10, 0);
transform->Position = glm::vec3(0, 15, 0);
auto physics = AddComponent<Components::Physics>(jeep, "Physics");
physics->Mass = 800;
@@ -61,7 +61,7 @@ void GameWorld::Initialize()
// box->Depth = 2.594f;
auto meshShape = AddComponent<Components::MeshShape>(jeep, "MeshShape");
meshShape->ResourceName = "Models/JeepV2/Chassi/chassi.OBJ";
meshShape->ResourceName = "Models/JeepV2/Chassi/ChassiCollision.obj";
auto vehicle = AddComponent<Components::Vehicle>(jeep, "Vehicle");
@@ -72,7 +72,7 @@ void GameWorld::Initialize()
auto transform = AddComponent<Components::Transform>(chassis, "Transform");
transform->Position = glm::vec3(0, 0, 0); // 0.6577f
auto model = AddComponent<Components::Model>(chassis, "Model");
model->ModelFile = "Models/JeepV2/Chassi/chassi.OBJ";
model->ModelFile = "Models/JeepV2/Chassi/ChassiCollision.obj";
}
{
@@ -91,7 +91,7 @@ void GameWorld::Initialize()
//Create wheels
float wheelOffset = 0.4f;
float springLength = 0.3f;
float suspensionStrength = 20.f;
float suspensionStrength = 35.f;
{
auto wheel = CreateEntity(jeep);
auto transform = AddComponent<Components::Transform>(wheel, "Transform");
@@ -194,7 +194,7 @@ void GameWorld::Initialize()
CommitEntity(entity);
}*/
for(int i = 0; i < 0; i++)
for(int i = 0; i < 5; i++)
{
auto wall = CreateEntity();
auto transform = AddComponent<Components::Transform>(wall, "Transform");
+42 -18
View File
@@ -120,6 +120,7 @@ void Systems::PhysicsSystem::Update(double dt)
for (auto pair : *m_World->GetEntities())
{
EntityID entity = pair.first;
EntityID parent = pair.second;
if (m_RigidBodies.find(entity) == m_RigidBodies.end())
continue;
@@ -128,22 +129,35 @@ void Systems::PhysicsSystem::Update(double dt)
if (!transformComponent)
continue;
/*if(m_RigidBodies[entity]->isActive())
if(m_RigidBodies[entity]->isActive())
{
hkVector4 position;
hkQuaternion rotation;
if (parent)
{
auto absoluteTransform = m_World->GetSystem<Systems::TransformSystem>("TransformSystem")->AbsoluteTransform(entity);
position = hkVector4(absoluteTransform.Position.x, absoluteTransform.Position.y, absoluteTransform.Position.z);
rotation = hkQuaternion(absoluteTransform.Orientation.x, absoluteTransform.Orientation.y, absoluteTransform.Orientation.z, absoluteTransform.Orientation.w);
}
else
{
position = hkVector4(transformComponent->Position.x, transformComponent->Position.y, transformComponent->Position.z);
rotation = hkQuaternion(transformComponent->Orientation.x, transformComponent->Orientation.y, transformComponent->Orientation.z, transformComponent->Orientation.w);
}
m_PhysicsWorld->markForWrite();
hkVector4 position(transformComponent->Position.x, transformComponent->Position.y, transformComponent->Position.z);
hkQuaternion rotation(transformComponent->Orientation.x, transformComponent->Orientation.y, transformComponent->Orientation.z, transformComponent->Orientation.w);
m_RigidBodies[entity]->setPositionAndRotation(position, rotation);
m_PhysicsWorld->unmarkForWrite();
}*/
}
}
static const double timestep = 1 / 30.0;
static const double timestep = 1 / 60.0;
m_Accumulator += dt;
while (m_Accumulator >= timestep)
{
@@ -222,7 +236,7 @@ void Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID p
if(inputComponent->KeyState[GLFW_KEY_UP] != 0 || inputComponent->KeyState[GLFW_KEY_DOWN] != 0)
{
deviceStatus->m_positionY += inputComponent->KeyState[GLFW_KEY_UP] * -1 * 0.1f + inputComponent->KeyState[GLFW_KEY_DOWN] * 1 * 0.1f;
deviceStatus->m_positionY += inputComponent->KeyState[GLFW_KEY_UP] * -1 * 1.f * dt + inputComponent->KeyState[GLFW_KEY_DOWN] * 1 * 1.f * dt;
}
else
{
@@ -234,24 +248,24 @@ void Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID p
else if(deviceStatus->m_positionY < -1)
deviceStatus->m_positionY = -1;
float turningSpeed = 0.02f;
float turningSpeed = 3.f;
if(inputComponent->KeyState[GLFW_KEY_LEFT] != 0 || inputComponent->KeyState[GLFW_KEY_RIGHT] != 0)
{
deviceStatus->m_positionX += inputComponent->KeyState[GLFW_KEY_LEFT] * -1 * turningSpeed + inputComponent->KeyState[GLFW_KEY_RIGHT] * 1 * turningSpeed;
deviceStatus->m_positionX += inputComponent->KeyState[GLFW_KEY_LEFT] * -1 * turningSpeed * dt + inputComponent->KeyState[GLFW_KEY_RIGHT] * 1 * turningSpeed * dt;
}
else
{
if(deviceStatus->m_positionX > 0)
{
deviceStatus->m_positionX += -1 * turningSpeed;
deviceStatus->m_positionX += -1 * (turningSpeed*2) *dt;
}
else if(deviceStatus->m_positionX < 0)
{
deviceStatus->m_positionX += 1 * turningSpeed;
deviceStatus->m_positionX += 1 * (turningSpeed*2) * dt;
}
if (deviceStatus->m_positionX > -turningSpeed && deviceStatus->m_positionX < turningSpeed)
if (deviceStatus->m_positionX > -0.1 && deviceStatus->m_positionX < 0.1)
{
deviceStatus->m_positionX = 0.f;
}
@@ -265,9 +279,9 @@ void Systems::PhysicsSystem::UpdateEntity(double dt, EntityID entity, EntityID p
deviceStatus->m_handbrakeButtonPressed = inputComponent->KeyState[GLFW_KEY_RIGHT_CONTROL];
if(inputComponent->KeyState[GLFW_KEY_R])
if(inputComponent->KeyState[GLFW_KEY_R] && !inputComponent->LastKeyState[GLFW_KEY_R])
{
transformComponent->Position = glm::vec3(0, 10, 0);
transformComponent->Position = transformComponent->Position + glm::vec3(0, 5, 0);
transformComponent->Orientation = glm::quat(glm::vec3(0.0f, 0.0f, 0.0f));
m_RigidBodies[entity]->setLinearVelocity(hkVector4(0, 0, 0));
m_RigidBodies[entity]->setAngularVelocity(hkVector4(0, 0, 0));
@@ -389,9 +403,18 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
}
hkpInertiaTensorComputer::computeShapeVolumeMassProperties(mesh, physicsComponent->Mass, massProperties);
rigidBodyInfo.m_shape = mesh;
m_hkpExtendedMeshShapes[entity].ExtendedMeshShape = mesh;
m_hkpExtendedMeshShapes[entity].VertexIndices = vertexIndices;
m_hkpExtendedMeshShapes[entity].Vertices = vertices;
m_ExtendedMeshShapes[entity].ExtendedMeshShape = mesh;
m_ExtendedMeshShapes[entity].VertexIndices = vertexIndices;
m_ExtendedMeshShapes[entity].Vertices = vertices;
hkpMoppCompilerInput mci;
hkpMoppCode* code = hkpMoppUtility::buildCode( mesh, mci );
hkpMoppBvTreeShape* moppShape = new hkpMoppBvTreeShape(mesh, code);
m_ExtendedMeshShapes[entity].Code = code;
m_ExtendedMeshShapes[entity].MoppShape = moppShape;
shape = moppShape;
shape = mesh;
}
else
@@ -422,11 +445,12 @@ void Systems::PhysicsSystem::OnEntityCommit( EntityID entity )
i--;
}
}
m_PhysicsWorld->markForWrite();
VehicleSetup vehicleSetup;
// Create the basic vehicle.
m_Vehicles[entity] = new hkpVehicleInstance(rigidBody);
m_PhysicsWorld->markForWrite();
vehicleSetup.buildVehicle(m_World, m_PhysicsWorld, *m_Vehicles[entity], entity, m_Wheels);
// Add the vehicle's entities and phantoms to the world
m_Vehicles[entity]->addToWorld(m_PhysicsWorld);
+5 -1
View File
@@ -38,6 +38,8 @@
#include <Physics2012/Utilities/VisualDebugger/hkpPhysicsContext.h>
#include <Physics2012/Collide/Shape/Compound/Collection/ExtendedMeshShape/hkpExtendedMeshShape.h>
#include <Physics2012/Collide/Shape/Compound/Tree/Mopp/hkpMoppBvTreeShape.h>
#include <Physics2012/Collide/Shape/Compound/Tree/Mopp/hkpMoppUtility.h>
#include <Common/Base/Thread/JobQueue/hkJobQueue.h>
#include <Common/Base/Thread/Job/ThreadPool/Cpu/hkCpuJobThreadPool.h>
@@ -93,8 +95,10 @@ private:
hkpExtendedMeshShape* ExtendedMeshShape;
std::vector<hkReal>* Vertices;
std::vector<hkUint16>* VertexIndices;
hkpMoppCode* Code;
hkpMoppBvTreeShape* MoppShape;
};
std::unordered_map<EntityID, ExtendedShapeData > m_hkpExtendedMeshShapes;
std::unordered_map<EntityID, ExtendedShapeData > m_ExtendedMeshShapes;
};
}
+1 -6
View File
@@ -1,8 +1,6 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 2013
VisualStudioVersion = 12.0.30110.0
MinimumVisualStudioVersion = 10.0.40219.1
# Visual Studio 2012
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Returngeance", "Returngeance\Returngeance.vcxproj", "{E8B4A2A2-882B-402A-98A7-8B4F7233C8B3}"
EndProject
Project("{F088123C-0E9E-452A-89E6-6BA2F21D5CAC}") = "ModelingProject1", "ModelingProject1\ModelingProject1.modelproj", "{B35F204C-3377-457E-AC9E-D9606F421191}"
@@ -41,7 +39,4 @@ Global
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(Performance) = preSolution
HasPerformanceSessions = true
EndGlobalSection
EndGlobal