Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Dec 14, 2008, 10:55:04 PM (16 years ago)
Author:
rgrieder
Message:

SpaceShip is now harmonising with Bullet as well. The attributes of the steering can be configured in the XML file. I recommend a very high angularDamping or otherwise it will get very tricky to steer the ship (however more realistic).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • code/branches/physics_merge/src/orxonox/objects/worldentities/pawns/SpaceShip.cc

    r2442 r2453  
    4747        RegisterObject(SpaceShip);
    4848
    49         this->zeroDegree_ = 0;
     49        this->primaryThrust_  = 100;
     50        this->auxilaryThrust_ =  30;
     51        this->rotationThrust_ =  10;
    5052
    51         this->maxSpeed_ = 0;
    52         this->maxSecondarySpeed_ = 0;
    53         this->maxRotation_ = 0;
    54         this->translationAcceleration_ = 0;
    55         this->rotationAcceleration_ = 0;
    56         this->translationDamping_ = 0;
    57 
    58         this->yawRotation_ = 0;
    59         this->pitchRotation_ = 0;
    60         this->rollRotation_ = 0;
     53        this->localLinearAcceleration_.setValue(0, 0, 0);
     54        this->localAngularAcceleration_.setValue(0, 0, 0);
    6155
    6256        this->bInvertYAxis_ = false;
    6357
    6458        this->setDestroyWhenPlayerLeft(true);
     59
     60        // SpaceShip is always a physical object per default
     61        // Be aware of this call: The collision type legality check will not reach derived classes!
     62        this->setCollisionType(WorldEntity::Dynamic);
    6563
    6664        this->setConfigValues();
     
    7674        SUPER(SpaceShip, XMLPort, xmlelement, mode);
    7775
    78         XMLPortParam(SpaceShip, "maxspeed",          setMaxSpeed,          getMaxSpeed,          xmlelement, mode);
    79         XMLPortParam(SpaceShip, "maxsecondaryspeed", setMaxSecondarySpeed, getMaxSecondarySpeed, xmlelement, mode);
    80         XMLPortParam(SpaceShip, "maxrotation",       setMaxRotation,       getMaxRotation,       xmlelement, mode);
    81         XMLPortParam(SpaceShip, "transacc",          setTransAcc,          getTransAcc,          xmlelement, mode);
    82         XMLPortParam(SpaceShip, "rotacc",            setRotAcc,            getRotAcc,            xmlelement, mode);
    83         XMLPortParam(SpaceShip, "transdamp",         setTransDamp,         getTransDamp,         xmlelement, mode);
    84 
    85         if (this->physicalBody_)
    86         {
    87             this->physicalBody_->setDamping(0.7, 0.3);
    88         }
     76        XMLPortParamVariable(SpaceShip, "primaryThrust",  primaryThrust_,  xmlelement, mode);
     77        XMLPortParamVariable(SpaceShip, "auxilaryThrust", auxilaryThrust_, xmlelement, mode);
     78        XMLPortParamVariable(SpaceShip, "rotationThrust", rotationThrust_, xmlelement, mode);
    8979    }
    9080
    9181    void SpaceShip::registerVariables()
    9282    {
    93         registerVariable(this->maxSpeed_,                variableDirection::toclient);
    94         registerVariable(this->maxSecondarySpeed_,       variableDirection::toclient);
    95         registerVariable(this->maxRotation_,             variableDirection::toclient);
    96         registerVariable(this->translationAcceleration_, variableDirection::toclient);
    97         registerVariable(this->rotationAcceleration_,    variableDirection::toclient);
    98         registerVariable(this->translationDamping_,      variableDirection::toclient);
     83        registerVariable(this->primaryThrust_,  variableDirection::toclient);
     84        registerVariable(this->auxilaryThrust_, variableDirection::toclient);
     85        registerVariable(this->rotationThrust_, variableDirection::toclient);
    9986    }
    10087
     
    10491    }
    10592
     93    bool SpaceShip::isCollisionTypeLegal(WorldEntity::CollisionType type) const
     94    {
     95        if (type != WorldEntity::Dynamic)
     96        {
     97            ThrowException(PhysicsViolation, "Cannot tell a SpaceShip not to be dynamic!");
     98            return false;
     99        }
     100        else
     101            return true;
     102    }
     103
    106104    void SpaceShip::tick(float dt)
    107105    {
    108106        SUPER(SpaceShip, tick, dt);
     107
     108        if (this->isLocallyControlled())
     109        {
     110            this->localLinearAcceleration_.setX(this->localLinearAcceleration_.x() * getMass() * this->auxilaryThrust_);
     111            this->localLinearAcceleration_.setY(this->localLinearAcceleration_.y() * getMass() * this->auxilaryThrust_);
     112            if (this->localLinearAcceleration_.z() > 0)
     113                this->localLinearAcceleration_.setZ(this->localLinearAcceleration_.z() * getMass() * this->auxilaryThrust_);
     114            else
     115                this->localLinearAcceleration_.setZ(this->localLinearAcceleration_.z() * getMass() * this->primaryThrust_);
     116            this->physicalBody_->applyCentralForce(physicalBody_->getWorldTransform().getBasis() * this->localLinearAcceleration_);
     117            this->localLinearAcceleration_.setValue(0, 0, 0);
     118
     119            this->localAngularAcceleration_ *= this->getLocalInertia() * this->rotationThrust_;
     120            this->physicalBody_->applyTorque(physicalBody_->getWorldTransform().getBasis() * this->localAngularAcceleration_);
     121            this->localAngularAcceleration_.setValue(0, 0, 0);
     122        }
    109123    }
    110124
    111125    void SpaceShip::moveFrontBack(const Vector2& value)
    112126    {
    113         assert(this->physicalBody_);
    114         this->physicalBody_->applyCentralForce(physicalBody_->getWorldTransform().getBasis() * btVector3(0.0f, 0.0f, -getMass() * value.x * 100));
     127        this->localLinearAcceleration_.setZ(this->localLinearAcceleration_.z() - value.x);
    115128    }
    116129
    117130    void SpaceShip::moveRightLeft(const Vector2& value)
    118131    {
    119         this->physicalBody_->applyCentralForce(physicalBody_->getWorldTransform().getBasis() * btVector3(getMass() * value.x * 100, 0.0f, 0.0f));
     132        this->localLinearAcceleration_.setX(this->localLinearAcceleration_.x() + value.x);
    120133    }
    121134
    122135    void SpaceShip::moveUpDown(const Vector2& value)
    123136    {
    124         this->physicalBody_->applyCentralForce(physicalBody_->getWorldTransform().getBasis() * btVector3(0.0f, getMass() * value.x * 100, 0.0f));
     137        this->localLinearAcceleration_.setY(this->localLinearAcceleration_.y() + value.x);
    125138    }
    126139
    127140    void SpaceShip::rotateYaw(const Vector2& value)
    128141    {
    129         this->physicalBody_->applyTorque(physicalBody_->getWorldTransform().getBasis() * btVector3(0.0f, 1 / this->physicalBody_->getInvInertiaDiagLocal().y() * value.y * orientationGain, 0.0f));
     142        this->localAngularAcceleration_.setY(this->localLinearAcceleration_.y() + value.x);
    130143    }
    131144
    132145    void SpaceShip::rotatePitch(const Vector2& value)
    133146    {
    134         this->physicalBody_->applyTorque(physicalBody_->getWorldTransform().getBasis() * btVector3(1 / this->physicalBody_->getInvInertiaDiagLocal().x() * value.y * orientationGain, 0.0f, 0.0f));
     147        this->localAngularAcceleration_.setX(this->localLinearAcceleration_.x() + value.x);
    135148    }
    136149
    137150    void SpaceShip::rotateRoll(const Vector2& value)
    138151    {
    139         this->physicalBody_->applyTorque(physicalBody_->getWorldTransform().getBasis() * btVector3(0.0f, 0.0f, -1 / this->physicalBody_->getInvInertiaDiagLocal().z() * value.y * orientationGain));
     152        this->localAngularAcceleration_.setZ(this->localLinearAcceleration_.z() - value.x);
    140153    }
    141154
Note: See TracChangeset for help on using the changeset viewer.