int main(int argc, char* argv[]) { GetLog() << "Copyright (c) 2017 projectchrono.org\nChrono version: " << CHRONO_VERSION << "\n\n"; // Create a ChronoENGINE physical system ChSystemNSC mphysicalSystem; // Create the Irrlicht visualization (open the Irrlicht device, // bind a simple user interface, etc. etc.) ChIrrApp application(&mphysicalSystem, L"Collisions between objects", core::dimension2d<u32>(800, 600), false); // Easy shortcuts to add camera, lights, logo and sky in Irrlicht scene: ChIrrWizard::add_typical_Logo(application.GetDevice()); ChIrrWizard::add_typical_Sky(application.GetDevice()); ChIrrWizard::add_typical_Lights(application.GetDevice()); ChIrrWizard::add_typical_Camera(application.GetDevice(), core::vector3df(0, 14, -20)); // Create all the rigid bodies. create_some_falling_items(mphysicalSystem, application.GetSceneManager(), application.GetVideoDriver()); // Use this function for adding a ChIrrNodeAsset to all items // Otherwise use application.AssetBind(myitem); on a per-item basis. application.AssetBindAll(); // Use this function for 'converting' assets into Irrlicht meshes application.AssetUpdateAll(); // Modify some setting of the physical system for the simulation, if you want mphysicalSystem.SetSolverType(ChSolver::Type::SOR); mphysicalSystem.SetMaxItersSolverSpeed(20); mphysicalSystem.SetMaxItersSolverStab(5); // mphysicalSystem.SetUseSleeping(true); application.SetStepManage(true); application.SetTimestep(0.02); // // THE SOFT-REAL-TIME CYCLE // while (application.GetDevice()->run()) { application.BeginScene(true, true, SColor(255, 140, 161, 192)); application.DrawAll(); application.DoStep(); application.EndScene(); } return 0; }
int main(int argc, char* argv[]) { GetLog() << "Copyright (c) 2017 projectchrono.org\nChrono version: " << CHRONO_VERSION << "\n\n"; // Create a ChronoENGINE physical system ChSystemNSC mphysicalSystem; // Create all the rigid bodies. create_some_falling_items(mphysicalSystem); // Modify some setting of the physical system for the simulation, if you want mphysicalSystem.SetSolverType(ChSolver::Type::SOR); mphysicalSystem.SetMaxItersSolverSpeed(20); // mphysicalSystem.SetMaxItersSolverStab(5); // Cohesion in a contact depends on the cohesion in the surface property of // the touching bodies, but the user can override this value when each contact is created, // by instancing a callback as in the following example: class MyContactCallback : public ChContactContainer::AddContactCallback { public: virtual void OnAddContact(const collision::ChCollisionInfo& contactinfo, ChMaterialComposite* const material) override { // Downcast to appropriate composite material type auto mat = static_cast<ChMaterialCompositeNSC* const>(material); // Set friction according to user setting: mat->static_friction = GLOBAL_friction; // Set compliance (normal and tangential at once) mat->compliance = GLOBAL_compliance; mat->complianceT = GLOBAL_compliance; mat->dampingf = GLOBAL_dampingf; // Set cohesion according to user setting: // Note that we must scale the cohesion force value by time step, because // the material 'cohesion' value has the dimension of an impulse. float my_cohesion_force = GLOBAL_cohesion; mat->cohesion = (float)msystem->GetStep() * my_cohesion_force; //<- all contacts will have this cohesion! if (contactinfo.distance > 0.12) mat->cohesion = 0; // Note that here you might decide to modify the cohesion // depending on object sizes, type, time, position, etc. etc. // For example, after some time disable cohesion at all, just // add here: // if (msystem->GetChTime() > 10) mat->cohesion = 0; }; ChSystemNSC* msystem; }; MyContactCallback mycontact_callback; // create the callback object mycontact_callback.msystem = &mphysicalSystem; // will be used by callback // Use the above callback to process each contact as it is created. mphysicalSystem.GetContactContainer()->RegisterAddContactCallback(&mycontact_callback); // // THE SOFT-REAL-TIME CYCLE // opengl::ChOpenGLWindow& gl_window = opengl::ChOpenGLWindow::getInstance(); gl_window.Initialize(1280, 720, "Demo_Cohesion_GL", &mphysicalSystem); gl_window.SetCamera(ChVector<>(0, 0, -10), ChVector<>(0, 0, 0), ChVector<>(0, 1, 0)); gl_window.Pause(); while (gl_window.Active()) { if (gl_window.DoStepDynamics(0.01)) { // Add code here that will only run after a step is taken } gl_window.Render(); } return 0; }
int main(int argc, char* argv[]) { GetLog() << "Copyright (c) 2017 projectchrono.org\nChrono version: " << CHRONO_VERSION << "\n\n"; // Create a ChronoENGINE physical system ChSystemNSC mphysicalSystem; // Create the Irrlicht visualization (open the Irrlicht device, // bind a simple user interface, etc. etc.) ChIrrApp application(&mphysicalSystem, L"Contacts with cohesion", core::dimension2d<u32>(800, 600), false); // Easy shortcuts to add camera, lights, logo and sky in Irrlicht scene: ChIrrWizard::add_typical_Logo(application.GetDevice()); ChIrrWizard::add_typical_Sky(application.GetDevice()); ChIrrWizard::add_typical_Lights(application.GetDevice()); ChIrrWizard::add_typical_Camera(application.GetDevice(), core::vector3df(0, 14, -20)); // Create all the rigid bodies. create_some_falling_items(mphysicalSystem); // Use this function for adding a ChIrrNodeAsset to all items // Otherwise use application.AssetBind(myitem); on a per-item basis. application.AssetBindAll(); // Use this function for 'converting' assets into Irrlicht meshes application.AssetUpdateAll(); // This is for GUI tweaking of system parameters.. MyEventReceiver receiver(&application); // note how to add the custom event receiver to the default interface: application.SetUserEventReceiver(&receiver); // Modify some setting of the physical system for the simulation, if you want mphysicalSystem.SetSolverType(ChSolver::Type::SOR_MULTITHREAD); mphysicalSystem.SetMaxItersSolverSpeed(20); // mphysicalSystem.SetMaxItersSolverStab(5); // Cohesion in a contact depends on the cohesion in the surface property of the // touching bodies, but the user can override this value when each contact is created, // by instancing a callback as in the following example: class MyContactCallback : public ChContactContainer::AddContactCallback { public: virtual void OnAddContact(const collision::ChCollisionInfo& contactinfo, ChMaterialComposite* const material) override { // Downcast to appropriate composite material type auto mat = static_cast<ChMaterialCompositeNSC* const>(material); // Set friction according to user setting: mat->static_friction = GLOBAL_friction; // Set compliance (normal and tangential at once) mat->compliance = GLOBAL_compliance; mat->complianceT = GLOBAL_compliance; mat->dampingf = GLOBAL_dampingf; // Set cohesion according to user setting: // Note that we must scale the cohesion force value by time step, because // the material 'cohesion' value has the dimension of an impulse. float my_cohesion_force = GLOBAL_cohesion; mat->cohesion = (float)msystem->GetStep() * my_cohesion_force; //<- all contacts will have this cohesion! if (contactinfo.distance > 0.12) mat->cohesion = 0; // Note that here you might decide to modify the cohesion // depending on object sizes, type, time, position, etc. etc. // For example, after some time disable cohesion at all, just // add here: // if (msystem->GetChTime() > 10) mat->cohesion = 0; }; ChSystemNSC* msystem; }; MyContactCallback mycontact_callback; // create the callback object mycontact_callback.msystem = &mphysicalSystem; // will be used by callback // Use the above callback to process each contact as it is created. mphysicalSystem.GetContactContainer()->RegisterAddContactCallback(&mycontact_callback); // // THE SOFT-REAL-TIME CYCLE // application.SetStepManage(true); application.SetTimestep(0.01); while (application.GetDevice()->run()) { application.BeginScene(true, true, SColor(255, 140, 161, 192)); application.DrawAll(); application.DoStep(); application.EndScene(); } return 0; }
int main(int argc, char* argv[]) { GetLog() << "Copyright (c) 2017 projectchrono.org\nChrono version: " << CHRONO_VERSION << "\n\n"; // Create a ChronoENGINE physical system ChSystemNSC mphysicalSystem; // Create the Irrlicht visualization (open the Irrlicht device, // bind a simple user interface, etc. etc.) ChIrrApp application(&mphysicalSystem, L"Bricks test", core::dimension2d<u32>(800, 600), false, true); // Easy shortcuts to add camera, lights, logo and sky in Irrlicht scene: ChIrrWizard::add_typical_Logo(application.GetDevice()); ChIrrWizard::add_typical_Sky(application.GetDevice()); ChIrrWizard::add_typical_Lights(application.GetDevice(), core::vector3df(70.f, 120.f, -90.f), core::vector3df(30.f, 80.f, 60.f), 290, 190); ChIrrWizard::add_typical_Camera(application.GetDevice(), core::vector3df(-15, 14, -30), core::vector3df(0, 5, 0)); // // HERE YOU POPULATE THE MECHANICAL SYSTEM OF CHRONO... // // Create all the rigid bodies. create_wall_bodies(mphysicalSystem); // create_jengatower_bodies (mphysicalSystem); // Use this function for adding a ChIrrNodeAsset to all items // If you need a finer control on which item really needs a visualization proxy in // Irrlicht, just use application.AssetBind(myitem); on a per-item basis. application.AssetBindAll(); // Use this function for 'converting' into Irrlicht meshes the assets // into Irrlicht-visualizable meshes application.AssetUpdateAll(); // Prepare the physical system for the simulation mphysicalSystem.SetSolverType(ChSolver::Type::SOR_MULTITHREAD); //mphysicalSystem.SetUseSleeping(true); mphysicalSystem.SetMaxPenetrationRecoverySpeed(1.6); // used by Anitescu stepper only mphysicalSystem.SetMaxItersSolverSpeed(40); mphysicalSystem.SetMaxItersSolverStab(20); // unuseful for Anitescu, only Tasora uses this mphysicalSystem.SetSolverWarmStarting(true); mphysicalSystem.SetParallelThreadNumber(4); // // THE SOFT-REAL-TIME CYCLE // application.SetStepManage(true); application.SetTimestep(0.02); while (application.GetDevice()->run()) { application.BeginScene(true, true, SColor(255, 140, 161, 192)); ChIrrTools::drawGrid(application.GetVideoDriver(), 5, 5, 20, 20, ChCoordsys<>(ChVector<>(0, 0.04, 0), Q_from_AngAxis(CH_C_PI / 2, VECT_X)), video::SColor(50, 90, 90, 150), true); application.DrawAll(); application.DoStep(); application.EndScene(); } return 0; }
int main(int argc, char* argv[]) { GetLog() << "Copyright (c) 2017 projectchrono.org\nChrono version: " << CHRONO_VERSION << "\n\n"; // Create a ChronoENGINE physical system ChSystemNSC mphysicalSystem; // ** user input double wheelMass = 5.0; // mass of wheel double suspMass = 10.0; // mass of suspended weight // Create the Irrlicht visualization (open the Irrlicht device, // bind a simple user interface, etc. etc.) ChIrrApp application(&mphysicalSystem, L"Soil bin demo", core::dimension2d<u32>(1024, 768), false); ChIrrWizard::add_typical_Logo(application.GetDevice()); ChIrrWizard::add_typical_Sky(application.GetDevice()); ChIrrWizard::add_typical_Lights(application.GetDevice(), irr::core::vector3df(20., 30., 25.), irr::core::vector3df(25., 25., -25.), 65.0, 75.); ChIrrWizard::add_typical_Camera(application.GetDevice(), core::vector3df(3.5f, 2.5f, -2.4f)); // ******* SOIL BIN WHEEL // Create the wheel ChVector<> wheelCMpos = ChVector<>(0, 0.5, 0); ChVector<> wheelInertia = ChVector<>(1.0, 1.0, 1.0); SoilbinWheel* mwheel = new SoilbinWheel(&mphysicalSystem, wheelCMpos, wheelMass, wheelInertia); // ***** TESTING MECHANISM // now, create the testing mechanism and attach the wheel to it double binWidth = 1.0; double binLen = 2.4; TestMech* mTestMechanism = new TestMech(&mphysicalSystem, mwheel->wheel, binWidth, binLen, suspMass, 2500., 10.); // ***** PARTICLE GENERATOR // make a particle generator, that the sceneManager can use to easily dump a bunch of dirt in the bin ParticleGenerator* mParticleGen = new ParticleGenerator(&application, &mphysicalSystem, binWidth, binLen); // Bind visualization assets. application.AssetBindAll(); application.AssetUpdateAll(); // ***** Create the User - GUI double torqueMax = 50.; MyEventReceiver receiver(&application, mwheel, mTestMechanism, mParticleGen, 0.02, 0.02, torqueMax); // add a custom event receiver to the default interface: application.SetUserEventReceiver(&receiver); // Set some integrator settings // mphysicalSystem.SetSolverType(ChSolver::Type::APGD); mphysicalSystem.SetSolverType(ChSolver::Type::SOR_MULTITHREAD); mphysicalSystem.SetMaxItersSolverSpeed(70); mphysicalSystem.SetMaxItersSolverStab(15); mphysicalSystem.SetParallelThreadNumber(4); // Use real-time step of the simulation, OR... application.SetStepManage(true); application.SetTimestep(0.01); application.SetTryRealtime(true); while (application.GetDevice()->run()) { application.BeginScene(true, true, SColor(255, 140, 161, 192)); application.DrawAll(); // draw the custom links receiver.drawSprings(); receiver.drawGrid(); // output relevant soil, wheel data if the tab is selected if (receiver.gad_tab_soil->isVisible()) receiver.drawSoilOutput(); if (receiver.gad_tab_wheel->isVisible()) receiver.drawWheelOutput(); receiver.drawWheelOutput(); // apply torque to the wheel mTestMechanism->applyTorque(); application.DoStep(); if (!application.GetPaused()) { // add bodies to the system? if (receiver.createParticles()) { receiver.genParticles(); } } application.EndScene(); } return 0; }