X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FAIModel%2FAIBase.cxx;h=b1dca66e790f2fdda3d4037eef64b07eb7657c40;hb=479d4d7484f6aabd4f4e5bb5ece9c6499272ed51;hp=8ec57b527df2ae9f244404ed6ef49959909c3983;hpb=5bd2ef1edbbe61e9c5775810ddf4f0ef546f6b3c;p=flightgear.git diff --git a/src/AIModel/AIBase.cxx b/src/AIModel/AIBase.cxx index 8ec57b527..b1dca66e7 100644 --- a/src/AIModel/AIBase.cxx +++ b/src/AIModel/AIBase.cxx @@ -15,7 +15,7 @@ // // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software -// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #ifdef HAVE_CONFIG_H @@ -49,13 +49,13 @@ const double FGAIBase::e = 2.71828183; const double FGAIBase::lbs_to_slugs = 0.031080950172; //conversion factor -FGAIBase::FGAIBase() +FGAIBase::FGAIBase(object_type ot) : fp( NULL ), props( NULL ), manager( NULL ), - _refID( _newAIModelID() ) + _refID( _newAIModelID() ), + _otype(ot) { - _type_str = "model"; tgt_heading = hdg = tgt_altitude = tgt_speed = 0.0; tgt_roll = roll = tgt_pitch = tgt_yaw = tgt_vs = vs = pitch = 0.0; bearing = elevation = range = rdot = 0.0; @@ -64,9 +64,6 @@ FGAIBase::FGAIBase() invisible = true; no_roll = true; life = 900; - model_path = ""; - _otype = otNull; - index = 0; delete_me = false; } @@ -76,11 +73,29 @@ FGAIBase::~FGAIBase() { globals->get_scenery()->unregister_placement_transform(aip.getTransform()); globals->get_scenery()->get_scene_graph()->removeKid(aip.getSceneGraph()); } - // unbind(); - SGPropertyNode *root = globals->get_props()->getNode("ai/models", true); - root->removeChild(_type_str.c_str(), index); + if (props) { + SGPropertyNode* parent = props->getParent(); + if (parent) + parent->removeChild(props->getName(), props->getIndex(), false); + } delete fp; - fp = NULL; + fp = 0; +} + + +void FGAIBase::readFromScenario(SGPropertyNode* scFileNode) +{ + if (!scFileNode) + return; + + setPath(scFileNode->getStringValue("model", "Models/Geometry/glider.ac")); + + setHeading(scFileNode->getDoubleValue("heading", 0.0)); + setSpeed(scFileNode->getDoubleValue("speed", 0.0)); + setAltitude(scFileNode->getDoubleValue("altitude", 0.0)); + setLongitude(scFileNode->getDoubleValue("longitude", 0.0)); + setLatitude(scFileNode->getDoubleValue("latitude", 0.0)); + setBank(scFileNode->getDoubleValue("roll", 0.0)); } void FGAIBase::update(double dt) { @@ -106,20 +121,13 @@ void FGAIBase::Transform() { bool FGAIBase::init() { - SGPropertyNode *root = globals->get_props()->getNode("ai/models", true); - - index = manager->getNum(_otype) - 1; - props = root->getNode(_type_str.c_str(), index, true); - - if (model_path != "") { - try { - model = load3DModel( globals->get_fg_root(), - SGPath(model_path).c_str(), - props, - globals->get_sim_time_sec() ); - } catch (const sg_exception &e) { + if (!model_path.empty()) { + try { + model = load3DModel( globals->get_fg_root(), model_path, props, + globals->get_sim_time_sec() ); + } catch (const sg_exception &e) { model = NULL; - } + } } if (model) { aip.init( model ); @@ -129,7 +137,7 @@ bool FGAIBase::init() { // Register that one at the scenery manager globals->get_scenery()->register_placement_transform(aip.getTransform()); } else { - if (model_path != "") { + if (!model_path.empty()) { SG_LOG(SG_INPUT, SG_WARN, "AIBase: Could not load model " << model_path); } } @@ -321,35 +329,23 @@ double FGAIBase::UpdateRadar(FGAIManager* manager) return range_ft2; } -Point3D -FGAIBase::getCartPosAt(const Point3D& off) const +SGVec3d +FGAIBase::getCartPosAt(const SGVec3d& _off) const { - // The offset converted to the usual body fixed coordinate system. - sgdVec3 sgdOff; - sgdSetVec3(sgdOff, -off.x(), off.z(), -off.y()); - // Transform that one to the horizontal local coordinate system. - sgdMat4 hlTrans; - sgdMakeRotMat4(hlTrans, hdg, pitch, roll); - sgdXformPnt3(sgdOff, hlTrans); - - // Now transform to the wgs84 earth centeres system. - Point3D pos2(pos.lon()* SGD_DEGREES_TO_RADIANS, - pos.lat() * SGD_DEGREES_TO_RADIANS, - pos.elev()); - Point3D cartPos3D = sgGeodToCart(pos2); - sgdMat4 ecTrans; - sgdMakeCoordMat4(ecTrans, cartPos3D.x(), cartPos3D.y(), cartPos3D.z(), - pos.lon(), 0, - 90 - pos.lat()); - sgdXformPnt3(sgdOff, ecTrans); - - return Point3D(sgdOff[0], sgdOff[1], sgdOff[2]); -} + SGQuatd hlTrans = SGQuatd::fromLonLatDeg(pos.lon(), pos.lat()); + // and postrotate the orientation of the AIModel wrt the horizontal + // local frame + hlTrans *= SGQuatd::fromYawPitchRollDeg(hdg, pitch, roll); -Point3D -FGAIBase::getGeocPosAt(const Point3D& off) const -{ - return sgCartToGeod(getCartPosAt(off)); + // The offset converted to the usual body fixed coordinate system + // rotated to the earth fiexed coordinates axis + SGVec3d off = hlTrans.backTransform(_off); + + // Add the position offset of the AIModel to gain the earth centered position + SGVec3d cartPos = SGGeod::fromDegFt(pos.lon(), pos.lat(), pos.elev()); + + return cartPos + off; } /*