Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void ProcessKeyboard(Camera_Movement direction, GLfloat deltaTime,
- pcl::PointCloud<pcl::PointXYZRGB>::Ptr &cloud, pcl::octree::OctreePointCloudSearch<pcl::PointXYZRGB> &octree)
- {
- glm::vec3 FrontToMove(this->Front[0], this->Front[1], 0.f);
- glm::vec3 UpFrontToMove(0.f, 0.f, 1.f);
- glm::vec3 DownFrontToMove(0.f, 0.f, -1.f);
- //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):
- mySphere->setPosition(this->Position);
- //adott sugaron belüli összes pontot keresem(ezzel/ezekkel történt az ütközés)
- std::vector<glm::vec3> insidePoints = mySphere->getInsidePoints(cloud, octree);
- std::vector<glm::vec3> normalizedInsideVectors;
- glm::vec3 maxZPoint(0.f, 0.f, 0.f);
- //a kamerából egy vektorral rámutatok ezekre és "átlagolom" az iráyukat, vagyis összeadom és a hosszal leosztom
- //(egységvektort kapok)
- for(auto point : insidePoints)
- {
- glm::vec3 vectorToPoint(point - this->Position);
- glm::vec3 normalizedVectorToPoint(glm::normalize(vectorToPoint));
- 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)
- normalizedInsideVectors.push_back(normalizedVectorToPoint);
- }
- GLfloat velocity = this->MovementSpeed * deltaTime;
- if(normalizedInsideVectors.size() > 0)
- {
- //Adott irányú sebességvektorok:
- glm::vec3 frontSpeedVector(this->Front * velocity);
- glm::vec3 rightSpeedVector(this->Right * velocity);
- glm::vec3 upSpeedVector(UpFrontToMove * velocity);
- glm::vec3 sumOfNormalizedVectors(0.f, 0.f, 0.f);
- //Itt történik az átlagolás második része:
- for(auto normalizedVectorToPoint : normalizedInsideVectors)
- {
- sumOfNormalizedVectors += normalizedVectorToPoint;
- }
- glm::vec3 normalizedAvgVector = glm::normalize(sumOfNormalizedVectors);
- //Ütközés irányú sebességkomponens (előre definiált sebességvektorok mellett)
- glm::vec3 frontComponent(normalizedAvgVector * normalizedAvgVector * frontSpeedVector);
- glm::vec3 rightComponent(normalizedAvgVector * normalizedAvgVector * rightSpeedVector);
- glm::vec3 upComponent(normalizedAvgVector * normalizedAvgVector * frontSpeedVector);
- //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
- //az eredetiből kivonom ezt a komponenst
- //Ellenkező esetben nem közeledtem a ponthoz, hanem távolodtam tőle, ezért nem kell kivonni.
- if(glm::acos((frontComponent * normalizedAvgVector) / glm::length(frontComponent) * glm::length(normalizedAvgVector))[0] < 90.f)
- frontSpeedVector -= frontComponent;
- if(glm::acos((rightComponent * normalizedAvgVector) / glm::length(rightComponent) * glm::length(normalizedAvgVector))[0] < 90.f)
- rightSpeedVector -= rightComponent;
- if(glm::acos((upComponent * normalizedAvgVector) / glm::length(upComponent) * glm::length(normalizedAvgVector))[0] < 90.f)
- upSpeedVector -= upComponent;
- //Végül a billentyűzeről kapott irányítási információ szerinti mozgatás már a megfelelő vektorral:
- if (direction == FORWARD)
- this->Position += frontSpeedVector;
- if (direction == BACKWARD)
- this->Position -= frontSpeedVector;
- if (direction == LEFT)
- this->Position -= rightSpeedVector;
- if (direction == RIGHT)
- this->Position += rightSpeedVector;
- if (direction == UP)
- this->Position += upSpeedVector;
- //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
- // az adott pontot tartalmazó "objektumot", ezt lehet finomítani/testre szabni)
- if(std::abs(glm::length(maxZPoint - this->Position)) < 350) this->Position.z = maxZPoint.z + 600;
- }
- else
- {
- //Ha semmilyen ponttal nem érintkezek, akkor csak sima mozgatás:
- if (direction == FORWARD)
- this->Position += this->Front * velocity;
- if (direction == BACKWARD)
- this->Position -= this->Front * velocity;
- if (direction == LEFT)
- this->Position -= this->Right * velocity;
- if (direction == RIGHT)
- this->Position += this->Right * velocity;
- if (direction == UP)
- this->Position += UpFrontToMove * velocity;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement