C++11 OpenGL中矢量与面的求交
我有一个地形和一个应该在地形上移动的物体,所以我做了一个功能,可以检测哪个面是位于上面的物体的原点,所以我应该设置物体的Y,以及物体原点与面垂直的向量之间的交点的准确高度,我有面的三个顶点,所以我可以计算它的法线、原点、最大点和最小点(有界框) 编辑: 另一种形式的问题是: 如果我知道三维空间中三角形上某个点的x和z,如果它是三角形中的某个点,我怎么知道它是y呢? 这就是实现:C++11 OpenGL中矢量与面的求交,c++11,math,linear-algebra,C++11,Math,Linear Algebra,我有一个地形和一个应该在地形上移动的物体,所以我做了一个功能,可以检测哪个面是位于上面的物体的原点,所以我应该设置物体的Y,以及物体原点与面垂直的向量之间的交点的准确高度,我有面的三个顶点,所以我可以计算它的法线、原点、最大点和最小点(有界框) 编辑: 另一种形式的问题是: 如果我知道三维空间中三角形上某个点的x和z,如果它是三角形中的某个点,我怎么知道它是y呢? 这就是实现: bool EngineItem::checkIntersection(glm::vec3& rayOrigi
bool EngineItem::checkIntersection(glm::vec3& rayOrigin, glm::vec3& rayVector, Face& face, glm::vec3& point) {
const float EPSILON = 0.0000001;
glm::vec3 vertex0 = face.v1;
glm::vec3 vertex1 = face.v2;
glm::vec3 vertex2 = face.v3;
glm::vec3 edge1, edge2, h, s, q;
float a, f, u, v;
edge1 = vertex1 - vertex0;
edge2 = vertex2 - vertex0;
h = glm::cross(rayVector, edge2);
a = glm::dot(edge1, h);
if (a > -EPSILON && a < EPSILON)
return false;
f = 1 / a;
s = rayOrigin - vertex0;
u = f * glm::dot(s, h);
if (u < 0.0 || u > 1.0)
return false;
q = glm::cross(s, edge1);
v = f * glm::dot(rayVector, q);
if (v < 0.0 || u + v > 1.0)
return false;
float t = f * glm::dot(edge2, q);
if (t > EPSILON) {
glm::vec3 plus = glm::normalize(rayVector) * (t * glm::length(rayVector));
point = rayOrigin + plus;
return true;
} else
return false;
}
bool EngineItem::checkIntersection(glm::vec3和光线原点,glm::vec3和光线向量,面和面,glm::vec3和点){
常量浮点ε=0.0000001;
glm::vec3顶点0=face.v1;
glm::vec3 vertex1=face.v2;
glm::vec3 vertex2=face.v3;
glm::vec3边1、边2、h、s、q;
浮子a、f、u、v;
边1=顶点1-顶点0;
边2=顶点2-顶点0;
h=glm::交叉(光线向量,边2);
a=glm::dot(边1,h);
if(a>-EPSILON&&a1.0)
返回false;
q=glm::交叉(s,边1);
v=f*glm::dot(光线矢量,q);
如果(v<0.0 | | u+v>1.0)
返回false;
浮点数t=f*glm::dot(边2,q);
if(t>EPSILON){
glm::vec3 plus=glm::规格化(光线向量)*(t*glm::长度(光线向量));
点=光线原点+加号;
返回true;
}否则
返回false;
}
执行标准的光线三角形相交?请将您的答案作为答案发布,而不是在问题中发布