kick
|
00001 // 00002 // Created by Morten Nobel-Jørgensen on 01/08/14. 00003 // 00004 00005 #include "plane.h" 00006 #include "ray.h" 00007 00008 namespace kick { 00009 00010 Plane::Plane() : plane{1,0,0,0} { 00011 } 00012 00013 Plane::Plane(glm::vec3 normal_, glm::vec3 pointInPlane) 00014 :plane(normal_, -dot(normal_, pointInPlane)) 00015 { 00016 } 00017 00018 Plane::Plane(float x, float y, float z, float offset) : plane{x,y,z, offset} { 00019 } 00020 00021 Plane::Plane(glm::vec3 normal_, float offset) 00022 : plane{normal_, offset} { 00023 } 00024 00025 00026 glm::vec3 Plane::normal() const { 00027 return (glm::vec3)plane; 00028 } 00029 00030 void Plane::setNormal(glm::vec3 p) { 00031 for (int i=0;i<3;i++){ 00032 plane[i] = p[i]; 00033 } 00034 } 00035 00036 float Plane::offset() const { 00037 return plane.w; 00038 } 00039 00040 void Plane::setOffset(float d) { 00041 plane.w = d; 00042 } 00043 00044 glm::vec3 Plane::pointOnPlane() const { 00045 return normal() * -offset(); 00046 } 00047 00048 float Plane::distanceToPlane(glm::vec3 point) const { 00049 return glm::dot(normal(), point) + offset(); 00050 } 00051 00052 float Plane::intersection(const Ray& line) const { 00053 using namespace std; 00054 glm::vec3 v0 = pointOnPlane(); 00055 glm::vec3 n = glm::normalize(normal()); 00056 glm::vec3 u = glm::normalize(line.point(1) - line.origin()); 00057 const double epsilon = 1e-10; 00058 double uDotN = glm::dot(u, n); 00059 if (abs(uDotN) < epsilon){ 00060 return NAN; 00061 } 00062 00063 return glm::dot(n, (v0- line.origin())) / uDotN; 00064 } 00065 00066 glm::vec3 Plane::intersectionPoint(const Ray& line) const { 00067 float res = intersection(line); 00068 return line.point(res); 00069 } 00070 }