Advertisement
Guest User

Untitled

a guest
Jun 25th, 2016
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.81 KB | None | 0 0
  1. void ProcessKeyboard(Camera_Movement direction, GLfloat deltaTime,
  2. pcl::PointCloud<pcl::PointXYZRGB>::Ptr &cloud, pcl::octree::OctreePointCloudSearch<pcl::PointXYZRGB> &octree)
  3. {
  4. glm::vec3 FrontToMove(this->Front[0], this->Front[1], 0.f);
  5. glm::vec3 UpFrontToMove(0.f, 0.f, 1.f);
  6. glm::vec3 DownFrontToMove(0.f, 0.f, -1.f);
  7.  
  8. //Gömbön belül keresem a pontokat, a gömböm közepében pedig mindig a kamera van(gömböt igazítom a kamerához):
  9. mySphere->setPosition(this->Position);
  10.  
  11. //adott sugaron belüli összes pontot keresem(ezzel/ezekkel történt az ütközés)
  12. std::vector<glm::vec3> insidePoints = mySphere->getInsidePoints(cloud, octree);
  13. std::vector<glm::vec3> normalizedInsideVectors;
  14. glm::vec3 maxZPoint(0.f, 0.f, 0.f);
  15.  
  16. //a kamerából egy vektorral rámutatok ezekre és "átlagolom" az iráyukat, vagyis összeadom és a hosszal leosztom
  17. //(egységvektort kapok)
  18. for(auto point : insidePoints)
  19. {
  20. glm::vec3 vectorToPoint(point - this->Position);
  21. glm::vec3 normalizedVectorToPoint(glm::normalize(vectorToPoint));
  22.  
  23. if(point.z > maxZPoint.z) maxZPoint = point; //közben keresme hogy melyik pont van a legmagasabban az összes közül(Z koord a legnagyobb)
  24.  
  25. normalizedInsideVectors.push_back(normalizedVectorToPoint);
  26. }
  27.  
  28. GLfloat velocity = this->MovementSpeed * deltaTime;
  29.  
  30. if(normalizedInsideVectors.size() > 0)
  31. {
  32. //Adott irányú sebességvektorok:
  33. glm::vec3 frontSpeedVector(this->Front * velocity);
  34. glm::vec3 rightSpeedVector(this->Right * velocity);
  35. glm::vec3 upSpeedVector(UpFrontToMove * velocity);
  36.  
  37. glm::vec3 sumOfNormalizedVectors(0.f, 0.f, 0.f);
  38.  
  39. //Itt történik az átlagolás második része:
  40. for(auto normalizedVectorToPoint : normalizedInsideVectors)
  41. {
  42. sumOfNormalizedVectors += normalizedVectorToPoint;
  43. }
  44.  
  45. glm::vec3 normalizedAvgVector = glm::normalize(sumOfNormalizedVectors);
  46.  
  47. //Ütközés irányú sebességkomponens (előre definiált sebességvektorok mellett)
  48. glm::vec3 frontComponent(normalizedAvgVector * normalizedAvgVector * frontSpeedVector);
  49. glm::vec3 rightComponent(normalizedAvgVector * normalizedAvgVector * rightSpeedVector);
  50. glm::vec3 upComponent(normalizedAvgVector * normalizedAvgVector * frontSpeedVector);
  51.  
  52. //HA az ütközés irányú sebességkomponens és az ütközés irányú vektor bezárt szöge kisebb, mint 90 fok, akkor
  53. //az eredetiből kivonom ezt a komponenst
  54. //Ellenkező esetben nem közeledtem a ponthoz, hanem távolodtam tőle, ezért nem kell kivonni.
  55. if(glm::acos((frontComponent * normalizedAvgVector) / glm::length(frontComponent) * glm::length(normalizedAvgVector))[0] < 90.f)
  56. frontSpeedVector -= frontComponent;
  57.  
  58. if(glm::acos((rightComponent * normalizedAvgVector) / glm::length(rightComponent) * glm::length(normalizedAvgVector))[0] < 90.f)
  59. rightSpeedVector -= rightComponent;
  60.  
  61. if(glm::acos((upComponent * normalizedAvgVector) / glm::length(upComponent) * glm::length(normalizedAvgVector))[0] < 90.f)
  62. upSpeedVector -= upComponent;
  63.  
  64. //Végül a billentyűzeről kapott irányítási információ szerinti mozgatás már a megfelelő vektorral:
  65. if (direction == FORWARD)
  66. this->Position += frontSpeedVector;
  67. if (direction == BACKWARD)
  68. this->Position -= frontSpeedVector;
  69. if (direction == LEFT)
  70. this->Position -= rightSpeedVector;
  71. if (direction == RIGHT)
  72. this->Position += rightSpeedVector;
  73. if (direction == UP)
  74. this->Position += upSpeedVector;
  75.  
  76. //magasság beállítása (600 itt most a gömb sugara, 350 az a tényező ami alapján ütközésnek, vagy megmászható objektumnak tekintjük
  77. // az adott pontot tartalmazó "objektumot", ezt lehet finomítani/testre szabni)
  78. if(std::abs(glm::length(maxZPoint - this->Position)) < 350) this->Position.z = maxZPoint.z + 600;
  79. }
  80. else
  81. {
  82. //Ha semmilyen ponttal nem érintkezek, akkor csak sima mozgatás:
  83. if (direction == FORWARD)
  84. this->Position += this->Front * velocity;
  85. if (direction == BACKWARD)
  86. this->Position -= this->Front * velocity;
  87. if (direction == LEFT)
  88. this->Position -= this->Right * velocity;
  89. if (direction == RIGHT)
  90. this->Position += this->Right * velocity;
  91. if (direction == UP)
  92. this->Position += UpFrontToMove * velocity;
  93. }
  94.  
  95. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement