void CDynamics2DDifferentialSteeringControl::SetWheelVelocity(Real f_left_wheel, Real f_right_wheel) { /* * THE DIFFERENTIAL STEERING SYSTEM * * check http://rossum.sourceforge.net/papers/DiffSteer/ * for details * * Equations: * * w = (Vr - Vl) / b * v = [ ((Vr + Vl) / 2) cos(a), * ((Vr + Vl) / 2) sin(a) ] * * where: * a = body orientation * w = body angular velocity * v = body center linear velocity * Vr = right wheel velocity * Vl = left wheel velocity * b = length of wheel axis */ SetAngularVelocity((f_right_wheel - f_left_wheel) / m_fInterwheelDistance); Real fVelocity = (f_right_wheel + f_left_wheel) * 0.5f; CVector2 cVelocity(fVelocity * ::cos(m_ptControlledBody->a), fVelocity * ::sin(m_ptControlledBody->a)); SetLinearVelocity(cVelocity); }
//Aボタンハンドラ void Player::OnPushA() { auto Ptr = GetComponent<Transform>(); if (Ptr->GetPosition().y > 0.125f) { return; } auto PtrPs = GetComponent<PsSphereBody>(); auto Velo = PtrPs->GetLinearVelocity(); Velo += Vec3(0, 4.0f, 0.0); PtrPs->SetLinearVelocity(Velo); }
//----------------------------------------------------------------------------- // SetLinearVelocity //----------------------------------------------------------------------------- void CPhysicObj::SetLinearVelocity (const NxVec3& vVelocity) { assert( m_bActivated ); int nNumParts = GetNumParts(); for (int i = 0; i < nNumParts; i++) { SetLinearVelocity (vVelocity, i); } }
bool csBulletRigidBody::Disable () { SetLinearVelocity (csVector3 (0.0f)); SetAngularVelocity (csVector3 (0.0f)); if (btBody) { btBody->setInterpolationWorldTransform (btBody->getWorldTransform()); btBody->setActivationState (ISLAND_SLEEPING); return true; } return false; }
void Pipe2::MakePipeBody(cocos2d::Layer *layer, b2World *world, cocos2d::Rect rect){ auto Pipe = Sprite::create("pipe.png", rect); Pipe->setPosition(rect.getMidX(),rect.getMidY()); layer->addChild(Pipe); //Pipe->setScale(0.5); b2BodyDef PipeBodyDef; PipeBodyDef.type = b2_kinematicBody; //gravitity is not for pipes PipeBodyDef.position.Set(rect.getMidX()/SCALE_RATIO, rect.getMidY()/SCALE_RATIO); PipeBodyDef.userData = Pipe; auto PipeBody = world->CreateBody(&PipeBodyDef); float a = Pipe->getContentSize().width;//*0.7; float b = Pipe->getContentSize().height;//*0.9; float sizeX = a/(2*SCALE_RATIO); float sizeY = b/(2*SCALE_RATIO); b2PolygonShape polygon; polygon.SetAsBox(sizeX, sizeY); //a 4x2 rectangle !!может округлять в большую сторону; ORIGINY слишком большой OrigiinX маленький( //polygon.SetAsBox(1, sizeY); b2FixtureDef PipeShapeDef; PipeShapeDef.shape = &polygon; PipeShapeDef.density = 0; PipeShapeDef.friction = 0; PipeShapeDef.restitution = 0; PipeBody->CreateFixture(&PipeShapeDef); PipeBody->SetLinearVelocity( b2Vec2(-3,0)); }
//更新 void Player::OnUpdate() { auto Vec = GetMoveVector(); auto PtrPs = GetComponent<PsSphereBody>(); auto Velo = PtrPs->GetLinearVelocity(); Velo.x = Vec.x * 5.0f; Velo.z = Vec.z * 5.0f; PtrPs->SetLinearVelocity(Velo); //コントローラの取得 auto CntlVec = App::GetApp()->GetInputDevice().GetControlerVec(); if (CntlVec[0].bConnected) { //Aボタン if (CntlVec[0].wPressedButtons & XINPUT_GAMEPAD_A) { OnPushA(); } //Xボタン else if (CntlVec[0].wPressedButtons & XINPUT_GAMEPAD_X) { OnPushX(); } } }
void RigidBody::AddBodyToWorld() { if (!physicsWorld_) return; URHO3D_PROFILE(AddBodyToWorld); if (mass_ < 0.0f) mass_ = 0.0f; if (body_) RemoveBodyFromWorld(); else { // Correct inertia will be calculated below btVector3 localInertia(0.0f, 0.0f, 0.0f); body_ = new btRigidBody(mass_, this, shiftedCompoundShape_, localInertia); body_->setUserPointer(this); // Check for existence of the SmoothedTransform component, which should be created by now in network client mode. // If it exists, subscribe to its change events smoothedTransform_ = GetComponent<SmoothedTransform>(); if (smoothedTransform_) { SubscribeToEvent(smoothedTransform_, E_TARGETPOSITION, URHO3D_HANDLER(RigidBody, HandleTargetPosition)); SubscribeToEvent(smoothedTransform_, E_TARGETROTATION, URHO3D_HANDLER(RigidBody, HandleTargetRotation)); } // Check if CollisionShapes already exist in the node and add them to the compound shape. // Do not update mass yet, but do it once all shapes have been added PODVector<CollisionShape*> shapes; node_->GetComponents<CollisionShape>(shapes); for (PODVector<CollisionShape*>::Iterator i = shapes.Begin(); i != shapes.End(); ++i) (*i)->NotifyRigidBody(false); // Check if this node contains Constraint components that were waiting for the rigid body to be created, and signal them // to create themselves now PODVector<Constraint*> constraints; node_->GetComponents<Constraint>(constraints); for (PODVector<Constraint*>::Iterator i = constraints.Begin(); i != constraints.End(); ++i) (*i)->CreateConstraint(); } UpdateMass(); UpdateGravity(); int flags = body_->getCollisionFlags(); if (trigger_) flags |= btCollisionObject::CF_NO_CONTACT_RESPONSE; else flags &= ~btCollisionObject::CF_NO_CONTACT_RESPONSE; if (kinematic_) flags |= btCollisionObject::CF_KINEMATIC_OBJECT; else flags &= ~btCollisionObject::CF_KINEMATIC_OBJECT; body_->setCollisionFlags(flags); body_->forceActivationState(kinematic_ ? DISABLE_DEACTIVATION : ISLAND_SLEEPING); if (!IsEnabledEffective()) return; btDiscreteDynamicsWorld* world = physicsWorld_->GetWorld(); world->addRigidBody(body_, (short)collisionLayer_, (short)collisionMask_); inWorld_ = true; readdBody_ = false; if (mass_ > 0.0f) Activate(); else { SetLinearVelocity(Vector3::ZERO); SetAngularVelocity(Vector3::ZERO); } }
void plPXPhysicalControllerCore::SetVelocities(const hsVector3& linearVel, float angVel) { SetLinearVelocity(linearVel); SetAngularVelocity(angVel); }
void CommandMoveLeft::update(float dt) { if (!_block) return; auto body1 = _block->getBody(); if (!body1) { stopBlock(); return; } auto body2 = _block->getAttachedBody(); if (!body2) { stopBlock(); return; } float32 offset = ConstantsRegistry::getValueForKey(ConstantsRegistry::constants::MOVEOFFSET); float32 blockSizeInMeters = _blockSize.width / ConstantsRegistry::getValueForKey(ConstantsRegistry::constants::SCALE_RATIO_BOX2D); if (body1->GetFixtureList()->GetFilterData().categoryBits == Block::blockFlags::PASSIVE || body2->GetFixtureList()->GetFilterData().categoryBits == Block::blockFlags::PASSIVE) stopBlock(); if (body1->GetFixtureList()->GetFilterData().categoryBits == Block::blockFlags::NEED_TO_STOP || body2->GetFixtureList()->GetFilterData().categoryBits == Block::blockFlags::NEED_TO_STOP) { Vec2 posOnField = _block->getPosOnField(); Sprite *sprite1 = (Sprite*)body1->GetUserData(); Sprite *sprite2 = (Sprite*)body2->GetUserData(); Size size = sprite1->getContentSize(); b2Filter filter; if (GameField::getBlock({ posOnField.x - 1, posOnField.y })){ stopBlock(); filter = body1->GetFixtureList()->GetFilterData(); filter.categoryBits = Block::blockFlags::ACTIVE; body1->GetFixtureList()->SetFilterData(filter); filter = body2->GetFixtureList()->GetFilterData(); filter.categoryBits = Block::blockFlags::ACTIVE; body2->GetFixtureList()->SetFilterData(filter); body1->SetTransform(_positionOldFirst, 0); body2->SetTransform(_positionOldSecond, 0); sprite1->setPosition({ (body1->GetPosition().x * ConstantsRegistry::getValueForKey(ConstantsRegistry::constants::SCALE_RATIO_BOX2D)) - size.width / 2 , (body1->GetPosition().y * ConstantsRegistry::getValueForKey(ConstantsRegistry::constants::SCALE_RATIO_BOX2D)) - size.height / 2 }); sprite2->setPosition({ (body2->GetPosition().x * ConstantsRegistry::getValueForKey(ConstantsRegistry::constants::SCALE_RATIO_BOX2D)) - size.width / 2 , (body2->GetPosition().y * ConstantsRegistry::getValueForKey(ConstantsRegistry::constants::SCALE_RATIO_BOX2D)) - size.height / 2 }); SimpleUI *simpleUI = MainGameScene::getUI(); UserInput *input = (UserInput*)simpleUI->getChildrenByName(UserInput::name()); input->dropInputEvents(); return; } if (!_isUndo) { body1->SetTransform({ _positionOldFirst.x - blockSizeInMeters, body1->GetPosition().y }, 0); body2->SetTransform({ _positionOldSecond.x - blockSizeInMeters, body2->GetPosition().y }, 0); } else { body1->SetTransform({ _positionOldFirst.x + blockSizeInMeters, body1->GetPosition().y }, 0); body2->SetTransform({ _positionOldSecond.x + blockSizeInMeters, body2->GetPosition().y }, 0); } sprite1->setPosition({ (body1->GetPosition().x * ConstantsRegistry::getValueForKey(ConstantsRegistry::constants::SCALE_RATIO_BOX2D)) - size.width / 2 , (body1->GetPosition().y * ConstantsRegistry::getValueForKey(ConstantsRegistry::constants::SCALE_RATIO_BOX2D)) - size.height / 2 }); sprite2->setPosition({ (body2->GetPosition().x * ConstantsRegistry::getValueForKey(ConstantsRegistry::constants::SCALE_RATIO_BOX2D)) - size.width / 2 , (body2->GetPosition().y * ConstantsRegistry::getValueForKey(ConstantsRegistry::constants::SCALE_RATIO_BOX2D)) - size.height / 2 }); stopBlock(); filter = body1->GetFixtureList()->GetFilterData(); filter.categoryBits ^= Block::blockFlags::NEED_TO_STOP; filter.categoryBits = Block::blockFlags::STOPPED; body1->GetFixtureList()->SetFilterData(filter); filter = body2->GetFixtureList()->GetFilterData(); filter.categoryBits ^= Block::blockFlags::NEED_TO_STOP; filter.categoryBits = Block::blockFlags::STOPPED; body2->GetFixtureList()->SetFilterData(filter); body1->SetActive(false); body1->SetActive(true); body2->SetActive(false); body2->SetActive(true); } if ((_positionOldFirst.x - body1->GetPosition().x) < blockSizeInMeters && !_isUndo && _isExecute) { if ((_positionOldFirst.x - (body1->GetPosition().x - offset)) >= blockSizeInMeters) { while (offset > 0) { offset -= ConstantsRegistry::getValueForKey(ConstantsRegistry::constants::MOVEOFFSET) / 100; if ((_positionOldFirst.x - (body1->GetPosition().x - offset)) < blockSizeInMeters) { stopBlock(); body1->SetTransform({ body1->GetPosition().x - offset, body1->GetPosition().y }, 0); body2->SetTransform({ body2->GetPosition().x - offset, body2->GetPosition().y }, 0); return; } } } CCASSERT(offset, "offset can't be 0"); if (body1->GetLinearVelocity().x > 0 && (_positionOldFirst.x - body1->GetPosition().x) < (blockSizeInMeters / 7)) { stopBlock(); body1->SetTransform(_positionOldFirst, 0); body2->SetTransform(_positionOldSecond, 0); return; } body1->SetLinearVelocity({ (float32)(body1->GetLinearVelocity().x - offset), body1->GetLinearVelocity().y }); body2->SetLinearVelocity({ (float32)(body2->GetLinearVelocity().x - offset), body2->GetLinearVelocity().y }); _positionOldFirst.y = body1->GetPosition().y; _positionOldSecond.y = body2->GetPosition().y; } else if ((body1->GetPosition().x - _positionOldFirst.x) < blockSizeInMeters && _isUndo && _isExecute) { if (((body1->GetPosition().x + offset) - _positionOldFirst.x) >= blockSizeInMeters) { while (offset > 0) { offset -= (ConstantsRegistry::getValueForKey(ConstantsRegistry::constants::MOVEOFFSET) / 100) * 10; if (((body1->GetPosition().x + offset) - _positionOldFirst.x) < blockSizeInMeters) { stopBlock(); body1->SetTransform({ body1->GetPosition().x + offset, body1->GetPosition().y }, 0); body2->SetTransform({ body2->GetPosition().x + offset, body2->GetPosition().y }, 0); return; } } } CCASSERT(offset, "offset can't be 0"); if (body1->GetLinearVelocity().x < 0 && (_positionOldFirst.x - body1->GetPosition().x) < (blockSizeInMeters / 7)) { stopBlock(); body1->SetTransform(_positionOldFirst, 0); body2->SetTransform(_positionOldSecond, 0); return; } body1->SetLinearVelocity({ (float32)(body1->GetLinearVelocity().x + offset), body1->GetLinearVelocity().y }); body2->SetLinearVelocity({ (float32)(body2->GetLinearVelocity().x + offset), body2->GetLinearVelocity().y }); _positionOldFirst.y = body1->GetPosition().y; _positionOldSecond.y = body2->GetPosition().y; } else stopBlock(); }
void ICreature::CastEigenToInduced() { SetLinearVelocity(LinearVelocity(ZERO, GetTotalLinVelocity())); SetAngularSpeed(AngularSpeed(ZERO, GetTotalAngSpeed())); }