void Ship::Render(Graphics::Renderer *renderer, const Camera *camera, const vector3d &viewCoords, const matrix4x4d &viewTransform) { if (IsDead()) return; //angthrust negated, for some reason GetModel()->SetThrust(vector3f(m_thrusters), -vector3f(m_angThrusters)); matrix3x3f mt; matrix3x3dtof(viewTransform.Inverse().GetOrient(), mt); s_heatGradientParams.heatingMatrix = mt; s_heatGradientParams.heatingNormal = vector3f(GetVelocity().Normalized()); s_heatGradientParams.heatingAmount = Clamp(GetHullTemperature(),0.0,1.0); // This has to be done per-model with a shield and just before it's rendered const bool shieldsVisible = m_shieldCooldown > 0.01f && m_stats.shield_mass_left > (m_stats.shield_mass / 100.0f); GetShields()->SetEnabled(shieldsVisible); GetShields()->Update(m_shieldCooldown, 0.01f*GetPercentShields()); //strncpy(params.pText[0], GetLabel().c_str(), sizeof(params.pText)); RenderModel(renderer, camera, viewCoords, viewTransform); m_navLights->Render(renderer); renderer->GetStats().AddToStatCount(Graphics::Stats::STAT_SHIPS, 1); if (m_ecmRecharge > 0.0f) { // ECM effect: a cloud of particles for a sparkly effect vector3f v[100]; for (int i=0; i<100; i++) { const double r1 = Pi::rng.Double()-0.5; const double r2 = Pi::rng.Double()-0.5; const double r3 = Pi::rng.Double()-0.5; v[i] = vector3f(GetPhysRadius()*vector3d(r1, r2, r3).NormalizedSafe()); } Color c(128,128,255,255); float totalRechargeTime = GetECMRechargeTime(); if (totalRechargeTime >= 0.0f) { c.a = (m_ecmRecharge / totalRechargeTime) * 255; } SfxManager::ecmParticle->diffuse = c; matrix4x4f t; for (int i=0; i<12; i++) t[i] = float(viewTransform[i]); t[12] = viewCoords.x; t[13] = viewCoords.y; t[14] = viewCoords.z; t[15] = 1.0f; renderer->SetTransform(t); renderer->DrawPointSprites(100, v, SfxManager::additiveAlphaState, SfxManager::ecmParticle.get(), 50.f); } }
void Encoder::Update(const common::UpdateInfo &info) { msgs::Float64 pos_msg, vel_msg; if (stopped) { pos_msg.set_data(stop_value); pos_pub->Publish(pos_msg); vel_msg.set_data(0); vel_pub->Publish(vel_msg); } else { pos_msg.set_data(GetAngle() - zero); pos_pub->Publish(pos_msg); vel_msg.set_data(GetVelocity()); vel_pub->Publish(vel_msg); } }
int CprojectileIGC::Export(void* data) { if (data) { DataProjectileIGC* dataProjectile = (DataProjectileIGC*)data; dataProjectile->projectileTypeID = m_projectileType->GetObjectID(); dataProjectile->velocity = GetVelocity(); dataProjectile->forward = GetOrientation().GetForward(); } return sizeof(DataProjectileIGC); }
bool ODERigidObject::WriteState(File& f) const { //TODO: use body quaternion Vector3 w,v; const dReal* pos=dBodyGetPosition(bodyID); const dReal* q=dBodyGetQuaternion(bodyID); GetVelocity(w,v); if(!WriteArrayFile(f,pos,3)) return false; if(!WriteArrayFile(f,q,4)) return false; if(!WriteFile(f,w)) return false; if(!WriteFile(f,v)) return false; return true; }
Missile * Ship::SpawnMissile(ShipType::Id missile_type, int power) { if (GetFlightState() != FLYING) return 0; Missile *missile = new Missile(missile_type, this, power); missile->SetOrient(GetOrient()); missile->SetFrame(GetFrame()); // XXX DODGY! need to put it in a sensible location vector3d dir = -GetOrient().VectorZ(); missile->SetPosition(GetPosition()+50.0*dir); missile->SetVelocity(GetVelocity()); Pi::game->GetSpace()->AddBody(missile); return missile; }
bool Ship::OnCollision(Object *b, Uint32 flags, double relVel) { // hitting space station docking surfaces shouldn't do damage if (b->IsType(Object::SPACESTATION) && (flags & 0x10)) { return true; } // hitting cargo scoop surface shouldn't do damage int cargoscoop_cap = 0; Properties().Get("cargo_scoop_cap", cargoscoop_cap); if (cargoscoop_cap > 0 && b->IsType(Object::CARGOBODY) && !dynamic_cast<Body*>(b)->IsDead()) { LuaRef item = dynamic_cast<CargoBody*>(b)->GetCargoType(); if (LuaObject<Ship>::CallMethod<int>(this, "AddEquip", item) > 0) { // try to add it to the ship cargo. Pi::game->GetSpace()->KillBody(dynamic_cast<Body*>(b)); if (this->IsType(Object::PLAYER)) Pi::game->log->Add(stringf(Lang::CARGO_SCOOP_ACTIVE_1_TONNE_X_COLLECTED, formatarg("item", ScopedTable(item).CallMethod<std::string>("GetName")))); // XXX SfxManager::Add(this, TYPE_SCOOP); UpdateEquipStats(); return true; } if (this->IsType(Object::PLAYER)) Pi::game->log->Add(Lang::CARGO_SCOOP_ATTEMPTED); } if (b->IsType(Object::PLANET)) { // geoms still enabled when landed if (m_flightState != FLYING) return false; else { if (GetVelocity().Length() < MAX_LANDING_SPEED) { m_testLanded = true; return true; } } } if ( b->IsType(Object::CITYONPLANET) || b->IsType(Object::SHIP) || b->IsType(Object::PLAYER) || b->IsType(Object::SPACESTATION) || b->IsType(Object::PLANET) || b->IsType(Object::STAR) || b->IsType(Object::CARGOBODY)) { LuaEvent::Queue("onShipCollided", this, b->IsType(Object::CITYONPLANET) ? dynamic_cast<CityOnPlanet*>(b)->GetPlanet() : dynamic_cast<Body*>(b)); } return DynamicBody::OnCollision(b, flags, relVel); }
Missile * Ship::SpawnMissile(ShipType::Id missile_type, int power) { if (GetFlightState() != FLYING) return 0; Missile *missile = new Missile(missile_type, this, power); missile->SetOrient(GetOrient()); missile->SetFrame(GetFrame()); const vector3d pos = GetOrient() * vector3d(0, GetAabb().min.y - 10, GetAabb().min.z); const vector3d vel = -40.0 * GetOrient().VectorZ(); missile->SetPosition(GetPosition()+pos); missile->SetVelocity(GetVelocity()+vel); Pi::game->GetSpace()->AddBody(missile); return missile; }
//----------------------------------------------------------------------------- // Purpose: Plays the engine sound. //----------------------------------------------------------------------------- void CNPC_Houndeye::NPCThink(void) { if (m_pEnergyWave) { if (gpGlobals->curtime > m_flEndEnergyWaveTime) { UTIL_Remove(m_pEnergyWave); m_pEnergyWave = NULL; } } // ----------------------------------------------------- // Update collision group // While I'm running I'm allowed to penetrate // other houndeyes // ----------------------------------------------------- Vector vVelocity; GetVelocity( &vVelocity, NULL ); if (vVelocity.Length() > 10) { SetCollisionGroup( HL2COLLISION_GROUP_HOUNDEYE ); } else { // Don't go solid if resting in another houndeye trace_t tr; AI_TraceHull( GetAbsOrigin(), GetAbsOrigin() + Vector(0,0,1), GetHullMins(), GetHullMaxs(), MASK_NPCSOLID, this, COLLISION_GROUP_NONE, &tr ); if (!tr.startsolid) { SetCollisionGroup( COLLISION_GROUP_NONE ); } else { SetCollisionGroup( HL2COLLISION_GROUP_HOUNDEYE ); } } /* if (GetCollisionGroup() == HL2COLLISION_GROUP_HOUNDEYE) { NDebugOverlay::Box(GetAbsOrigin(), GetHullMins(), GetHullMaxs(), 0, 255, 0, 0, 0); } else { NDebugOverlay::Box(GetAbsOrigin(), GetHullMins(), GetHullMaxs(), 255, 0, 0, 0, 0); } */ BaseClass::NPCThink(); }
void Ship::TestLanded() { m_testLanded = false; if (m_launchLockTimeout > 0.0f) return; if (m_wheelState < 1.0f) return; if (GetFrame()->GetBodyFor()->IsType(Object::PLANET)) { double speed = GetVelocity().Length(); vector3d up = GetPosition().Normalized(); const double planetRadius = static_cast<Planet*>(GetFrame()->GetBodyFor())->GetTerrainHeight(up); if (speed < MAX_LANDING_SPEED) { // orient the damn thing right // Q: i'm totally lost. why is the inverse of the body rot matrix being used? // A: NFI. it just works this way matrix4x4d rot; GetRotMatrix(rot); matrix4x4d invRot = rot.InverseOf(); // check player is sortof sensibly oriented for landing const double dot = vector3d(invRot[1], invRot[5], invRot[9]).Normalized().Dot(up); if (dot > 0.99) { Aabb aabb; GetAabb(aabb); // position at zero altitude SetPosition(up * (planetRadius - aabb.min.y)); vector3d forward = rot * vector3d(0,0,1); vector3d other = up.Cross(forward).Normalized(); forward = other.Cross(up); rot = matrix4x4d::MakeRotMatrix(other, up, forward); rot = rot.InverseOf(); SetRotMatrix(rot); SetVelocity(vector3d(0, 0, 0)); SetAngVelocity(vector3d(0, 0, 0)); SetForce(vector3d(0, 0, 0)); SetTorque(vector3d(0, 0, 0)); // we don't use DynamicBody::Disable because that also disables the geom, and that must still get collisions DisableBodyOnly(); ClearThrusterState(); m_flightState = LANDED; Sound::PlaySfx("Rough_Landing", 1.0f, 1.0f, 0); Pi::luaOnShipLanded->Queue(this, GetFrame()->GetBodyFor()); } } } }
void Missile::StaticUpdate(const float timeStep) { // Note: direct call to AI->TimeStepUpdate if (m_curAICmd!=nullptr) m_curAICmd->TimeStepUpdate(); //Add smoke trails for missiles on thruster state static double s_timeAccum = 0.0; s_timeAccum += timeStep; if (!is_equal_exact(GetThrusterState().LengthSqr(), 0.0) && (s_timeAccum > 4 || 0.1*Pi::rng.Double() < timeStep)) { s_timeAccum = 0.0; const vector3d pos = GetOrient() * vector3d(0, 0 , 5); const float speed = std::min(10.0*GetVelocity().Length()*std::max(1.0,fabs(GetThrusterState().z)),100.0); SfxManager::AddThrustSmoke(this, speed, pos); } }
void FastProjectile::OnTrigger(tbc::PhysicsManager::BodyID trigger_id, ContextObject* other_object, tbc::PhysicsManager::BodyID body_id, const vec3& position, const vec3& normal) { (void)trigger_id; (void)body_id; (void)position; if (++tick_count_ < 10 && other_object->GetInstanceId() == GetOwnerInstanceId()) { // Disallow self-hit during the first few frames. return; } if (explosive_energy_) { ProjectileUtil::Detonate(this, &is_detonated_, launcher_, GetPosition(), GetVelocity(), normal, explosive_energy_, 0); } else { ProjectileUtil::OnBulletHit(this, &is_detonated_, launcher_, other_object); } }
void ADefyingGravityCharacter::UpdateAnimation() { const FVector PlayerVelocity = GetVelocity(); const float PlayerSpeed = PlayerVelocity.Size(); // Are we moving or standing still? UPaperFlipbook* DesiredAnimation = (PlayerSpeed > 0.0f) ? catWalkAnimation : idleCatAnimation; if (GetCharacterMovement()->IsFalling()) { DesiredAnimation = JumpCatAnimation; } if( GetSprite()->GetFlipbook() != DesiredAnimation ) { GetSprite()->SetFlipbook(DesiredAnimation); } }
int Smoke::Update() { D3DXVECTOR3 v = GetVelocity(); v.x *= 0.75f; if (v.y>0) v.y -= 0.125f; SetVelocity(v); if (iLifeTimer >= 50) vScale.x = vScale.y = (60-iLifeTimer)/10.f; else fAlpha = min(iLifeTimer/40.f, 1); if (iLifeTimer == 0) erase(); iLifeTimer -= 1; return GameObj::Update(); }
//Aボタンでジャンプする瞬間の処理 void Player::JumpMotion(){ auto PtrTrans = GetComponent<Transform>(); //重力 auto PtrGravity = GetComponent<Gravity>(); //ジャンプスタート Vector3 JumpVec(0.0f, 4.0f, 0); if (PtrTrans->GetParent()){ //親がいたら、アクションコンポーネントの移動アクションを探す //移動ボックスに乗っている場合、その慣性をジャンプに加算する auto ActionPtr = PtrTrans->GetParent()->GetComponent<Action>(false); if (ActionPtr){ JumpVec += ActionPtr->GetVelocity(); } } PtrGravity->StartJump(JumpVec); }
bool Enemy::DefaultBehavior() { auto PtrRigid = GetComponent<Rigidbody>(); auto Velo = PtrRigid->GetVelocity(); Velo *= 0.95f; PtrRigid->SetVelocity(Velo); auto MapPtr = m_CelMap.lock(); if (MapPtr) { auto PlayerPtr = GetStage()->GetSharedGameObject<Player>(L"Player"); auto PlayerPos = PlayerPtr->GetComponent<Transform>()->GetPosition(); CellIndex PlayerCell; if (MapPtr->FindCell(PlayerPos, PlayerCell)) { return false; } } return true; }
void DynamicBody::CalcExternalForce() { // gravity if (!GetFrame()) return; // no external force if not in a frame Body *body = GetFrame()->GetBody(); if (body && !body->IsType(Object::SPACESTATION)) { // they ought to have mass though... vector3d b1b2 = GetPosition(); double m1m2 = GetMass() * body->GetMass(); double invrsqr = 1.0 / b1b2.LengthSqr(); double force = G*m1m2 * invrsqr; m_externalForce = -b1b2 * sqrt(invrsqr) * force; } else m_externalForce = vector3d(0.0); m_gravityForce = m_externalForce; // atmospheric drag if (body && GetFrame()->IsRotFrame() && body->IsType(Object::PLANET)) { Planet *planet = static_cast<Planet*>(body); double dist = GetPosition().Length(); double speed = m_vel.Length(); double pressure, density; planet->GetAtmosphericState(dist, &pressure, &density); const double radius = GetClipRadius(); // bogus, preserving behaviour const double AREA = radius; // ^^^ yes that is as stupid as it looks const double DRAG_COEFF = 0.1; // 'smooth sphere' vector3d dragDir = -m_vel.NormalizedSafe(); vector3d fDrag = 0.5*density*speed*speed*AREA*DRAG_COEFF*dragDir; // make this a bit less daft at high time accel // only allow atmosForce to increase by .1g per frame vector3d f1g = m_atmosForce + dragDir * GetMass(); if (fDrag.LengthSqr() > f1g.LengthSqr()) m_atmosForce = f1g; else m_atmosForce = fDrag; m_externalForce += m_atmosForce; } else m_atmosForce = vector3d(0.0); // centrifugal and coriolis forces for rotating frames if (GetFrame()->IsRotFrame()) { vector3d angRot(0, GetFrame()->GetAngSpeed(), 0); m_externalForce -= m_mass * angRot.Cross(angRot.Cross(GetPosition())); // centrifugal m_externalForce -= 2 * m_mass * angRot.Cross(GetVelocity()); // coriolis } }
void Ship::GetServerUpdateMessage(ServerShipUpdate& message) const { const std::hash<std::string> player_hash_fn; message.ship_id = player_hash_fn(GetName()); Vector3f vec = GetPosition(); message.position[0] = vec[0]; message.position[1] = vec[1]; message.position[2] = vec[2]; vec = GetVelocity(); message.velocity[0] = vec[0]; message.velocity[1] = vec[1]; message.velocity[2] = vec[2]; message.orientation = fmodf(GetOrientation(), 360.0f); message.angularVelocity = GetAngularVelocity(); message.health = health; message.shield = shield; }
void APlayerCharacter::StartJump() { if (GetVelocity().Z == 0) { isJumpingGruntCheck = true; isJumpingGroundCheck = true; UPeterAnimInstance* PeterAnimInstance = Cast<UPeterAnimInstance>(GetMesh()->GetAnimInstance()); if (PeterAnimInstance) { PeterAnimInstance->bStartedJump = true; } Jump(); } }
void Ship::FireWeapon(int num) { if (m_flightState != FLYING) return; std::string prefix(num?"laser_rear_":"laser_front_"); int damage = 0; Properties().Get(prefix+"damage", damage); if (!damage) return; Properties().PushLuaTable(); LuaTable prop(Lua::manager->GetLuaState(), -1); const matrix3x3d &m = GetOrient(); const vector3d dir = m * vector3d(m_gun[num].dir); const vector3d pos = m * vector3d(m_gun[num].pos) + GetPosition(); m_gun[num].temperature += 0.01f; m_gun[num].recharge = prop.Get<float>(prefix+"rechargeTime"); const vector3d baseVel = GetVelocity(); const vector3d dirVel = prop.Get<float>(prefix+"speed") * dir.Normalized(); const Color c(prop.Get<float>(prefix+"rgba_r"), prop.Get<float>(prefix+"rgba_g"), prop.Get<float>(prefix+"rgba_b"), prop.Get<float>(prefix+"rgba_a")); const float lifespan = prop.Get<float>(prefix+"lifespan"); const float width = prop.Get<float>(prefix+"width"); const float length = prop.Get<float>(prefix+"length"); const bool mining = prop.Get<int>(prefix+"mining"); if (prop.Get<int>(prefix+"dual")) { const vector3d orient_norm = m.VectorY(); const vector3d sep = 5.0 * dir.Cross(orient_norm).NormalizedSafe(); Projectile::Add(this, lifespan, damage, length, width, mining, c, pos + sep, baseVel, dirVel); Projectile::Add(this, lifespan, damage, length, width, mining, c, pos - sep, baseVel, dirVel); } else { Projectile::Add(this, lifespan, damage, length, width, mining, c, pos, baseVel, dirVel); } Sound::BodyMakeNoise(this, "Pulse_Laser", 1.0f); lua_pop(prop.GetLua(), 1); LuaEvent::Queue("onShipFiring", this); }
bool Ship::OnCollision(Object *b, Uint32 flags, double relVel) { // hitting space station docking surfaces shouldn't do damage if (b->IsType(Object::SPACESTATION) && (flags & 0x10)) { return true; } // hitting cargo scoop surface shouldn't do damage if ((m_equipment.Get(Equip::SLOT_CARGOSCOOP) != Equip::NONE) && b->IsType(Object::CARGOBODY) && m_stats.free_capacity) { Equip::Type item = dynamic_cast<CargoBody*>(b)->GetCargoType(); Pi::game->GetSpace()->KillBody(dynamic_cast<Body*>(b)); m_equipment.Add(item); UpdateEquipStats(); if (this->IsType(Object::PLAYER)) Pi::Message(stringf(Lang::CARGO_SCOOP_ACTIVE_1_TONNE_X_COLLECTED, formatarg("item", Equip::types[item].name))); // XXX Sfx::Add(this, Sfx::TYPE_SCOOP); return true; } if (b->IsType(Object::PLANET)) { // geoms still enabled when landed if (m_flightState != FLYING) return false; else { if (GetVelocity().Length() < MAX_LANDING_SPEED) { m_testLanded = true; return true; } } } if ( b->IsType(Object::CITYONPLANET) || b->IsType(Object::SHIP) || b->IsType(Object::PLAYER) || b->IsType(Object::SPACESTATION) || b->IsType(Object::PLANET) || b->IsType(Object::STAR) || b->IsType(Object::CARGOBODY)) { LuaEvent::Queue("onShipCollided", this, b->IsType(Object::CITYONPLANET) ? dynamic_cast<CityOnPlanet*>(b)->GetPlanet() : dynamic_cast<Body*>(b)); } return DynamicBody::OnCollision(b, flags, relVel); }
Motion Touch::GetMotion() const { if (_timestamp - _sampler.time() > 0.15) return Motion::Stationary; float speed = glm::length(GetVelocity(_timestamp)); if (speed > 50) return Motion::Moving; if (_timestamp - _timestart < 0.2) return Motion::Unknown; if (speed < 1) return Motion::Stationary; return Motion::Unknown; }
bool RigidBody::ApplyQueuedImpulses() { if(HasInfiniteMass()) return false; bool significant = (m_queuedDeltaVelocity.squaredLength() > 1e-8 || m_queuedDeltaAngularVelocity.squaredLength() > 1e-8); if(significant) { SetVelocity(GetVelocity() + m_queuedDeltaVelocity); SetAngularVelocity(GetAngularVelocity() + m_queuedDeltaAngularVelocity); } m_queuedDeltaVelocity = Vector3::ZERO; m_queuedDeltaAngularVelocity = Vector3::ZERO; return significant; }
void ASimonSaysCharacter::UpdateCharacter() { UpdateAnimation(); const FVector playerVelocity = GetVelocity(); float travelDirection = playerVelocity.X; if (Controller != nullptr) { if (travelDirection < 0.0f) { Controller->SetControlRotation(FRotator(0.0, 180.0f, 0.0f)); } else if (travelDirection > 0.0f) { Controller->SetControlRotation(FRotator(0.0f, 0.0f, 0.0f)); } } }
void Ship::FireWeapon(int num) { const ShipType &stype = GetShipType(); if (m_flightState != FLYING) return; const matrix3x3d &m = GetOrient(); const vector3d dir = m * vector3d(stype.gunMount[num].dir); const vector3d pos = m * vector3d(stype.gunMount[num].pos) + GetPosition(); m_gunTemperature[num] += 0.01f; Equip::Type t = m_equipment.Get(Equip::SLOT_LASER, num); const LaserType < = Equip::lasers[Equip::types[t].tableIndex]; m_gunRecharge[num] = lt.rechargeTime; vector3d baseVel = GetVelocity(); vector3d dirVel = lt.speed * dir.Normalized(); if (lt.flags & Equip::LASER_DUAL) { const ShipType::DualLaserOrientation orient = stype.gunMount[num].orient; const vector3d orient_norm = (orient == ShipType::DUAL_LASERS_VERTICAL) ? m.VectorX() : m.VectorY(); const vector3d sep = stype.gunMount[num].sep * dir.Cross(orient_norm).NormalizedSafe(); Projectile::Add(this, t, pos + sep, baseVel, dirVel); Projectile::Add(this, t, pos - sep, baseVel, dirVel); } else Projectile::Add(this, t, pos, baseVel, dirVel); /* // trace laser beam through frame to see who it hits CollisionContact c; GetFrame()->GetCollisionSpace()->TraceRay(pos, dir, 10000.0, &c, this->GetGeom()); if (c.userData1) { Body *hit = static_cast<Body*>(c.userData1); hit->OnDamage(this, damage); } */ Polit::NotifyOfCrime(this, Polit::CRIME_WEAPON_DISCHARGE); Sound::BodyMakeNoise(this, "Pulse_Laser", 1.0f); }
bool ODERigidObject::WriteState(File& f) const { //TODO: use body quaternion Vector3 w,v; const dReal* pos=dBodyGetPosition(bodyID); const dReal* q=dBodyGetQuaternion(bodyID); GetVelocity(w,v); //do we need this? const dReal* frc=dBodyGetForce(bodyID); const dReal* trq=dBodyGetTorque(bodyID); if(!WriteArrayFile(f,pos,3)) return false; if(!WriteArrayFile(f,q,4)) return false; if(!WriteFile(f,w)) return false; if(!WriteFile(f,v)) return false; if(!WriteArrayFile(f,frc,3)) return false; if(!WriteArrayFile(f,trq,3)) return false; return true; }
bool AxisPhysicsMSDModel::IsFinished(double aSmallestVisibleIncrement) { // In order to satisfy the condition of reaching the destination, the distance // between the simulation position and the destination must be less than // aSmallestVisibleIncrement while the speed is simultaneously less than // finishVelocity. This enables an under-damped system to overshoot the // destination when desired without prematurely triggering the finished state. // If finishVelocity is set too low, the animation may end long after // oscillation has finished, resulting in unnecessary processing. // If set too high, the animation may prematurely terminate when expected // to overshoot the destination in an under-damped system. // aSmallestVisibleIncrement * 2 was selected through experimentation that // revealed that a critically damped system will terminate within 100ms. const double finishVelocity = aSmallestVisibleIncrement * 2; return fabs(mDestination - GetPosition ()) < aSmallestVisibleIncrement && fabs(GetVelocity()) <= finishVelocity; }
void Ship::FireWeapon(int num) { const ShipType &stype = GetShipType(); if (m_flightState != FLYING) return; matrix4x4d m; GetRotMatrix(m); vector3d dir = vector3d(stype.gunMount[num].dir); vector3d pos = vector3d(stype.gunMount[num].pos); m_gunTemperature[num] += 0.01f; dir = m.ApplyRotationOnly(dir); pos = m.ApplyRotationOnly(pos); pos += GetPosition(); Equip::Type t = m_equipment.Get(Equip::SLOT_LASER, num); const LaserType < = Equip::lasers[Equip::types[t].tableIndex]; m_gunRecharge[num] = lt.rechargeTime; vector3d baseVel = GetVelocity(); vector3d dirVel = lt.speed * dir.Normalized(); if (lt.flags & Equip::LASER_DUAL) { vector3d sep = dir.Cross(vector3d(m[4],m[5],m[6])).Normalized(); Projectile::Add(this, t, pos+5.0*sep, baseVel, dirVel); Projectile::Add(this, t, pos-5.0*sep, baseVel, dirVel); } else Projectile::Add(this, t, pos, baseVel, dirVel); /* // trace laser beam through frame to see who it hits CollisionContact c; GetFrame()->GetCollisionSpace()->TraceRay(pos, dir, 10000.0, &c, this->GetGeom()); if (c.userData1) { Body *hit = static_cast<Body*>(c.userData1); hit->OnDamage(this, damage); } */ Polit::NotifyOfCrime(this, Polit::CRIME_WEAPON_DISCHARGE); Sound::BodyMakeNoise(this, "Pulse_Laser", 1.0f); }
void Ship::AIAccelToModelRelativeVelocity(const vector3d v) { // OK. For rotating frames linked to space stations we want to set // speed relative to non-rotating frame (so we apply Frame::GetStasisVelocityAtPosition. // For rotating frames linked to planets we want to set velocity relative to // surface, so we do not apply Frame::GetStasisVelocityAtPosition vector3d relVel = GetVelocity(); if (GetFrame()->IsStationRotFrame()) { relVel -= GetFrame()->GetStasisVelocityAtPosition(GetPosition()); } matrix4x4d m; GetRotMatrix(m); vector3d difVel = v - (relVel * m); // required change in velocity vector3d maxThrust = GetMaxThrust(difVel); vector3d maxFrameAccel = maxThrust * Pi::GetTimeStep() / GetMass(); SetThrusterState(0, difVel.x / maxFrameAccel.x); SetThrusterState(1, difVel.y / maxFrameAccel.y); SetThrusterState(2, difVel.z / maxFrameAccel.z); // use clamping }
//モーションを実装する関数群 //移動して向きを移動方向にする void Player::MoveRotationMotion(){ float ElapsedTime = App::GetApp()->GetElapsedTime(); Vector3 Angle = GetAngle(); //Transform auto PtrTransform = GetComponent<Transform>(); //Rigidbodyを取り出す auto PtrRedit = GetComponent<Rigidbody>(); //現在の速度を取り出す auto Velo = PtrRedit->GetVelocity(); //目的地を最高速度を掛けて求める auto Target = Angle * m_MaxSpeed; //目的地に向かうために力のかける方向を計算する //Forceはフォースである auto Force = Target - Velo; //yは0にする Force.y = 0; //加速度を求める auto Accel = Force / m_Mass; //ターン時間を掛けたものを速度に加算する Velo += (Accel * ElapsedTime); //減速する Velo *= m_Decel; //速度を設定する PtrRedit->SetVelocity(Velo); //回転の計算 float YRot = PtrTransform->GetRotation().y; Quaternion Qt; Qt.Identity(); if (Angle.Length() > 0.0f){ //ベクトルをY軸回転に変換 float PlayerAngle = atan2(Angle.x, Angle.z); Qt.RotationRollPitchYaw(0, PlayerAngle, 0); Qt.Normalize(); } else{ Qt.RotationRollPitchYaw(0, YRot, 0); Qt.Normalize(); } //Transform PtrTransform->SetQuaternion(Qt); }
void AGameJamGameCharacter::UpdateCharacter() { // Update animation to match the motion UpdateAnimation(); // Now setup the rotation of the controller based on the direction we are travelling const FVector PlayerVelocity = GetVelocity(); float TravelDirection = PlayerVelocity.X; // Set the rotation so that the character faces his direction of travel. if (Controller != nullptr) { if (TravelDirection < 0.0f) { Controller->SetControlRotation(FRotator(0.0, 180.0f, 0.0f)); } else if (TravelDirection > 0.0f) { Controller->SetControlRotation(FRotator(0.0f, 0.0f, 0.0f)); } } }