TrackPoint.cpp 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Include own headers
  2. #include "TrackPoint.hpp"
  3. // Include dependencies
  4. #include <osg/Geode>
  5. #include <osg/ShapeDrawable>
  6. #include <osg/Material>
  7. #include <osg/StateSet>
  8. TrackPoint::TrackPoint(osg::Vec3 point, osg::Vec3 normal) {
  9. osg::ref_ptr<osg::Geode> geode = new osg::Geode;
  10. osg::ref_ptr<osg::ShapeDrawable> cylinder = new osg::ShapeDrawable();
  11. cylinder->setShape(new osg::Cylinder(osg::Vec3(0.0f, 0.0f, 0.0f), 1.0f, 10.0f));
  12. cylinder->setColor(osg::Vec4(0.0f, 1.0f, 0.0f, 1.0f));
  13. geode->addDrawable(cylinder.get());
  14. {
  15. osg::StateSet* stateSet = geode->getOrCreateStateSet();
  16. osg::Material* material = new osg::Material;
  17. material->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE);
  18. stateSet->setAttributeAndModes(material, osg::StateAttribute::ON);
  19. stateSet->setMode(GL_DEPTH_TEST, osg::StateAttribute::ON);
  20. }
  21. _rotationGroup = new osg::MatrixTransform;
  22. _rotationGroup->addChild(geode.get());
  23. _rotationGroup->setMatrix(osg::Matrix::rotate(osg::Vec3f(0.0f, 0.0f, 1.0f), normal));
  24. _originFixGroup = new osg::MatrixTransform;
  25. _originFixGroup->addChild(_rotationGroup.get());
  26. osg::Vec3f movementVector = normal.operator*(5.0f);
  27. _originFixGroup->setMatrix(osg::Matrix::translate(movementVector));
  28. _translationGroup = new osg::MatrixTransform;
  29. _translationGroup->addChild(_originFixGroup.get());
  30. _translationGroup->setMatrix(osg::Matrix::translate(point));
  31. _origin = point;
  32. _normal = normal;
  33. osg::Vec3 shift = normal.operator*(10.0f);
  34. _trackOrigin = shift.operator+(point);
  35. printf("TrackPoint is at %lf %lf %lf\n", _trackOrigin.x(), _trackOrigin.y(), _trackOrigin.z());
  36. }
  37. osg::ref_ptr<osg::MatrixTransform> TrackPoint::getUppermostRoot() {
  38. return _translationGroup.get();
  39. }
  40. osg::Vec3 TrackPoint::getTranslation() {
  41. return _origin;
  42. }
  43. osg::Vec3 TrackPoint::getRotation() {
  44. printf("YNorm: %lf %lf %lf\n", _normal.x(), _normal.y(), _normal.z());
  45. osg::Vec3 start = osg::Vec3(0.0f, 0.0f, 1.0f);
  46. // From https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles
  47. osg::Quat quat = osg::Quat(0.0f, 0.0f, 0.0f, 0.0f);
  48. quat.makeRotate(start, _normal);
  49. float sinr_cosp = 2 * (quat.w() * quat.x() + quat.y() * quat.z());
  50. float cosr_cosp = 1 - 2 * (quat.x() * quat.x() + quat.y() * quat.y());
  51. float xRotation = std::atan2(sinr_cosp, cosr_cosp) * 180.0 / M_PI;
  52. float sinp = 2 * (quat.w() * quat.y() - quat.z() * quat.x());
  53. float yRotation;
  54. if (std::abs(sinp) >= 1) {
  55. yRotation = std::copysign(M_PI / 2, sinp) * 180.0 / M_PI;
  56. } else {
  57. yRotation = std::asin(sinp) * 180.0 / M_PI;
  58. }
  59. float siny_cosp = 2 * (quat.w() * quat.z() + quat.x() * quat.y());
  60. float cosy_cosp = 1 - 2 * (quat.y() * quat.y() + quat.z() * quat.z());
  61. float zRotation = std::atan2(siny_cosp, cosy_cosp) * 180.0 / M_PI;
  62. return osg::Vec3(xRotation, yRotation, zRotation);
  63. }
  64. osg::Vec3 TrackPoint::getTrackPoint() {
  65. return _trackOrigin;
  66. }