diff --git a/docs/re/captures/pitch-gametime.csv b/docs/re/captures/pitch-gametime.csv new file mode 100644 index 0000000..9fb17ba --- /dev/null +++ b/docs/re/captures/pitch-gametime.csv @@ -0,0 +1,314 @@ +phase,t,fx,fy,fz +slow,0.022,-0.9999999999976801,-5.364418029772711e-07,-2.0861625671338324e-06 +slow,0.072,-0.9999999999976801,-5.364418029772711e-07,-2.0861625671338324e-06 +slow,0.138,-0.9999999999976801,-5.364418029772711e-07,-2.0861625671338324e-06 +slow,0.188,-0.9999999999976801,-5.364418029772711e-07,-2.0861625671338324e-06 +slow,0.238,-0.9999996503301273,-0.000739351008976433,0.00039076810084039696 +slow,0.288,-0.9995667500505145,-0.025989011351613873,0.013816058859813869 +slow,0.338,-0.9991424233572718,-0.03655991231151712,0.01943683769373226 +slow,0.388,-0.9974614922372212,-0.06287386978474002,0.03342825155743701 +slow,0.441,-0.9974614922372212,-0.06287386978474002,0.03342825155743701 +slow,0.491,-0.9974614922372212,-0.06287386978474002,0.03342825155743701 +slow,0.542,-0.9974614922372212,-0.06287386978474002,0.03342825155743701 +slow,0.592,-0.9756937705208446,-0.19348862930198532,0.10287767735352636 +slow,0.642,-0.9599895265779043,-0.24725777991348272,0.13146748317735063 +slow,0.692,-0.9065968643570531,-0.3726025922234667,0.19811469861247516 +slow,0.742,-0.8880690175394421,-0.405900585102419,0.215819681910719 +slow,0.792,-0.8231976038572328,-0.5012983450542031,0.2665439443124295 +slow,0.845,-0.8111180643235866,-0.5164209971100269,0.2745848493122731 +slow,0.895,-0.8111180643235866,-0.5164209971100269,0.2745848493122731 +slow,0.946,-0.8111180643235866,-0.5164209971100269,0.2745848493122731 +slow,0.996,-0.8111180643235866,-0.5164209971100269,0.2745848493122731 +slow,1.047,-0.6225347328753619,-0.6909879300492386,0.3674046636749054 +slow,1.098,-0.4995761468930651,-0.7648708472261829,0.40668939071357624 +slow,1.148,-0.42441628069163945,-0.7994799112461082,0.425091392759005 +slow,1.198,-0.34635895158661695,-0.8282947460891245,0.440412636350244 +slow,1.249,-0.26597407096587283,-0.8511436226859083,0.4525619594430681 +slow,1.3,-0.22508987440157757,-0.8602890836759516,0.45742457405551984 +slow,1.35,-0.22508987440157757,-0.8602890836759516,0.45742457405551984 +slow,1.4,-0.22508987440157757,-0.8602890836759516,0.45742457405551984 +slow,1.45,0.0050435963756794286,-0.8829357634414114,0.4694667184920898 +slow,1.5,0.1113271185026686,-0.8774582682112876,0.4665546701443904 +slow,1.551,0.19530088938670107,-0.8659441420087264,0.46043273724349176 +slow,1.601,0.35806279594948665,-0.8244050055782095,0.4383462340826355 +slow,1.651,0.4357105639703388,-0.7947284845866424,0.4225670837053784 +slow,1.701,0.4357105639703388,-0.7947284845866424,0.4225670837053784 +slow,1.751,0.4357105639703388,-0.7947284845866424,0.4225670837053784 +slow,1.801,0.581059227173933,-0.7185957552011922,0.38208679003972373 +slow,1.854,0.5981621070188505,-0.707571139880663,0.3762249004714446 +slow,1.933,0.7102092219298712,-0.6215856943388454,0.3305058027918156 +slow,1.983,0.7936818073741404,-0.5371251153693617,0.28559726728869045 +slow,2.034,0.8306115980329357,-0.491670162790673,0.2614284304251665 +slow,2.085,0.8306115980329357,-0.491670162790673,0.2614284304251665 +slow,2.136,0.8306115980329357,-0.491670162790673,0.2614284304251665 +slow,2.186,0.8306115980329357,-0.491670162790673,0.2614284304251665 +slow,2.236,0.9439254674422402,-0.29151154402331125,0.15500236003072188 +slow,2.288,0.9782500298959619,-0.18314796371755346,0.09738430260911397 +slow,2.338,0.9923168633793271,-0.1092393189325843,0.05808626216377494 +slow,2.388,0.9999950320089501,0.0027841479666426932,-0.0014779978073891553 +slow,2.439,0.9961448118772039,0.07745674002692376,-0.04118212226842516 +slow,2.489,0.9885868780617736,0.1330186187164556,-0.07072504223287812 +slow,2.54,0.9885868780617736,0.1330186187164556,-0.07072504223287812 +slow,2.59,0.9885868780617736,0.1330186187164556,-0.07072504223287812 +slow,2.64,0.9885868780617736,0.1330186187164556,-0.07072504223287812 +slow,2.69,0.9104394306290844,0.3652252075952527,-0.1941921494108173 +slow,2.741,0.8718210936242394,0.4324898355933772,-0.22995765440673788 +slow,2.791,0.8021474529558832,0.5272312979999614,-0.28033305571349426 +slow,2.841,0.7483879225773887,0.5856251973581853,-0.31138183241718986 +slow,2.891,0.6415804884515123,0.6772700855747096,-0.3601106885722006 +slow,2.942,0.5565400067937,0.7335711833839508,-0.39004684301598735 +slow,2.992,0.5025832072518267,0.7633335327127708,-0.4058719473241637 +slow,3.042,0.5025832072518267,0.7633335327127708,-0.4058719473241637 +slow,3.092,0.5025832072518267,0.7633335327127708,-0.4058719473241637 +slow,3.142,0.5025832072518267,0.7633335327127708,-0.4058719473241637 +slow,3.193,0.26840150425248394,0.8505494121077833,-0.4522458734782528 +slow,3.243,0.14383384202445684,0.8737661032159637,-0.4645908121769882 +slow,3.293,0.017126773329819035,0.8828175004515181,-0.46940380753871486 +slow,3.344,-0.025233536073355507,0.8826657223955247,-0.46932343982079283 +slow,3.394,-0.1306276597599528,0.8753813567867831,-0.46545020646226887 +slow,3.444,-0.1306276597599528,0.8753813567867831,-0.46545020646226887 +slow,3.494,-0.1306276597599528,0.8753813567867831,-0.46545020646226887 +slow,3.544,-0.1306276597599528,0.8753813567867831,-0.46545020646226887 +slow,3.594,-0.3953899986357624,0.8109981935802458,-0.4312176700790331 +slow,3.644,-0.5092096812736444,0.7599012381904277,-0.40404901768702334 +slow,3.695,-0.6146085873298012,0.6964964366951696,-0.37033633099035523 +slow,3.745,-0.6475735623151888,0.6728076094689478,-0.35774069104743467 +slow,3.795,-0.7246428766140702,0.6084598143649699,-0.32352643736707504 +slow,3.845,-0.7246428766140702,0.6084598143649699,-0.32352643736707504 +slow,3.895,-0.7246428766140702,0.6084598143649699,-0.32352643736707504 +slow,3.946,-0.7246428766140702,0.6084598143649699,-0.32352643736707504 +slow,4.0,-0.8948032879220578,0.39420026288722865,-0.2096025492772329 +slow,4.05,-0.9371976061971167,0.3079700993685502,-0.16375306053115327 +slow,4.1,-0.9739646105616616,0.20016331274041113,-0.10643113081357014 +slow,4.151,-0.9925182516704475,0.1078037923584182,-0.057322442849038695 +slow,4.201,-0.9998661518865883,0.014444979973920849,-0.007682503827448022 +slow,4.252,-0.999988574147902,-0.004221603854607207,0.0022426846725771095 +slow,4.302,-0.999988574147902,-0.004221603854607207,0.0022426846725771095 +slow,4.352,-0.999988574147902,-0.004221603854607207,0.0022426846725771095 +slow,4.402,-0.999988574147902,-0.004221603854607207,0.0022426846725771095 +slow,4.454,-0.9481592609187346,-0.28059728776173093,0.1491951005723691 +slow,4.504,-0.8998604949330586,-0.3851225220144059,0.20477239241678594 +slow,4.554,-0.8483542366290391,-0.4674583762955424,0.24855131386636348 +slow,4.605,-0.8002653758276345,-0.5294561807103555,0.281516395542175 +slow,4.655,-0.7740407763904767,-0.5590258203543885,0.2972389756777044 +slow,4.705,-0.7320686741889714,-0.6014912262488834,0.31981832501721374 +slow,4.755,-0.7320686741889714,-0.6014912262488834,0.31981832501721374 +slow,4.805,-0.7320686741889714,-0.6014912262488834,0.31981832501721374 +slow,4.855,-0.7320686741889714,-0.6014912262488834,0.31981832501721374 +slow,4.905,-0.5000347671416738,-0.7646370203731946,0.4065654421177173 +slow,4.956,-0.38571043654168863,-0.8146245270401747,0.43314470917626546 +slow,5.033,-0.3059761515320789,-0.8406001527732009,0.44695634893274494 +slow,5.083,-0.14067269192255813,-0.8741670164828578,0.46480449765543375 +slow,5.136,-0.11971066366716597,-0.876597475120388,0.46609679640277224 +slow,5.186,-0.11971066366716597,-0.876597475120388,0.46609679640277224 +slow,5.236,-0.11971066366716597,-0.876597475120388,0.46609679640277224 +slow,5.286,0.09210780811437987,-0.8791932987194956,0.4674775878810623 +slow,5.336,0.1552569076145395,-0.8722401249754417,0.46378061302818196 +slow,5.389,0.29980078422712286,-0.8423325684075889,0.4478787045358116 +slow,5.439,0.39908806765876,-0.8095847039629167,0.43046639980569157 +slow,5.49,0.4751133264531701,-0.7769262478123317,0.4131016006829976 +slow,5.542,0.4751133264531701,-0.7769262478123317,0.4131016006829976 +slow,5.592,0.4751133264531701,-0.7769262478123317,0.4131016006829976 +slow,5.642,0.4751133264531701,-0.7769262478123317,0.4131016006829976 +slow,5.692,0.696657860237904,-0.633428595248907,0.3368026729254701 +slow,5.742,0.726585020550654,-0.6066514667740671,0.3225650411502751 +slow,5.792,0.8325182828011221,-0.48914972660411055,0.2600881653689665 +slow,5.843,0.8765739353060135,-0.4249327255756417,0.22594316691811042 +slow,5.893,0.9054260508840364,-0.37481374091028163,0.19929457093804306 +slow,5.943,0.9054260508840364,-0.37481374091028163,0.19929457093804306 +slow,5.993,0.9054260508840364,-0.37481374091028163,0.19929457093804306 +slow,6.043,0.9054260508840364,-0.37481374091028163,0.19929457093804306 +slow,6.093,0.9868879110680581,-0.14251307214027348,0.07577780187407064 +slow,6.144,0.9928589520370625,-0.10532958640717122,0.056006960167108814 +slow,6.194,0.9995721898785164,0.025825160128774418,-0.013729469246492699 +slow,6.244,0.9934893887944055,0.10059024435508387,-0.05348305426490678 +slow,6.294,0.9538232020213261,0.26521033194280885,-0.14101340048580407 +slow,6.344,0.947267673727074,0.2829352443494437,-0.1504380331452729 +slow,6.394,0.947267673727074,0.2829352443494437,-0.1504380331452729 +slow,6.445,0.947267673727074,0.2829352443494437,-0.1504380331452729 +slow,6.495,0.947267673727074,0.2829352443494437,-0.1504380331452729 +slow,6.545,0.8243733791338322,0.4997895512364342,-0.2657422364818033 +slow,6.597,0.7593203746728908,0.5745491212947682,-0.30549284087524925 +slow,6.647,0.7010074410559842,0.6296776548998042,-0.3348053441987208 +slow,6.697,0.6041754101078993,0.7035779205024607,-0.37409916279294836 +slow,6.747,0.5340870381020223,0.7464697028629991,-0.39690555355025536 +slow,6.797,0.4025055990782129,0.8082653740061208,-0.4297631067151235 +slow,6.847,0.3433573357356595,0.8292682687272306,-0.44093069577729704 +slow,6.898,0.3433573357356595,0.8292682687272306,-0.44093069577729704 +slow,6.948,0.3433573357356595,0.8292682687272306,-0.44093069577729704 +slow,6.999,0.3433573357356595,0.8292682687272306,-0.44093069577729704 +slow,7.049,0.09503184681410931,0.8789508919606488,-0.46734813320765445 +slow,7.1,-0.03242949378753749,0.8824823690120825,-0.4692261675519672 +slow,7.15,-0.07486618489555856,0.8804688348729269,-0.46815562068258304 +slow,7.202,-0.2217573682314415,0.8609628101781774,-0.4577845662810842 +slow,7.253,-0.3436636683706333,0.8291685841702975,-0.44087950969291334 +slow,7.306,-0.3436636683706333,0.8291685841702975,-0.44087950969291334 +slow,7.356,-0.3436636683706333,0.8291685841702975,-0.44087950969291334 +slow,7.406,-0.3436636683706333,0.8291685841702975,-0.44087950969291334 +slow,7.456,-0.5335192585826919,0.7467851744734487,-0.3970756904017614 +slow,7.506,-0.5863848618861591,0.715215075832045,-0.38028961207652284 +slow,7.557,-0.6691599892298212,0.6561333325626291,-0.3488752767311034 +slow,7.607,-0.7582631988698701,0.5756351874374445,-0.30607360589160554 +slow,7.657,-0.8108505756823166,0.51674664977568,-0.27476215871416254 +slow,7.707,-0.8575526461274808,0.4541837039893854,-0.24149662968711988 +slow,7.757,-0.8575526461274808,0.4541837039893854,-0.24149662968711988 +slow,7.808,-0.8575526461274808,0.4541837039893854,-0.24149662968711988 +slow,7.859,-0.8575526461274808,0.4541837039893854,-0.24149662968711988 +slow,7.909,-0.9532867456950477,0.2667081367420545,-0.1418137873329921 +slow,7.959,-0.9755224624568912,0.19415891248194872,-0.10323876183813074 +fast,0.031,-0.9183790521746182,-0.3493842945716818,0.1857701031745906 +fast,0.081,-0.9181941875656858,-0.34976292144045307,0.18597132226778823 +fast,0.131,-0.9157256739103099,-0.35477222000318137,0.18863499690015914 +fast,0.181,-0.9149015400332507,-0.3564260247285592,0.18951427635136814 +fast,0.231,-0.9149015400332507,-0.3564260247285592,0.18951427635136814 +fast,0.282,-0.9149015400332507,-0.3564260247285592,0.18951427635136814 +fast,0.334,-0.886987130221704,-0.40774025376731704,0.21679879215260833 +fast,0.392,-0.874422882615109,-0.42837502256975,0.22777063550301968 +fast,0.442,-0.8391761714215903,-0.4801996653842019,0.2553265256159302 +fast,0.492,-0.8087011271707248,-0.5193672154489234,0.27615246229144985 +fast,0.542,-0.7639193320090165,-0.5697763250541364,0.3029557617717493 +fast,0.592,-0.7142788381999624,-0.6179405632697418,0.3285653687861613 +fast,0.644,-0.7056326965418199,-0.6256368844308748,0.3326574610778302 +fast,0.694,-0.7056326965418199,-0.6256368844308748,0.3326574610778302 +fast,0.761,-0.7056326965418199,-0.6256368844308748,0.3326574610778302 +fast,0.811,-0.6045554154137983,-0.703323001692553,0.37396457717814224 +fast,0.861,-0.5641123049229769,-0.7290475533490074,0.38764284127313964 +fast,0.911,-0.5010910596413976,-0.7640973590830287,0.4062794306752468 +fast,0.961,-0.4574254856752507,-0.7851585926980168,0.4174780345925168 +fast,1.011,-0.40119022065553167,-0.8087745891735626,0.43003496457555734 +fast,1.062,-0.40119022065553167,-0.8087745891735626,0.43003496457555734 +fast,1.112,-0.40119022065553167,-0.8087745891735626,0.43003496457555734 +fast,1.162,-0.40119022065553167,-0.8087745891735626,0.43003496457555734 +fast,1.213,-0.2732721277804909,-0.8493387726086905,0.4516038014918455 +fast,1.263,-0.24847333019197224,-0.8552561875978043,0.45475032463867526 +fast,1.314,-0.13690544128361162,-0.8746327174969611,0.46505323311511404 +fast,1.364,-0.11190820705598208,-0.8774002355189958,0.46652479023598115 +fast,1.414,-0.04853388875408303,-0.8819058319940255,0.46892063842118525 +fast,1.464,-0.023325922091828814,-0.8827061212913064,0.4693461460302229 +fast,1.52,-0.023325922091828814,-0.8827061212913064,0.4693461460302229 +fast,1.57,-0.023325922091828814,-0.8827061212913064,0.4693461460302229 +fast,1.623,0.11590445397311018,-0.8769955308131724,0.4663099789656202 +fast,1.674,0.16796962344551228,-0.8704014300065923,0.46280401493726464 +fast,1.724,0.2673695301474367,-0.8508015956107015,0.4523827795739172 +fast,1.776,0.3040082366636887,-0.8411556467255445,0.44725403298613803 +fast,1.826,0.34060203879357387,-0.8301524613755806,0.44140360447296506 +fast,1.876,0.34060203879357387,-0.8301524613755806,0.44140360447296506 +fast,1.926,0.34060203879357387,-0.8301524613755806,0.44140360447296506 +fast,1.976,0.34060203879357387,-0.8301524613755806,0.44140360447296506 +fast,2.026,0.4800222448487086,-0.7745698100484196,0.41184979520689524 +fast,2.077,0.5027716590432529,-0.7632352767416622,0.4058233251058559 +fast,2.162,0.567685165746978,-0.726881238602736,0.3864934896711436 +fast,2.213,0.60896099881303,-0.7003525641308903,0.37238795340333464 +fast,2.263,0.60896099881303,-0.7003525641308903,0.37238795340333464 +fast,2.313,0.60896099881303,-0.7003525641308903,0.37238795340333464 +fast,2.363,0.60896099881303,-0.7003525641308903,0.37238795340333464 +fast,2.415,0.7138914376865056,-0.6182880840720885,0.3287534947226572 +fast,2.465,0.7492325438071801,-0.584780749889073,0.31093740505026973 +fast,2.515,0.7980625863701071,-0.5320401745258126,0.28289461098931906 +fast,2.566,0.8280000832233713,-0.4950917864992449,0.2632489033653826 +fast,2.618,0.8351255264037815,-0.48567212818960787,0.2582400802520477 +fast,2.669,0.8351255264037815,-0.48567212818960787,0.2582400802520477 +fast,2.719,0.8351255264037815,-0.48567212818960787,0.2582400802520477 +fast,2.769,0.8351255264037815,-0.48567212818960787,0.2582400802520477 +fast,2.82,0.9093870336730951,-0.36726148601053504,0.1952798604070126 +fast,2.871,0.9203632924764715,-0.3452879583192104,0.18359639348750836 +fast,2.921,0.9600488101430662,-0.247076202859695,0.13137591911502494 +fast,2.972,0.9669595427173864,-0.2250884627532023,0.1196846969465328 +fast,3.022,0.9813959442736294,-0.16952014269323645,0.09013834802422341 +fast,3.074,0.9837681894544645,-0.158438487459875,0.08424603912892294 +fast,3.124,0.9837681894544645,-0.158438487459875,0.08424603912892294 +fast,3.174,0.9837681894544645,-0.158438487459875,0.08424603912892294 +fast,3.224,0.9985768344211968,-0.04708834623109012,0.025039836392490022 +fast,3.276,0.9999091072744978,0.011905223183064872,-0.006327942041318827 +fast,3.326,0.9958087405962524,0.08075529499181068,-0.04293640044171679 +fast,3.376,0.9931046463689198,0.10350980586946733,-0.05503527459119239 +fast,3.426,0.9725948196320136,0.20529173779377843,-0.10915410765784948 +fast,3.476,0.9662434406366642,0.22747505904204074,-0.12094920810175326 +fast,3.526,0.9554895457575009,0.26049211070264017,-0.13850483099808442 +fast,3.577,0.9554895457575009,0.26049211070264017,-0.13850483099808442 +fast,3.627,0.9554895457575009,0.26049211070264017,-0.13850483099808442 +fast,3.677,0.9554895457575009,0.26049211070264017,-0.13850483099808442 +fast,3.727,0.8909286923979324,0.4009849131652504,-0.21320685841681314 +fast,3.778,0.8640929736842651,0.44441621107211554,-0.23629973374041036 +fast,3.829,0.8128494133306493,0.5142939755758894,-0.27345481881723305 +fast,3.879,0.7814528720839342,0.5509276830126654,-0.2929336047674737 +fast,3.929,0.7211597970721555,0.611678327920411,-0.3252355611542772 +fast,3.979,0.6841778570037976,0.6439468055268214,-0.34239329963872395 +fast,4.029,0.6746720278390272,0.65171893206941,-0.34652573992978153 +fast,4.082,0.6746720278390272,0.65171893206941,-0.34652573992978153 +fast,4.133,0.6746720278390272,0.65171893206941,-0.34652573992978153 +fast,4.183,0.6746720278390272,0.65171893206941,-0.34652573992978153 +fast,4.233,0.5182188187016136,0.7551386081987147,-0.4015158008736547 +fast,4.284,0.47114018545956854,0.7788105659042874,-0.41410267818618 +fast,4.335,0.37644461942850993,0.8179963583095251,-0.4349383936785522 +fast,4.385,0.32771191712873915,0.8341882735212928,-0.44354799480030493 +fast,4.435,0.22775844025010583,0.8597406189563827,-0.4571347296053267 +fast,4.485,0.20235015483807314,0.864681197867618,-0.4597617218638685 +fast,4.536,0.18963344038093657,0.8669254276051488,-0.4609549449359662 +fast,4.586,0.18963344038093657,0.8669254276051488,-0.4609549449359662 +fast,4.636,0.18963344038093657,0.8669254276051488,-0.4609549449359662 +fast,4.686,0.0616702782462941,0.8812657670818295,-0.46858022210791117 +fast,4.742,-0.033265594992281614,0.8824576094559936,-0.4692142023671305 +fast,4.793,-0.08561358744104564,0.8797044474697407,-0.46775035943057547 +fast,4.861,-0.16311988058380167,0.8711202450018558,-0.46318616484760533 +fast,4.911,-0.2647679339679234,0.8514356989074474,-0.4527197717886242 +fast,4.962,-0.31438943728704216,0.8381755148966445,-0.4456692584754773 +fast,5.012,-0.31438943728704216,0.8381755148966445,-0.4456692584754773 +fast,5.062,-0.31438943728704216,0.8381755148966445,-0.4456692584754773 +fast,5.112,-0.31438943728704216,0.8381755148966445,-0.4456692584754773 +fast,5.163,-0.4463483290724788,0.7901123971308208,-0.42011375725438266 +fast,5.213,-0.505148005766188,0.7620111594970173,-0.40517216719865473 +fast,5.263,-0.5274613820707995,0.7501322143205744,-0.3988560535612739 +fast,5.313,-0.6235599606983542,0.6902653205120604,-0.36702419908263495 +fast,5.364,-0.6535579280284671,0.6682807541755503,-0.3553348678496027 +fast,5.414,-0.6535579280284671,0.6682807541755503,-0.3553348678496027 +fast,5.464,-0.6535579280284671,0.6682807541755503,-0.3553348678496027 +fast,5.514,-0.6535579280284671,0.6682807541755503,-0.3553348678496027 +fast,5.564,-0.7542996656095252,0.5796803289795648,-0.3082251298247795 +fast,5.615,-0.8053480118610813,0.5234118913151391,-0.2783066147638474 +fast,5.665,-0.835317794193117,0.4854144024411218,-0.25810277140525667 +fast,5.715,-0.8756811392589173,0.4263650045332836,-0.22670559158419007 +fast,5.765,-0.8879541369536935,0.4060944713229071,-0.21592760598818767 +fast,5.816,-0.8938471875490723,0.3958873769547781,-0.21050033272771532 +fast,5.867,-0.8938471875490723,0.3958873769547781,-0.21050033272771532 +fast,5.917,-0.8938471875490723,0.3958873769547781,-0.21050033272771532 +fast,5.967,-0.8938471875490723,0.3958873769547781,-0.21050033272771532 +fast,6.017,-0.9568362261302265,0.2566077577804137,-0.1364437430290401 +fast,6.067,-0.9711494705384393,0.21055675115725614,-0.11195785106463185 +fast,6.118,-0.9868689841435945,0.1426150745455621,-0.07583237203037746 +fast,6.168,-0.9907414896934681,0.11986964152412082,-0.06373829022531322 +fast,6.218,-0.9974727159739508,0.06273297303862826,-0.03335798227238545 +fast,6.27,-0.9974727159739508,0.06273297303862826,-0.03335798227238545 +fast,6.321,-0.9974727159739508,0.06273297303862826,-0.03335798227238545 +fast,6.371,-0.9974727159739508,0.06273297303862826,-0.03335798227238545 +fast,6.421,-0.9962961796573708,-0.0759235377258525,0.04036754661010212 +fast,6.471,-0.9935876720124013,-0.09983054395307195,0.053079191016920685 +fast,6.521,-0.98151891503074,-0.1689659788258626,0.0898393980183376 +fast,6.572,-0.9761981791370964,-0.19149456258495987,0.1018182083412009 +fast,6.622,-0.9600279771648162,-0.24714097112937958,0.13140632956619028 +fast,6.673,-0.9600279771648162,-0.24714097112937958,0.13140632956619028 +fast,6.723,-0.9600279771648162,-0.24714097112937958,0.13140632956619028 +fast,6.773,-0.9600279771648162,-0.24714097112937958,0.13140632956619028 +fast,6.823,-0.9600279771648162,-0.24714097112937958,0.13140632956619028 +fast,6.874,-0.8987677690425633,-0.3871064780875767,0.20582777254997944 +fast,6.924,-0.8670890034724157,-0.43984325215975256,0.23386871014897564 +fast,6.974,-0.8537120733075257,-0.4597908235105943,0.24447514087206346 +fast,7.024,-0.7865457418615867,-0.545248184091142,0.2899141488522395 +fast,7.074,-0.7533129809628684,-0.5806809342120418,0.3087542798982184 +fast,7.127,-0.7447100018154831,-0.5892684722773185,0.31332041231930347 +fast,7.179,-0.7447100018154831,-0.5892684722773185,0.31332041231930347 +fast,7.229,-0.7447100018154831,-0.5892684722773185,0.31332041231930347 +fast,7.279,-0.7447100018154831,-0.5892684722773185,0.31332041231930347 +fast,7.329,-0.5992280106837283,-0.7068679873070793,0.3758502889881291 +fast,7.379,-0.5443899367788374,-0.7406440829377567,0.3938095213973664 +fast,7.431,-0.4771420994818272,-0.7759564582613324,0.4125857387072451 +fast,7.481,-0.41846538807715317,-0.801920794933833,0.42639155436538256 +fast,7.531,-0.35845204323781216,-0.8242729196805756,0.43827649558229453 +fast,7.581,-0.35845204323781216,-0.8242729196805756,0.43827649558229453 +fast,7.631,-0.35845204323781216,-0.8242729196805756,0.43827649558229453 +fast,7.681,-0.35845204323781216,-0.8242729196805756,0.43827649558229453 +fast,7.732,-0.23477000507402776,-0.8582687461538578,0.4563527189499649 +fast,7.783,-0.20781325308245005,-0.8636701935950999,0.4592248344097825 +fast,7.861,-0.10263756227815277,-0.8782831695934015,0.4669948659445483 +fast,7.911,-0.02463647965351885,-0.8826781186805318,0.4693318470686588 +fast,7.962,0.001224726571744081,-0.8829453951924657,0.4694740984902627 diff --git a/docs/re/flight-speed-law.md b/docs/re/flight-speed-law.md index fb32d50..045ed32 100644 --- a/docs/re/flight-speed-law.md +++ b/docs/re/flight-speed-law.md @@ -342,3 +342,45 @@ Either that agreement was luck inside a noisy sample (the per-window rates spann 61–96), or angular integration is frame-based where linear is time-based. The check: re-measure pitch and convert wall→game seconds with the clock ratio, expecting ~94 if the clock explanation is universal. + +--- + +# ✅ The clock factor applies to the ANGULAR side too — and it varies per run + +The open question was whether the ~1.26× mission-clock factor explains only the +linear measurements. Measuring **both in the same run** settles it +([`tools/re-capture/pitch_gametime.py`](../../tools/re-capture/pitch_gametime.py): +HUD screenshots bracket each turn phase, so the mission clock's own advance converts +wall seconds to game seconds): + +``` +this run's clock: TIME 00:33.68 -> 00:44.12 = 10.44 s game in 7.96 s wall = 1.311 +``` + +| phase | wall-time rate | ÷ 1.311 → game-time | definition | +|---|---|---|---| +| pitch, minimum speed | 88.9 °/s | **67.8 °/s** | `AV_PitchMinus_Min` **75** (0.90×) | +| pitch, maximum speed | 53.6 °/s | **40.9 °/s** | `AV_PitchMinus_Max` **40** (1.02×) | + +So with the clock correction both land on the definition (the slow phase runs 10 % +low, consistent with the `AA_*` ramp being included in an 8 s window). **The clock +explanation is universal**: every rate the game states is per **game** second, and a +probe that divides by wall seconds reads high by that run's ratio. + +**And the ratio is not a constant of the machine — it varies with scene load**: +1.260 in the earlier flight, **1.311** here. It has to be measured *in the same run* +as whatever it is correcting, which is why this probe brackets its own phases with +HUD screenshots. + +Bonus confirmation from the same screenshots: at full `LT` the HUD reads **102**, +against `MinimumVelocity` **100** — the throttle law's lower endpoint, in the game's +own units. + +## The trap that cost three runs: a dead emulator looks alive + +A killed Canary leaves **both** its `/dev/shm/xenia_memory_*` image *and* its last +frame on the X display. So the screenshot shows a mission in progress, the memory +image still parses, and the scans quietly report `0 moving triples` / "player entity +not found" — which reads like a tooling bug. `pgrep -x xenia_canary` does **not** +help: zombies match it. `speed_law.require_live_emulator()` now checks the process +*state letter* and refuses to measure a corpse, naming the stale image in its error. diff --git a/tools/re-capture/pitch_gametime.py b/tools/re-capture/pitch_gametime.py new file mode 100644 index 0000000..ce32374 --- /dev/null +++ b/tools/re-capture/pitch_gametime.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +"""Is the clock factor universal, or does it apply only to linear motion? + +The mission clock runs ~1.26x wall time, which fully explains the linear +measurements. Applied to the angular ones it predicts a wall-time pitch rate of +~94 deg/s for `AV_PitchMinus_Min` 75 — but the settled measurement read 74.9. +Either that was luck inside a noisy sample or angular integration is frame-based. + +The flaw in comparing across runs is that the emulator's speed depends on scene +load, so the clock ratio is not a constant of the machine. This measures BOTH in +the same run: a HUD screenshot brackets each turn phase, so the mission clock's +own advance over that phase converts wall seconds to game seconds. + +Usage: pitch_gametime.py [dwell_s] (then read the HUD TIME off the shots) +""" +import json, math, os, struct, subprocess, sys, time +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) +import speed_law + +def pad(*a): + subprocess.run(["vgamepad", *a], capture_output=True) + +def shot(n): + subprocess.run(["screenshot", f"/sylph-home/re/shots/{n}.png"], capture_output=True) + +def row_at(fd, off, cfg, row): + at = off + cfg["rot_delta"] + row * cfg["rot_stride"] + v = struct.unpack(">3f", os.pread(fd, 12, at)) + n = math.sqrt(sum(c * c for c in v)) or 1.0 + return tuple(c / n for c in v) + +def ang(a, b): + return math.degrees(math.acos(max(-1.0, min(1.0, sum(a[i] * b[i] for i in range(3)))))) + +def main(): + out_csv = sys.argv[1] + dwell = float(sys.argv[2]) if len(sys.argv) > 2 else 8.0 + cfg = json.load(open("/tmp/nav-live.json")) + w, off, nm = speed_law.find_player() + if not w: + sys.exit("player entity not found after retries") + print(f"# locked on {nm}") + fwd = cfg.get("fwd_row", 0) + rows = [] + for label, (trig, tv) in (("slow", ("LT", 1.0)), ("fast", ("RT", 1.0))): + pad("trig", "RT", "0.0"); pad("trig", "LT", "0.0"); pad("axis", "LY", "0.0") + pad("trig", trig, str(tv)) + time.sleep(5.0) + shot(f"gt_{label}_a") # HUD TIME at the start of the phase + t0 = time.time() + pad("axis", "LY", "1.0") # nose down = PitchMinus + seq = [] + while time.time() - t0 < dwell: + seq.append((round(time.time() - t0, 3), *row_at(w.fd, off, cfg, fwd))) + time.sleep(0.05) + pad("axis", "LY", "0.0") + wall = seq[-1][0] + shot(f"gt_{label}_b") # HUD TIME at the end + rows += [(label, *s) for s in seq] + total = sum(ang(seq[i][1:], seq[i + 1][1:]) for i in range(len(seq) - 1)) + print(f"# {label:<5} wall {wall:5.2f}s swept {total:7.1f}deg " + f"rate {total / wall:6.1f} deg/wall-s " + f"(x1.26 -> {total / wall * 1.26:6.1f} deg/game-s if the clock applies)") + pad("trig", "RT", "0.0"); pad("trig", "LT", "0.0"); pad("reset") + with open(out_csv, "w") as f: + f.write("phase,t,fx,fy,fz\n") + for r in rows: + f.write(",".join(str(x) for x in r) + "\n") + print("# read HUD TIME off gt_slow_a/b and gt_fast_a/b to get the run's own ratio") + +if __name__ == "__main__": + main() diff --git a/tools/re-capture/speed_law.py b/tools/re-capture/speed_law.py index 0d8ef51..98434bd 100644 --- a/tools/re-capture/speed_law.py +++ b/tools/re-capture/speed_law.py @@ -14,18 +14,40 @@ position triple, which is why it survives a firefight. Usage: speed_law.py [hold_s] """ -import os, struct, subprocess, sys, time +import glob, os, struct, subprocess, sys, time sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) import gworld, entities2 + +def require_live_emulator(): + """Refuse to measure a corpse. + + A killed Canary leaves its `/dev/shm/xenia_memory_*` image behind AND leaves its + last frame on the X display, so a dead emulator looks alive from both of the + obvious angles: the screenshot shows a mission in progress and the memory image + still parses. The scans then report `0 moving triples` / "player entity not + found", which reads like a tooling bug rather than a dead game. Note `pgrep -x + xenia_canary` is NOT enough — zombies match it — so the state letter is checked. + """ + out = subprocess.run(["ps", "-o", "pid=,stat=", "-C", "xenia_canary"], + capture_output=True, text=True).stdout + live = [l for l in out.splitlines() if l.split()[1:2] and not l.split()[1].startswith("Z")] + if not live: + stale = glob.glob("/dev/shm/xenia_memory_*") + sys.exit(f"no live xenia_canary (zombies only); {len(stale)} stale shm image(s) " + f"— the screen and the memory file are both leftovers, relaunch first") + def find_player(retries=8): """Lock onto the player object that is actually FLYING. + Verifies the emulator is alive first — see `require_live_emulator`. + A mission holds more than one `*_Player` object — `entities2 list` shows two — and at least one of them never moves. Taking the first match locks onto that one, and then every probe reads a speed of exactly 0 while the game is visibly flying (and the HUD keeps reading 350). So sample each candidate twice and keep the one that displaces.""" + require_live_emulator() for _ in range(retries): w = gworld.World() defs = entities2.definitions(w) @@ -35,13 +57,18 @@ def find_player(retries=8): best = None for off, nm in cands: a = pos_at(w.fd, off) - time.sleep(0.3) + time.sleep(0.5) b = pos_at(w.fd, off) d = sum((b[i] - a[i]) ** 2 for i in range(3)) ** 0.5 if best is None or d > best[0]: best = (d, off, nm) - if best and best[0] > 0.5: + # A craft can be briefly slow (launch, a hard turn), so do not demand a big + # step — just prefer the candidate that moves at all. The failure this + # guards against is the STATIC duplicate, which never moves by any amount. + if best and best[0] > 0.05: return w, best[1], best[2] + print(f"# {len(cands)} player candidates, best displacement " + f"{best[0] if best else 0:.3f} — retrying", flush=True) time.sleep(2) return None, None, None