glm::intersectRaySphereで球とレイの交点を算出できる。
この関数があるので自前実装にはあまり意味がない。
欠点はレイの始点に近い方の点しか取れない所。ただし普通の用途では問題ない。
#include <iostream> #include <gl/glm-0.9.9/gtx/string_cast.hpp> #include <gl/glm-0.9.9/glm.hpp> // 球とRay , 面とRayの交差判定に必要 #include <gl/glm-0.9.9/gtx/intersect.hpp> int main() { ///////////////////////////// ////// 球と線分の交点 /////// ///////////////////////////// // テスト値を設定 const glm::vec3 center{ -2.72692 ,-2.51743,3.0258 }; const float r = 2.44975f; const glm::vec3 from{ 1.69882,-1.63121,3.75584 }; const glm::vec3 to{ -7.42946 ,-4.48611 ,2.84412 }; const glm::vec3 raynorm = glm::normalize(to - from); // 球と線分の交点を格納 glm::vec3 CROSS; float direction;// fromからの距離 if (glm::intersectRaySphere(from, raynorm, center, glm::pow(r, 2), direction) == true) { // fromに近い方の頂点が取得可能 CROSS = from + raynorm * direction; std::cout << glm::to_string(CROSS); // 出力結果 // vec3(-0.346964, -2.271036, 3.551510) } else { std::cout << "交差していない"; } }