2#include "BodyEnvironment.hpp"
4#include "RigidBody.hpp"
5#include "Launchbar.hpp"
9 static const float YASIM_PI2 = 3.14159265358979323846f/2;
12 static const float RAD2DEG = 180/
YASIM_PI;
13 static const float YASIM_PI = 3.14159265358979323846f;
20 _launchbar_mount[
i] = _holdback_mount[
i] = _launchbar_force[
i]
21 = _holdback_force[
i] = 0;
23 _global_ground[
i] = 0;
24 _global_ground[2] = 1;
25 _global_ground[3] = -1e5;
27 _holdback_length = 2.0;
40void Launchbar::setLaunchbarMount(
float* position)
43 for(
i=0;
i<3;
i++) _launchbar_mount[
i] = position[
i];
46void Launchbar::setHoldbackMount(
float* position)
49 for(
i=0;
i<3;
i++) _holdback_mount[
i] = position[
i];
52void Launchbar::setLength(
float length)
57 void Launchbar::setHoldbackLength(
float length)
59 _holdback_length = length;
62void Launchbar::setDownAngle(
float ang)
67void Launchbar::setUpAngle(
float ang)
72void Launchbar::setExtension(
float extension)
74 _extension = extension;
77void Launchbar::setLaunchCmd(
bool cmd)
82void Launchbar::setAcceleration(
float acceleration)
84 _acceleration = acceleration;
87void Launchbar::setGlobalGround(
double *global_ground)
90 for(
i=0;
i<4;
i++) _global_ground[
i] = global_ground[
i];
93void Launchbar::getLaunchbarMount(
float* out)
96 for(
i=0;
i<3;
i++) out[
i] = _launchbar_mount[
i];
99 float Launchbar::getLaunchbarPos(
int i)
101 return _launchbar_mount[
i];
104void Launchbar::getHoldbackMount(
float* out)
107 for(
i=0;
i<3;
i++) out[
i] = _holdback_mount[
i];
110 float Launchbar::getHoldbackPos(
int j)
112 return _holdback_mount[j];
115 float Launchbar::getHoldbackLength(
void)
117 return _holdback_length;
120float Launchbar::getLength(
void)
125float Launchbar::getDownAngle(
void)
130float Launchbar::getUpAngle(
void)
135 float Launchbar::getAngle(
void)
140 float Launchbar::getHoldbackAngle(
void)
144float Launchbar::getExtension(
void)
149 void Launchbar::getForce(
float* force1,
float* off1,
150 float* force2,
float* off2)
152 Math::set3(_launchbar_force, force1);
153 Math::set3(_launchbar_mount, off1);
154 Math::set3(_holdback_force, force2);
155 Math::set3(_holdback_mount, off2);
158 const char* Launchbar::getState(
void)
172 bool Launchbar::getStrop(
void)
177float Launchbar::getCompressFraction()
182 float Launchbar::getHoldbackCompressFraction()
187void Launchbar::getTipPosition(
float* out)
191 _ang = _frac*(_down_ang - _up_ang ) + _up_ang ;
192 float ptip[3] = { _length*Math::cos(_ang), 0, -_length*Math::sin(_ang) };
193 Math::add3(_launchbar_mount, ptip, out);
196 float Launchbar::getTipPos(
int i)
199 getTipPosition(pos_tip);
203 void Launchbar::getHoldbackTipPosition(
float* out)
206 _h_ang = _h_frac*(_down_ang - _up_ang) + _up_ang;
207 float htip[3] = { -_length*Math::cos(_h_ang), 0, -_length*Math::sin(_h_ang) };
208 Math::add3(_holdback_mount, htip, out);
211 float Launchbar::getHoldbackTipPos(
int i)
214 getHoldbackTipPosition(pos_tip);
219void Launchbar::getTipGlobalPosition(State* s,
double* out)
223 getTipPosition(pos_tip);
225 s->posLocalToGlobal(pos_tip, out);
228float Launchbar::getPercentPosOnCat(
float* lpos,
float off,
float lends[2][3])
232 Math::sub3(lends[1], lends[0], lforward);
234 Math::sub3(lpos, lends[0], ltopos);
235 float fwlen = Math::mag3(lforward);
237 return (Math::dot3(ltopos, lforward)/fwlen + off)/fwlen;
240void Launchbar::getPosOnCat(
float perc,
float* lpos,
float* lvel,
241 float lends[2][3],
float lendvels[2][3])
250 Math::sub3(lends[1], lends[0], lforward);
251 Math::mul3(perc, lforward, lpos);
252 Math::add3(lends[0], lpos, lpos);
255 Math::mul3(perc, lendvels[0], lvel);
256 Math::mul3(1.0f-perc, lendvels[1], tmp);
257 Math::add3(tmp, lvel, lvel);
260void Launchbar::calcForce(Ground *g_cb, RigidBody* body, State* s,
float* lv,
float* lrot)
264 for(
i=0;
i<3;
i++) _launchbar_force[
i] = 0;
265 for(
i=0;
i<3;
i++) _holdback_force[
i] = 0;
267 if (_state != Unmounted)
276 _frac = _h_frac = _extension;
280 s->planeGlobalToLocal(_global_ground, ground);
284 getTipPosition(ltip);
290 float tipdist = ground[3] - Math::dot3(ltip, ground);
296 float mountdist = ground[3] - Math::dot3(_launchbar_mount, ground);
302 float mountdist_xz = _length;
303 if (ground[2] != 0) {
304 float nrm_yz = Math::sqrt(ground[1]*ground[1]+ground[2]*ground[2]);
305 mountdist_xz = -mountdist*nrm_yz/ground[2];
308 if (mountdist_xz < _length) {
310 float ang = -Math::asin(mountdist_xz/_length)
311 + Math::atan2(ground[2], ground[0]) +
YASIM_PI2;
313 _frac = (ang - _up_ang)/(_down_ang - _up_ang);
323 getHoldbackTipPosition(htip);
327 float h_tipdist = ground[3] - Math::dot3(htip, ground);
328 if (0 <= h_tipdist) {
329 _h_frac = _extension;
333 float h_mountdist = ground[3] - Math::dot3(_holdback_mount, ground);
339 float h_mountdist_xz = _holdback_length;
340 if (ground[2] != 0) {
341 float nrm_yz = Math::sqrt(ground[1]*ground[1]+ground[2]*ground[2]);
342 h_mountdist_xz = -h_mountdist*nrm_yz/ground[2];
345 if (h_mountdist_xz < _holdback_length) {
346 float h_ang = Math::asin(h_mountdist_xz/_holdback_length)
347 + Math::atan2(ground[2], ground[0]) +
YASIM_PI2;
348 _h_frac = (h_ang - _up_ang)/(_down_ang - _up_ang);
350 _h_frac = _extension;
355 getTipPosition(llb_mount);
358 double launchbar_pos[3];
359 s->posLocalToGlobal(llb_mount, launchbar_pos);
361 double end[2][3];
float vel[2][3];
362 float dist = g_cb->getCatapult(launchbar_pos, end, vel);
371 s->posGlobalToLocal(end[0], lend[0]);
372 s->posGlobalToLocal(end[1], lend[1]);
377 s->globalToLocal(vel[0], lvel[0]);
378 s->globalToLocal(vel[1], lvel[1]);
381 float tip_pos_on_cat = getPercentPosOnCat(llb_mount, 0.0, lend);
382 float llbtip[3], lvlbtip[3];
383 getPosOnCat(tip_pos_on_cat, llbtip, lvlbtip, lend, lvel);
388 Math::sub3(llbtip, _launchbar_mount, llbdir);
389 float lblen = Math::mag3(llbdir);
390 Math::mul3(1.0f/lblen, llbdir, llbdir);
393 if (_state == Unmounted && dist < 0.6) {
399 float lrot[3], lv[3];
400 Math::vmul33(s->orient, s->rot, lrot);
401 Math::vmul33(s->orient, s->v, lv);
402 body->pointVelocity(llb_mount, lrot, tmp);
403 Math::sub3(tmp, lvlbtip, lv_mount);
404 Math::add3(lv, lv_mount, lv_mount);
407 if (0.2 < Math::mag3(lv_mount))
411 double dd[2][3];
float fd[2][3];
double ghldbkpos[3];
412 s->posLocalToGlobal(_holdback_mount, ghldbkpos);
413 float hbdist = g_cb->getCatapult(ghldbkpos, dd, fd);
416 if (_holdback_length*_holdback_length - hbdist*hbdist < 0)
418 float offset = -Math::sqrt(_holdback_length*_holdback_length
420 _pos_on_cat = getPercentPosOnCat(_holdback_mount, offset, lend);
423 if (_pos_on_cat < 0.0 || 0.4 < _pos_on_cat)
434 float lhldbk_cmount[3];
float lvhldbk_cmount[3];
435 getPosOnCat(_pos_on_cat, lhldbk_cmount, lvhldbk_cmount, lend, lvel);
438 Math::sub3(lhldbk_cmount, _holdback_mount, lhldbkdir);
439 float hldbklen = Math::mag3(lhldbkdir);
440 Math::mul3(1/hldbklen, lhldbkdir, lhldbkdir);
442 if (_state == Arrested) {
444 Math::mul3(2.0, llbdir, _launchbar_force);
449 if (_holdback_length < hldbklen) {
454 float lvhldbk_gmount[3];
455 float lrot[3], lv[3];
456 Math::vmul33(s->orient, s->rot, lrot);
457 Math::vmul33(s->orient, s->v, lv);
458 body->pointVelocity(_holdback_mount, lrot, lvhldbk_gmount);
459 Math::add3(lv, lvhldbk_gmount, lvhldbk_gmount);
464 Math::sub3(lvhldbk_gmount, lvhldbk_cmount, lvhldbk);
468 Math::mul3(10.f*(hldbklen - _holdback_length), lhldbkdir,
472 Math::mul3(2e0, lvhldbk, tmp);
473 Math::sub3(_holdback_force, tmp, _holdback_force);
482 if (_state == Launch) {
486 Math::mul3(100 * _acceleration, llbdir, _launchbar_force);
493 if (_state == Completed) {
504 float mass = body->getTotalMass();
505 Math::mul3(mass, _launchbar_force, _launchbar_force);
506 Math::mul3(mass, _holdback_force, _holdback_force);
static const float YASIM_PI2
static const float YASIM_PI