本文整理汇总了C++中Fvector::random_dir方法的典型用法代码示例。如果您正苦于以下问题:C++ Fvector::random_dir方法的具体用法?C++ Fvector::random_dir怎么用?C++ Fvector::random_dir使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Fvector
的用法示例。
在下文中一共展示了Fvector::random_dir方法的3个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Destroy
void CDestroyablePhysicsObject::Destroy()
{
VERIFY(!physics_world()->Processing());
const CGameObject *who_object = smart_cast<const CGameObject*>(FatalHit().initiator());
callback(GameObject::eDeath)(lua_game_object(),who_object ? who_object : 0);
CPHDestroyable::Destroy(ID(),"physic_destroyable_object");
if(m_destroy_sound._handle())
{
m_destroy_sound.play_at_pos(this,Position());
}
if(*m_destroy_particles)
{
//Fvector dir;dir.set(0,1,0);
Fmatrix m;m.identity();
/////////////////////////////////////////////////
m.j.set(0,1.f,0);
///////////////////////////////////////////////
Fvector hdir;hdir.set(CPHDestroyable::FatalHit().direction());
if(fsimilar(_abs(m.j.dotproduct(hdir)),1.f,EPS_L))
{
do {
hdir.random_dir();
} while(fsimilar(_abs(m.j.dotproduct(hdir)),1.f,EPS_L));
}
m.i.crossproduct(m.j,hdir);m.i.normalize();
m.k.crossproduct(m.i,m.j);
StartParticles(m_destroy_particles,m,ID());
}
SheduleRegister();
}
示例2:
void IGame_Level::OnFrame ( )
{
// Log ("- level:on-frame: ",u32(Device.dwFrame));
// if (_abs(Device.fTimeDelta)<EPS_S) return;
// Update all objects
VERIFY (bReady);
Objects.Update ( false );
pHUD->OnFrame ( );
// Ambience
if (Sounds_Random.size() && (Device.dwTimeGlobal > Sounds_Random_dwNextTime))
{
Sounds_Random_dwNextTime = Device.dwTimeGlobal + ::Random.randI (10000,20000);
Fvector pos;
pos.random_dir().normalize().mul(::Random.randF(30,100)).add (Device.vCameraPosition);
int id = ::Random.randI(Sounds_Random.size());
if (Sounds_Random_Enabled) {
Sounds_Random[id].play_at_pos (0,pos,0);
Sounds_Random[id].set_volume (1.f);
Sounds_Random[id].set_range (10,200);
}
}
}
示例3:
void CTeleWhirlwindObject:: raise (float step)
{
CPhysicsShell* p = get_object() ->PPhysicsShell();
if(!p||!p->isActive())
return;
else
{
p->SetAirResistance(0.f,0.f);
p->set_ApplyByGravity(TRUE);
}
u16 element_number = p ->get_ElementsNumber();
Fvector center = m_telekinesis ->Center();
CPhysicsElement* maxE=p->get_ElementByStoreOrder(0);
for(u16 element=0;element<element_number;++element)
{
float k=strength;//600.f;
float predict_v_eps=0.1f;
float mag_eps =.01f;
CPhysicsElement* E= p->get_ElementByStoreOrder(element);
if(maxE->getMass()<E->getMass()) maxE=E;
if (!E->isActive()) continue;
Fvector pos=E->mass_Center();
Fvector diff;
diff.sub(center,pos);
float mag=_sqrt(diff.x*diff.x+diff.z*diff.z);
Fvector lc;lc.set(center);
if(mag>1.f)
{
lc.y/=mag;
}
diff.sub(lc,pos);
mag=diff.magnitude();
float accel=k/mag/mag/mag;//*E->getMass()
Fvector dir;
if(mag<mag_eps)
{
accel=0.f;
//Fvector zer;zer.set(0,0,0);
//E->set_LinearVel(zer);
dir.random_dir();
}
else
{
dir.set(diff);dir.mul(1.f/mag);
}
Fvector vel;
E->get_LinearVel(vel);
float delta_v=accel*fixed_step;
Fvector delta_vel; delta_vel.set(dir);delta_vel.mul(delta_v);
Fvector predict_vel;predict_vel.add(vel,delta_vel);
Fvector delta_pos;delta_pos.set(predict_vel);delta_pos.mul(fixed_step);
Fvector predict_pos;predict_pos.add(pos,delta_pos);
Fvector predict_diff;predict_diff.sub(lc,predict_pos);
float predict_mag=predict_diff.magnitude();
float predict_v=predict_vel.magnitude();
Fvector force;force.set(dir);
if(predict_mag>mag && predict_vel.dotproduct(dir)>0.f && predict_v>predict_v_eps)
{
Fvector motion_dir;motion_dir.set(predict_vel);motion_dir.mul(1.f/predict_v);
float needed_d=diff.dotproduct(motion_dir);
Fvector needed_diff;needed_diff.set(motion_dir);needed_diff.mul(needed_d);
Fvector nearest_p;nearest_p.add(pos,needed_diff);//
Fvector needed_vel;needed_vel.set(needed_diff);needed_vel.mul(1.f/fixed_step);
force.sub(needed_vel,vel);
force.mul(E->getMass()/fixed_step);
}
else
{
force.mul(accel*E->getMass());
}
E->applyForce(force.x,force.y+get_object()->EffectiveGravity()*E->getMass(),force.z);
}
Fvector dist;dist.sub(center,maxE->mass_Center());
if(dist.magnitude()<m_telekinesis->keep_radius()&&b_destroyable)
{
p->setTorque(Fvector().set(0,0,0));
p->setForce(Fvector().set(0,0,0));
p->set_LinearVel(Fvector().set(0,0,0));
p->set_AngularVel(Fvector().set(0,0,0));
switch_state(TS_Keep);
}
}