- prepared for Fancy Camera
git-svn-id: http://moon:8086/svn/software/trunk/projects/FsTrack@169 b431acfa-c32f-4a4a-93f1-934dc6c82436
This commit is contained in:
+87
-3
@@ -4,11 +4,13 @@
|
|||||||
|
|
||||||
#include "Kml.hpp"
|
#include "Kml.hpp"
|
||||||
|
|
||||||
|
//#define WITH_FANCY_CAMERA
|
||||||
|
|
||||||
Kml::Kml(const char *pDocRoot)
|
Kml::Kml(const char *pDocRoot)
|
||||||
: kml(nullptr)
|
: kml(nullptr)
|
||||||
, m_pPlanePlaceMark(nullptr)
|
, m_pPlanePlaceMark(nullptr)
|
||||||
, m_pPathPlaceMark(nullptr)
|
, m_pPathPlaceMark(nullptr)
|
||||||
|
, m_pCameraPlaceMark(nullptr)
|
||||||
, m_docRoot(pDocRoot)
|
, m_docRoot(pDocRoot)
|
||||||
, m_altitudeModeString("absolute")
|
, m_altitudeModeString("absolute")
|
||||||
, m_pathColorString("0xff00ffff")
|
, m_pathColorString("0xff00ffff")
|
||||||
@@ -42,7 +44,6 @@ void Kml::create()
|
|||||||
kml = new XmlElement("kml");
|
kml = new XmlElement("kml");
|
||||||
XmlElement *pNetworkLinkControl = kml->createNewChildElement("NetworkLinkControl");
|
XmlElement *pNetworkLinkControl = kml->createNewChildElement("NetworkLinkControl");
|
||||||
pNetworkLinkControl->createNewChildElement("LinkName")->addTextElement("FsTrack");
|
pNetworkLinkControl->createNewChildElement("LinkName")->addTextElement("FsTrack");
|
||||||
XmlElement *pCamera = pNetworkLinkControl->createNewChildElement("Camera");
|
|
||||||
XmlElement *pDoc = kml->createNewChildElement("Document");
|
XmlElement *pDoc = kml->createNewChildElement("Document");
|
||||||
XmlElement *pFile = kml->getChildByName("Document")->createNewChildElement("filename");
|
XmlElement *pFile = kml->getChildByName("Document")->createNewChildElement("filename");
|
||||||
XmlElement *pSnippet = kml->getChildByName("Document")->createNewChildElement("Snippet");
|
XmlElement *pSnippet = kml->getChildByName("Document")->createNewChildElement("Snippet");
|
||||||
@@ -62,6 +63,7 @@ void Kml::create()
|
|||||||
pSnippet->addTextElement(time_str);
|
pSnippet->addTextElement(time_str);
|
||||||
|
|
||||||
// Camera
|
// Camera
|
||||||
|
XmlElement *pCamera = pNetworkLinkControl->createNewChildElement("Camera");
|
||||||
pCamera->createNewChildElement("longitude")->addTextElement("0");
|
pCamera->createNewChildElement("longitude")->addTextElement("0");
|
||||||
pCamera->createNewChildElement("latitude")->addTextElement("0");
|
pCamera->createNewChildElement("latitude")->addTextElement("0");
|
||||||
pCamera->createNewChildElement("altitude")->addTextElement("0");
|
pCamera->createNewChildElement("altitude")->addTextElement("0");
|
||||||
@@ -77,6 +79,7 @@ void Kml::destroy()
|
|||||||
kml = nullptr;
|
kml = nullptr;
|
||||||
m_pPlanePlaceMark = nullptr;
|
m_pPlanePlaceMark = nullptr;
|
||||||
m_pPathPlaceMark = nullptr;
|
m_pPathPlaceMark = nullptr;
|
||||||
|
m_pCameraPlaceMark = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Kml::setAltitudeMode(String const &modeString)
|
void Kml::setAltitudeMode(String const &modeString)
|
||||||
@@ -120,7 +123,6 @@ void Kml::setCameraTilt(float tilt_deg)
|
|||||||
|
|
||||||
void Kml::update(FlightData const &flightData)
|
void Kml::update(FlightData const &flightData)
|
||||||
{
|
{
|
||||||
const ScopedLock sl (m_lock);
|
|
||||||
updatePlane(flightData);
|
updatePlane(flightData);
|
||||||
updatePath(flightData);
|
updatePath(flightData);
|
||||||
}
|
}
|
||||||
@@ -137,6 +139,8 @@ void Kml::setCameraAutoRoll(bool enable)
|
|||||||
|
|
||||||
void Kml::updatePlane(FlightData const &flightData)
|
void Kml::updatePlane(FlightData const &flightData)
|
||||||
{
|
{
|
||||||
|
const ScopedLock sl (m_lock);
|
||||||
|
|
||||||
char temp_str[1024];
|
char temp_str[1024];
|
||||||
|
|
||||||
XmlElement *pDoc = kml->getChildByName("Document");
|
XmlElement *pDoc = kml->getChildByName("Document");
|
||||||
@@ -159,7 +163,7 @@ void Kml::updatePlane(FlightData const &flightData)
|
|||||||
|
|
||||||
XmlElement *pCamera;
|
XmlElement *pCamera;
|
||||||
|
|
||||||
if(pPlacemark == NULL)
|
if(pPlacemark == nullptr)
|
||||||
{
|
{
|
||||||
// Placemark
|
// Placemark
|
||||||
pPlacemark = pDoc->createNewChildElement("Placemark");
|
pPlacemark = pDoc->createNewChildElement("Placemark");
|
||||||
@@ -244,20 +248,100 @@ void Kml::updatePlane(FlightData const &flightData)
|
|||||||
|
|
||||||
if (m_cameraAutoHeading)
|
if (m_cameraAutoHeading)
|
||||||
pCamera->getChildByName("heading")->getFirstChildElement()->setText(String(flightData.hdgTrue_deg));
|
pCamera->getChildByName("heading")->getFirstChildElement()->setText(String(flightData.hdgTrue_deg));
|
||||||
|
else
|
||||||
|
pCamera->getChildByName("heading")->getFirstChildElement()->setText("0");
|
||||||
|
|
||||||
pCamera->getChildByName("tilt")->getFirstChildElement()->setText(String(m_cameraTilt));
|
pCamera->getChildByName("tilt")->getFirstChildElement()->setText(String(m_cameraTilt));
|
||||||
|
|
||||||
if (m_cameraAutoRoll)
|
if (m_cameraAutoRoll)
|
||||||
pCamera->getChildByName("roll")->getFirstChildElement()->setText(String(flightData.bank_deg));
|
pCamera->getChildByName("roll")->getFirstChildElement()->setText(String(flightData.bank_deg));
|
||||||
|
else
|
||||||
|
pCamera->getChildByName("roll")->getFirstChildElement()->setText("0");
|
||||||
|
|
||||||
pCamera->getChildByName("altitudeMode")->getFirstChildElement()->setText(m_altitudeModeString);
|
pCamera->getChildByName("altitudeMode")->getFirstChildElement()->setText(m_altitudeModeString);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WITH_FANCY_CAMERA
|
||||||
|
if (m_pCameraPlaceMark == nullptr)
|
||||||
|
{
|
||||||
|
|
||||||
|
// Placemark
|
||||||
|
m_pCameraPlaceMark = pDoc->createNewChildElement("Placemark");
|
||||||
|
m_pCameraPlaceMark->setAttribute("id", "Cam");
|
||||||
|
m_pCameraPlaceMark->createNewChildElement("name")->addTextElement("Camera");
|
||||||
|
pPoint = m_pCameraPlaceMark->createNewChildElement("Point");
|
||||||
|
pPoint->setAttribute("id", "CamPoint");
|
||||||
|
sprintf(temp_str, "%9.6f,%9.6f,%9.6f", flightData.lon, flightData.lat, flightData.alt_meter);
|
||||||
|
pPoint->createNewChildElement("coordinates")->addTextElement(temp_str);
|
||||||
|
pPoint->createNewChildElement("altitudeMode")->addTextElement(m_altitudeModeString);
|
||||||
|
|
||||||
|
// Name
|
||||||
|
pName = m_pCameraPlaceMark->createNewChildElement("name");
|
||||||
|
pName->addTextElement("Loxo");
|
||||||
|
|
||||||
|
// Style
|
||||||
|
pStyle = m_pCameraPlaceMark->createNewChildElement("Style");
|
||||||
|
|
||||||
|
// LineStyle
|
||||||
|
XmlElement *pLineStyle = pStyle->createNewChildElement("LineStyle");
|
||||||
|
XmlElement *pLineColor = pLineStyle->createNewChildElement("color");
|
||||||
|
pLineColor->addTextElement("0xff0000ff");
|
||||||
|
|
||||||
|
XmlElement *pLineWidth = pLineStyle->createNewChildElement("width");
|
||||||
|
pLineWidth->addTextElement("1");
|
||||||
|
|
||||||
|
// LineString
|
||||||
|
XmlElement *pLineString = m_pCameraPlaceMark->createNewChildElement("LineString");
|
||||||
|
pExtrude = pLineString->createNewChildElement("extrude");
|
||||||
|
pExtrude->addTextElement("1");
|
||||||
|
pTesselate = pLineString->createNewChildElement("tesselate");
|
||||||
|
pTesselate->addTextElement("1");
|
||||||
|
pAltitudeMode = pLineString->createNewChildElement("altitudeMode");
|
||||||
|
pAltitudeMode->addTextElement("clampToGround");
|
||||||
|
pCoords = pLineString->createNewChildElement("coordinates");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const double pi = 3.14159265359;
|
||||||
|
double r = flightData.alt_meter;
|
||||||
|
double theta = flightData.lat/180*pi; // 0 = Equator
|
||||||
|
double phi = flightData.lon/180*pi; // 0 = Greenwich
|
||||||
|
double hdg = flightData.hdgTrue_deg/180*pi;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sprintf(temp_str, "%9.6f,%9.6f,%9.6f", phi/pi*180, theta/pi*180, r);
|
||||||
|
pCoords = m_pCameraPlaceMark->getChildByName("Point")->getChildByName("coordinates");
|
||||||
|
pCoords->deleteAllTextElements();
|
||||||
|
pCoords->addTextElement(temp_str);
|
||||||
|
m_pCameraPlaceMark->getChildByName("Point")->getChildByName("altitudeMode")->getFirstChildElement()->setText("clampToGround");
|
||||||
|
|
||||||
|
// Coordinates
|
||||||
|
pCoords = m_pCameraPlaceMark->getChildByName("LineString")->getChildByName("coordinates");
|
||||||
|
if (!pCoords)
|
||||||
|
{
|
||||||
|
pCoords = m_pCameraPlaceMark->getChildByName("LineString")->createNewChildElement("coordinates");
|
||||||
|
}
|
||||||
|
pCoords->deleteAllTextElements();
|
||||||
|
|
||||||
|
double k = 1.0/tan(hdg);
|
||||||
|
for (int i=0; i < 100; i++)
|
||||||
|
{
|
||||||
|
|
||||||
|
sprintf(temp_str, "%9.6f,%9.6f,%9.6f\n", phi/pi*180, theta/pi*180, r);
|
||||||
|
pCoords->addTextElement(temp_str);
|
||||||
|
theta = asin(tanh(k*phi)) + flightData.lat/180*pi;
|
||||||
|
phi += pi/10000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void Kml::updatePath(FlightData const &flightData)
|
void Kml::updatePath(FlightData const &flightData)
|
||||||
{
|
{
|
||||||
|
const ScopedLock sl (m_lock);
|
||||||
|
|
||||||
char temp_str[1024];
|
char temp_str[1024];
|
||||||
|
|
||||||
XmlElement *pDoc = kml->getChildByName("Document");
|
XmlElement *pDoc = kml->getChildByName("Document");
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ private:
|
|||||||
ScopedPointer<XmlElement> kml;
|
ScopedPointer<XmlElement> kml;
|
||||||
XmlElement *m_pPlanePlaceMark;
|
XmlElement *m_pPlanePlaceMark;
|
||||||
XmlElement *m_pPathPlaceMark;
|
XmlElement *m_pPathPlaceMark;
|
||||||
|
XmlElement *m_pCameraPlaceMark;
|
||||||
char m_path[1024];
|
char m_path[1024];
|
||||||
const char *m_docRoot;
|
const char *m_docRoot;
|
||||||
String m_altitudeModeString;
|
String m_altitudeModeString;
|
||||||
|
|||||||
Reference in New Issue
Block a user