| 852 | } |
| 853 | |
| 854 | void PilotHead::Move(float deltaT, const Frame& newFrame, const Frame& oldFrame) |
| 855 | { |
| 856 | float invDeltaT = 1 / deltaT; |
| 857 | Vector3Val oldNeckPos = oldFrame.PositionModelToWorld(_neck); |
| 858 | Vector3Val newNeckPos = newFrame.PositionModelToWorld(_neck); |
| 859 | Vector3Val neckSpeed = (newNeckPos - oldNeckPos) * invDeltaT; |
| 860 | |
| 861 | Vector3Val posWEnd = oldFrame.PositionModelToWorld(_pos) + _speed * deltaT; |
| 862 | Vector3Val headWEnd = newFrame.PositionModelToWorld(_head); |
| 863 | |
| 864 | Matrix4Val invTransform = newFrame.CalcInvTransform(); |
| 865 | Vector3 oSpeed = invTransform.Rotate(_speed - neckSpeed); |
| 866 | _pos += oSpeed * deltaT; |
| 867 | saturate(_pos[0], _head[0] - _pars.maxAmp, _head[0] + _pars.maxAmp); |
| 868 | saturate(_pos[1], _head[1] - _pars.maxAmp, _head[1] + _pars.maxAmp); |
| 869 | saturate(_pos[2], _head[2] - _pars.maxAmp, _head[2] + _pars.maxAmp); |
| 870 | Vector3 norm = (_pos - _neck); |
| 871 | _pos = _neck + norm.Normalized() * _pars.radius; |
| 872 | Vector3 center = (headWEnd - posWEnd) * _pars.movement; |
| 873 | Vector3 friction = oSpeed * _pars.friction; |
| 874 | center = invTransform.Rotate(center); |
| 875 | Friction(oSpeed, friction, center, deltaT); |
| 876 | saturate(oSpeed[0], -_pars.maxSpeed, _pars.maxSpeed); |
| 877 | saturate(oSpeed[1], -_pars.maxSpeed, _pars.maxSpeed); |
| 878 | saturate(oSpeed[2], -_pars.maxSpeed, _pars.maxSpeed); |
| 879 | _speed = newFrame.DirectionModelToWorld(oSpeed) + neckSpeed; |
| 880 | } |
| 881 | |
| 882 | void Friction(float& speed, float friction, float accel, float deltaT) |
| 883 | { |
nothing calls this directly
no test coverage detected