From f08ea4a7bbf31362ac3a0976a8adf7d13cc39335 Mon Sep 17 00:00:00 2001 From: janodesbois Date: Sun, 27 Oct 2013 19:32:58 +0100 Subject: [PATCH] velocities/u,v,wbody-fps are exposed in the property tree for the mp planes, extracted from motionInfo --- src/AIModel/AIMultiplayer.cxx | 26 ++++++++++++++++++-------- src/AIModel/AIMultiplayer.hxx | 5 +++++ 2 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/AIModel/AIMultiplayer.cxx b/src/AIModel/AIMultiplayer.cxx index 2b9c09c4e..5a13a4ff3 100644 --- a/src/AIModel/AIMultiplayer.cxx +++ b/src/AIModel/AIMultiplayer.cxx @@ -80,7 +80,10 @@ void FGAIMultiplayer::bind() { tie("controls/invisible", SGRawValuePointer(&invisible)); - + _uBodyNode = props->getNode("velocities/ubody-fps", true); + _vBodyNode = props->getNode("velocities/vbody-fps", true); + _wBodyNode = props->getNode("velocities/wbody-fps", true); + #define AIMPROProp(type, name) \ SGRawValueMethods(*this, &FGAIMultiplayer::get##name) @@ -181,6 +184,7 @@ void FGAIMultiplayer::update(double dt) SGVec3d ecPos; SGQuatf ecOrient; + SGVec3f ecLinearVel; if (tInterp <= curentPkgTime) { // Ok, we need a time prevous to the last available packet, @@ -194,7 +198,8 @@ void FGAIMultiplayer::update(double dt) MotionInfo::iterator firstIt = mMotionInfo.begin(); ecPos = firstIt->second.position; ecOrient = firstIt->second.orientation; - speed = norm(firstIt->second.linearVel) * SG_METER_TO_NM * 3600.0; + ecLinearVel = firstIt->second.linearVel; + speed = norm(ecLinearVel) * SG_METER_TO_NM * 3600.0; std::vector::const_iterator firstPropIt; std::vector::const_iterator firstPropItEnd; @@ -257,8 +262,8 @@ void FGAIMultiplayer::update(double dt) ecPos = ((1-tau)*prevIt->second.position + tau*nextIt->second.position); ecOrient = interpolate((float)tau, prevIt->second.orientation, nextIt->second.orientation); - speed = norm((1-tau)*prevIt->second.linearVel - + tau*nextIt->second.linearVel) * SG_METER_TO_NM * 3600.0; + ecLinearVel = ((1-tau)*prevIt->second.linearVel + tau*nextIt->second.linearVel); + speed = norm(ecLinearVel) * SG_METER_TO_NM * 3600.0; if (prevIt->second.properties.size() == nextIt->second.properties.size()) { @@ -343,18 +348,18 @@ void FGAIMultiplayer::update(double dt) // This must be sufficient ... ecPos = motionInfo.position; ecOrient = motionInfo.orientation; - SGVec3f linearVel = motionInfo.linearVel; + ecLinearVel = motionInfo.linearVel; SGVec3f angularVel = motionInfo.angularVel; while (0 < t) { double h = 1e-1; if (t < h) h = t; - SGVec3d ecVel = toVec3d(ecOrient.backTransform(linearVel)); + SGVec3d ecVel = toVec3d(ecOrient.backTransform(ecLinearVel)); ecPos += h*ecVel; ecOrient += h*ecOrient.derivative(angularVel); - linearVel += h*(cross(linearVel, angularVel) + motionInfo.linearAccel); + ecLinearVel += h*(cross(ecLinearVel, angularVel) + motionInfo.linearAccel); angularVel += h*motionInfo.angularAccel; t -= h; @@ -362,7 +367,7 @@ void FGAIMultiplayer::update(double dt) std::vector::const_iterator firstPropIt; std::vector::const_iterator firstPropItEnd; - speed = norm(linearVel) * SG_METER_TO_NM * 3600.0; + speed = norm(ecLinearVel) * SG_METER_TO_NM * 3600.0; firstPropIt = it->second.properties.begin(); firstPropItEnd = it->second.properties.end(); while (firstPropIt != firstPropItEnd) { @@ -433,6 +438,11 @@ void FGAIMultiplayer::update(double dt) roll = rDeg; pitch = pDeg; + // expose velocities/u,v,wbody-fps in the mp tree + _uBodyNode->setValue(ecLinearVel[0] * SG_METER_TO_FEET); + _vBodyNode->setValue(ecLinearVel[1] * SG_METER_TO_FEET); + _wBodyNode->setValue(ecLinearVel[2] * SG_METER_TO_FEET); + SG_LOG(SG_AI, SG_DEBUG, "Multiplayer position and orientation: " << ecPos << ", " << hlOr); diff --git a/src/AIModel/AIMultiplayer.hxx b/src/AIModel/AIMultiplayer.hxx index 748784995..f1fb1c82f 100644 --- a/src/AIModel/AIMultiplayer.hxx +++ b/src/AIModel/AIMultiplayer.hxx @@ -89,6 +89,11 @@ private: SGPropertyNode_ptr refuel_node; bool isTanker; bool contact; // set if this tanker is within fuelling range + + // velocities/u,v,wbody-fps + SGPropertyNode_ptr _uBodyNode; + SGPropertyNode_ptr _vBodyNode; + SGPropertyNode_ptr _wBodyNode; }; #endif // _FG_AIMultiplayer_HXX -- 2.39.5