1
0
Fork 0

Make better use of SGMath

This commit is contained in:
frohlich 2006-08-08 17:57:33 +00:00
parent 95da644df9
commit 13ce1e48fb

View file

@ -172,7 +172,6 @@ void FGAIMultiplayer::update(double dt)
SGVec3d ecPos; SGVec3d ecPos;
SGQuatf ecOrient; SGQuatf ecOrient;
SGVec3f myVel;
if (tInterp <= curentPkgTime) { if (tInterp <= curentPkgTime) {
// Ok, we need a time prevous to the last available packet, // Ok, we need a time prevous to the last available packet,
@ -186,7 +185,7 @@ void FGAIMultiplayer::update(double dt)
MotionInfo::iterator firstIt = mMotionInfo.begin(); MotionInfo::iterator firstIt = mMotionInfo.begin();
ecPos = firstIt->second.position; ecPos = firstIt->second.position;
ecOrient = firstIt->second.orientation; ecOrient = firstIt->second.orientation;
myVel = firstIt->second.linearVel; speed = norm(firstIt->second.linearVel) * SG_METER_TO_NM * 3600.0;
std::vector<FGFloatPropertyData>::const_iterator firstPropIt; std::vector<FGFloatPropertyData>::const_iterator firstPropIt;
std::vector<FGFloatPropertyData>::const_iterator firstPropItEnd; std::vector<FGFloatPropertyData>::const_iterator firstPropItEnd;
@ -220,7 +219,8 @@ void FGAIMultiplayer::update(double dt)
ecPos = ((1-tau)*prevIt->second.position + tau*nextIt->second.position); ecPos = ((1-tau)*prevIt->second.position + tau*nextIt->second.position);
ecOrient = interpolate((float)tau, prevIt->second.orientation, ecOrient = interpolate((float)tau, prevIt->second.orientation,
nextIt->second.orientation); nextIt->second.orientation);
myVel = ((1-tau)*prevIt->second.linearVel + tau*nextIt->second.linearVel); speed = norm((1-tau)*prevIt->second.linearVel
+ tau*nextIt->second.linearVel) * SG_METER_TO_NM * 3600.0;
if (prevIt->second.properties.size() if (prevIt->second.properties.size()
== nextIt->second.properties.size()) { == nextIt->second.properties.size()) {
@ -266,7 +266,6 @@ void FGAIMultiplayer::update(double dt)
ecOrient = motionInfo.orientation; ecOrient = motionInfo.orientation;
SGVec3f linearVel = motionInfo.linearVel; SGVec3f linearVel = motionInfo.linearVel;
SGVec3f angularVel = motionInfo.angularVel; SGVec3f angularVel = motionInfo.angularVel;
myVel = linearVel;
while (0 < t) { while (0 < t) {
double h = 1e-1; double h = 1e-1;
if (t < h) if (t < h)
@ -277,12 +276,13 @@ void FGAIMultiplayer::update(double dt)
ecOrient += h*ecOrient.derivative(angularVel); ecOrient += h*ecOrient.derivative(angularVel);
linearVel += h*(cross(linearVel, angularVel) + motionInfo.linearAccel); linearVel += h*(cross(linearVel, angularVel) + motionInfo.linearAccel);
myVel = linearVel;
angularVel += h*motionInfo.angularAccel; angularVel += h*motionInfo.angularAccel;
t -= h; t -= h;
} }
speed = norm(linearVel) * SG_METER_TO_NM * 3600.0;
std::vector<FGFloatPropertyData>::const_iterator firstPropIt; std::vector<FGFloatPropertyData>::const_iterator firstPropIt;
std::vector<FGFloatPropertyData>::const_iterator firstPropItEnd; std::vector<FGFloatPropertyData>::const_iterator firstPropItEnd;
firstPropIt = it->second.properties.begin(); firstPropIt = it->second.properties.begin();
@ -300,13 +300,6 @@ void FGAIMultiplayer::update(double dt)
pos = SGGeod::fromCart(ecPos); pos = SGGeod::fromCart(ecPos);
altitude_ft = pos.getElevationFt(); altitude_ft = pos.getElevationFt();
// estimate speed (we care only about magnitude not direction/frame
// of reference here)
double vel_ms = sqrt( myVel[0]*myVel[0] + myVel[1]*myVel[1]
+ myVel[2]*myVel[2] );
double vel_kts = vel_ms * SG_METER_TO_NM * 3600.0;
speed = vel_kts;
// The quaternion rotating from the earth centered frame to the // The quaternion rotating from the earth centered frame to the
// horizontal local frame // horizontal local frame
SGQuatf qEc2Hl = SGQuatf::fromLonLatRad((float)pos.getLongitudeRad(), SGQuatf qEc2Hl = SGQuatf::fromLonLatRad((float)pos.getLongitudeRad(),