int main(int argc, char* argv[]) { GetLog() << "Copyright (c) 2017 projectchrono.org\nChrono version: " << CHRONO_VERSION << "\n\n"; // Simulation and rendering time-step double time_step = 1e-4; double out_step = 0.02; // Create a ChronoENGINE physical system ChSystemSMC mphysicalSystem; mphysicalSystem.Set_G_acc(0.38 * mphysicalSystem.Get_G_acc()); // Create the Irrlicht visualization (open the Irrlicht device, // bind a simple user interface, etc. etc.) ChIrrApp application(&mphysicalSystem, L"SMC collision demo", core::dimension2d<u32>(800, 600), false, true); // Easy shortcuts to add camera, lights, logo and sky in Irrlicht scene: application.AddTypicalLogo(); application.AddTypicalSky(); application.AddTypicalLights(); application.AddTypicalCamera(core::vector3df(0, 18, -20)); // Add fixed and moving bodies AddContainer(application); AddFallingItems(application); // Complete asset specification: convert all assets to Irrlicht application.AssetBindAll(); application.AssetUpdateAll(); // The soft-real-time cycle double time = 0; double out_time = 0; while (application.GetDevice()->run()) { application.BeginScene(); application.DrawAll(); while (time < out_time) { mphysicalSystem.DoStepDynamics(time_step); time += time_step; } out_time += out_step; application.EndScene(); } return 0; }
int main(int argc, char* argv[]) { GetLog() << "Copyright (c) 2017 projectchrono.org\nChrono version: " << CHRONO_VERSION << "\n\n"; // Simulation parameters double gravity = -9.81; double time_step = 0.00001; double out_step = 2000 * time_step; // Parameters for the falling ball int ballId = 100; double radius = 1; double mass = 1000; ChVector<> pos(0, 2, 0); ChQuaternion<> rot(1, 0, 0, 0); ChVector<> init_vel(0, 0, 0); // Parameters for the containing bin int binId = 200; double width = 2; double length = 2; double height = 1; double thickness = 0.1; // Create the system ChSystemSMC msystem; // The following two lines are optional, since they are the default options. They are added for future reference, // i.e. when needed to change those models. msystem.SetContactForceModel(ChSystemSMC::ContactForceModel::Hertz); msystem.SetAdhesionForceModel(ChSystemSMC::AdhesionForceModel::Constant); msystem.Set_G_acc(ChVector<>(0, gravity, 0)); // Change the default collision effective radius of curvature collision::ChCollisionInfo::SetDefaultEffectiveCurvatureRadius(1); // Create the Irrlicht visualization ChIrrApp application(&msystem, L"SMC demo", core::dimension2d<u32>(800, 600), false, true); // Easy shortcuts to add camera, lights, logo and sky in Irrlicht scene application.AddTypicalLogo(); application.AddTypicalSky(); application.AddTypicalLights(); application.AddTypicalCamera(core::vector3df(0, 3, -6)); // This means that contactforces will be shown in Irrlicht application application.SetSymbolscale(1e-4); application.SetContactsDrawMode(ChIrrTools::eCh_ContactsDrawMode::CONTACT_FORCES); // Create a material (will be used by both objects) auto material = std::make_shared<ChMaterialSurfaceSMC>(); material->SetRestitution(0.1f); material->SetFriction(0.4f); material->SetAdhesion(0); // Magnitude of the adhesion in Constant adhesion model // Create the falling ball auto ball = std::make_shared<ChBody>(ChMaterialSurface::SMC); ball->SetIdentifier(ballId); ball->SetMass(mass); ball->SetPos(pos); ball->SetRot(rot); ball->SetPos_dt(init_vel); // ball->SetWvel_par(ChVector<>(0,0,3)); ball->SetBodyFixed(false); ball->SetMaterialSurface(material); ball->SetCollide(true); ball->GetCollisionModel()->ClearModel(); ball->GetCollisionModel()->AddSphere(radius); ball->GetCollisionModel()->BuildModel(); ball->SetInertiaXX(0.4 * mass * radius * radius * ChVector<>(1, 1, 1)); auto sphere = std::make_shared<ChSphereShape>(); sphere->GetSphereGeometry().rad = radius; ball->AddAsset(sphere); auto mtexture = std::make_shared<ChTexture>(); mtexture->SetTextureFilename(GetChronoDataFile("bluwhite.png")); ball->AddAsset(mtexture); msystem.AddBody(ball); // Create container auto bin = std::make_shared<ChBody>(ChMaterialSurface::SMC); bin->SetIdentifier(binId); bin->SetMass(1); bin->SetPos(ChVector<>(0, 0, 0)); bin->SetRot(ChQuaternion<>(1, 0, 0, 0)); bin->SetCollide(true); bin->SetBodyFixed(true); bin->SetMaterialSurface(material); bin->GetCollisionModel()->ClearModel(); AddWall(bin, ChVector<>(width, thickness, length), ChVector<>(0, 0, 0)); // AddWall(bin, ChVector<>(thickness, height, length), ChVector<>(-width + thickness, height, 0)); // AddWall(bin, ChVector<>(thickness, height, length), ChVector<>(width - thickness, height, 0)); // AddWall(bin, ChVector<>(width, height, thickness), ChVector<>(0, height, -length + thickness)); // AddWall(bin, ChVector<>(width, height, thickness), ChVector<>(0, height, length - thickness)); bin->GetCollisionModel()->BuildModel(); msystem.AddBody(bin); // Complete asset construction application.AssetBindAll(); application.AssetUpdateAll(); // The soft-real-time cycle double time = 0.0; double out_time = 0.0; while (application.GetDevice()->run()) { application.BeginScene(); application.DrawAll(); ChIrrTools::drawGrid(application.GetVideoDriver(), 0.2, 0.2, 20, 20, ChCoordsys<>(ChVector<>(0, 0, 0), Q_from_AngX(CH_C_PI_2)), video::SColor(255, 80, 100, 100), true); while (time < out_time) { msystem.DoStepDynamics(time_step); time += time_step; } out_time += out_step; application.EndScene(); } return 0; }