Неплохо бы увидеть пример "поплавка".
|
делал поплавки, работающие с анимированными волнами. долго вспоминать что в коде к чему, попробуй сам разобраться.
а ну ещё я это делал для лодочек... так что код может немного отличаться от обычных поплавков.

void kepref::UpdateOceanKeps()
{
float3 pos,force,torque,keppos,antiforce,antiangforce;
float fy,kepbuo,keplindamp,watery,zmult;
float kepradius=0.0f;
float kepmaxdist=4.0f;
float kepangdamp=60.0f;
float waterdepth=100.0f;
for (kepref *kr = kepref::First; kr; kr=kr->Next)
{
//xLinePick3(xEntityPos(kr->piv)+float3(0,100,0),xEntityPos(kr->piv)+float3(0,-100,0));
//pos=xPicked3();
// cout << "!1";
if (kr->body->_body==0) return;
pos=float3(0,Ocean::Pick3(xEntityPos(kr->piv,true))-0.2 ,0);
keppos=xEntityPos(kr->piv,1);
fy=abs(kr->body->GetLocalLinearSpeed().y)*0.5f; // ?? ????? ?? ????? ?????? ?? ????? undefined type!
if (fy<1) fy=1.0f;
if (kr->flood==false) {
kepbuo=kr->orig->buo/15.0f;
keplindamp=kr->orig->lindamp;
} else {
kepbuo=kr->orig->buo/50.0f;
keplindamp=kr->orig->lindamp;
}
watery=pos.y;
xPositionEntity(kr->tmp,keppos.x,pos.y,keppos.z);
// cout << "!2";
if ((keppos.y<(watery-1.5f))&&(kr->flood==false)) kr->MakeDrops(keppos);
// cout << "!3";
force=float3(0,0,0);
torque=float3(0,0,0);
if ((keppos.y <= (watery + kepradius)) && (keppos.y >= (watery - waterdepth))) {
antiforce=kr->body->GetLocalLinearSpeed();
antiangforce=kr->body->GetLocalAngularSpeed();
if (keppos.y >= (watery - kepmaxdist + kepradius)) {
force.y = (watery - keppos.y + kepradius)*kepbuo/kepmaxdist;
}
if (keppos.y < (watery - kepmaxdist + kepradius)) {
force.y = kepbuo;
}
zmult=0.25f;
if (abs(antiforce.z)<1) zmult=1.0f;
force.x -= antiforce.x*keplindamp*10.0f;
force.y -= antiforce.y*(keplindamp/fy);
force.z -= antiforce.z*zmult;
torque.x = -antiangforce.x*kepangdamp*2.0f;
torque.y = -antiangforce.y* (10.0f/(abs(antiforce.z)+1.0f));
torque.z = -antiangforce.z*12.5f;
}
//cout << "!4";
kr->body->AddLocalForceAtPos(force,keppos,0);
kr->body->AddLocalTorque(torque,0);
//cout << "!5";
}
}