void MainApplication::initScene() { m_components.clear(); m_debugComponents.clear(); g_world = SoftBodyWorld(); g_body = 0; // Create wood material Material * woodMaterial = new Material(Shader::find("shader")); woodMaterial->setTexture(new Texture("resources/wood.bmp")); // Load bowl model MeshObject * bowl = new MeshObject(MeshFactory::FromFile("resources/bowl.ply"), woodMaterial); bowl->transform().translate(glm::vec3(0.0f, 2.0f, 0.0f)); bowl->transform().update(); // Load low-poly model of bowl for collision detection Mesh * lowpoly = MeshFactory::FromFile("resources/bowl-low.ply"); MeshCollider * bowlCollider = new MeshCollider(bowl); bowlCollider->m_mesh = lowpoly; bowlCollider->m_bvh = BVH::constructFromMesh(lowpoly); CollisionDetector::instance()->addCollider(bowlCollider); m_components.push_back(bowl); // Create cloth material Material * clothMaterial = new Material(Shader::find("shader")); clothMaterial->setTexture(new Texture("resources/cloth.bmp")); clothMaterial->setDiffuseColor(glm::vec4(0.8f, 0.8f, 0.8f, 1.0f)); clothMaterial->setAmbientColor(glm::vec4(0.3f, 0.3f, 0.3f, 1.0f)); clothMaterial->setSpecularColor(glm::vec4(0.5f, 0.5f, 0.5f, 1.0f)); // Create cloth mesh with attached soft body information MeshObject * cloth = SoftBody::createCloth(clothMaterial, &g_world, &g_body); cloth->transform().translate(glm::vec3(-2.5f, 5.0f, -2.5f)); cloth->transform().update(); m_components.push_back(cloth); // Create material for apple Material * appleMaterial = new Material(Shader::find("shader")); appleMaterial->setDiffuseColor(glm::vec4(0.9f)); appleMaterial->setTexture(new Texture("resources/apple.bmp")); // Load apple model from file MeshObject * apple = new MeshObject(MeshFactory::FromFile("resources/apple.ply"), appleMaterial); apple->transform().translate(glm::vec3(0.0f, 3.0f, 10.0f)); apple->transform().scale(glm::vec3(0.5f)); // Create a mathematical sphere collider for the apple SphereCollider * sphereCollider = new SphereCollider(apple); CollisionDetector::instance()->addCollider(sphereCollider); m_components.push_back(apple); // Create animator that animates the apple KeyframeAnimator<glm::vec3> * anim = new KeyframeAnimator<glm::vec3>(apple, new LinearInterpolator<glm::vec3>, apple->transform().position()); anim->addKeyframe(0.0f, glm::vec3(0.0f, 3.0f, 10.0f)); anim->addKeyframe(20000.0f, glm::vec3(0.0f, 3.0f, -10.0f)); anim->addKeyframe(40000.0f, glm::vec3(0.0f, 3.0f, 10.0f)); m_ballAnimator = anim; // Create some debug spheres for the BVH int level = 0; while (true) { ComponentCollection components = addDrawDebug(bowlCollider, level); if (components.empty()) break; m_debugComponents[level] = components; level++; } }