Показать сообщение отдельно
Старый 11.11.2010, 16:35   #11
Mr_F_
Терабайт исходников
 
Аватар для Mr_F_
 
Регистрация: 13.09.2008
Сообщений: 3,947
Написано 2,189 полезных сообщений
(для 6,051 пользователей)
Ответ: Плавучие объекты

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

	}
}
(Offline)
 
Ответить с цитированием