Node* SceneReplication::CreateControllableObject() { ResourceCache* cache = GetSubsystem<ResourceCache>(); // Create the scene node & visual representation. This will be a replicated object Node* ballNode = scene_->CreateChild("Ball"); ballNode->SetPosition(Vector3(Random(40.0f) - 20.0f, 5.0f, Random(40.0f) - 20.0f)); ballNode->SetScale(0.5f); StaticModel* ballObject = ballNode->CreateComponent<StaticModel>(); ballObject->SetModel(cache->GetResource<Model>("Models/Sphere.mdl")); ballObject->SetMaterial(cache->GetResource<Material>("Materials/StoneSmall.xml")); // Create the physics components RigidBody* body = ballNode->CreateComponent<RigidBody>(); body->SetMass(1.0f); body->SetFriction(1.0f); // In addition to friction, use motion damping so that the ball can not accelerate limitlessly body->SetLinearDamping(0.5f); body->SetAngularDamping(0.5f); CollisionShape* shape = ballNode->CreateComponent<CollisionShape>(); shape->SetSphere(1.0f); // Create a random colored point light at the ball so that can see better where is going Light* light = ballNode->CreateComponent<Light>(); light->SetRange(3.0f); light->SetColor(Color(0.5f + (Rand() & 1) * 0.5f, 0.5f + (Rand() & 1) * 0.5f, 0.5f + (Rand() & 1) * 0.5f)); return ballNode; }
void CreateRagdoll::CreateRagdollBone(const String& boneName, ShapeType type, const Vector3& size, const Vector3& position, const Quaternion& rotation) { // Find the correct child scene node recursively Node* boneNode = node_->GetChild(boneName, true); if (!boneNode) { URHO3D_LOGWARNING("Could not find bone " + boneName + " for creating ragdoll physics components"); return; } RigidBody* body = boneNode->CreateComponent<RigidBody>(); // Set mass to make movable body->SetMass(1.0f); // Set damping parameters to smooth out the motion body->SetLinearDamping(0.05f); body->SetAngularDamping(0.85f); // Set rest thresholds to ensure the ragdoll rigid bodies come to rest to not consume CPU endlessly body->SetLinearRestThreshold(1.5f); body->SetAngularRestThreshold(2.5f); CollisionShape* shape = boneNode->CreateComponent<CollisionShape>(); // We use either a box or a capsule shape for all of the bones if (type == SHAPE_BOX) shape->SetBox(size, position, rotation); else shape->SetCapsule(size.x_, size.y_, position, rotation); }
void Vehicle::InitWheel(const String& name, const Vector3& offset, WeakPtr<Node>& wheelNode, unsigned& wheelNodeID) { ResourceCache* cache = GetSubsystem<ResourceCache>(); // Note: do not parent the wheel to the hull scene node. Instead create it on the root level and let the physics // constraint keep it together wheelNode = GetScene()->CreateChild(name); wheelNode->SetPosition(node_->LocalToWorld(offset)); wheelNode->SetRotation(node_->GetRotation() * (offset.x_ >= 0.0 ? Quaternion(0.0f, 0.0f, -90.0f) : Quaternion(0.0f, 0.0f, 90.0f))); wheelNode->SetScale(Vector3(0.8f, 0.5f, 0.8f)); // Remember the ID for serialization wheelNodeID = wheelNode->GetID(); StaticModel* wheelObject = wheelNode->CreateComponent<StaticModel>(); RigidBody* wheelBody = wheelNode->CreateComponent<RigidBody>(); CollisionShape* wheelShape = wheelNode->CreateComponent<CollisionShape>(); Constraint* wheelConstraint = wheelNode->CreateComponent<Constraint>(); wheelObject->SetModel(cache->GetResource<Model>("Models/Cylinder.mdl")); wheelObject->SetMaterial(cache->GetResource<Material>("Materials/Stone.xml")); wheelObject->SetCastShadows(true); wheelShape->SetSphere(1.0f); wheelBody->SetFriction(1.0f); wheelBody->SetMass(1.0f); wheelBody->SetLinearDamping(0.2f); // Some air resistance wheelBody->SetAngularDamping(0.75f); // Could also use rolling friction wheelBody->SetCollisionLayer(1); wheelConstraint->SetConstraintType(CONSTRAINT_HINGE); wheelConstraint->SetOtherBody(GetComponent<RigidBody>()); // Connect to the hull body wheelConstraint->SetWorldPosition(wheelNode->GetPosition()); // Set constraint's both ends at wheel's location wheelConstraint->SetAxis(Vector3::UP); // Wheel rotates around its local Y-axis wheelConstraint->SetOtherAxis(offset.x_ >= 0.0 ? Vector3::RIGHT : Vector3::LEFT); // Wheel's hull axis points either left or right wheelConstraint->SetLowLimit(Vector2(-180.0f, 0.0f)); // Let the wheel rotate freely around the axis wheelConstraint->SetHighLimit(Vector2(180.0f, 0.0f)); wheelConstraint->SetDisableCollision(true); // Let the wheel intersect the vehicle hull }