我在三維空間中有一條線和一個三角形。換句話說,對於三角形,我有3個點([x,y,z]),對於這條線我有兩個點(也是[x,y,z])。線條和三角形之間的交點在3D中
我需要弄清楚一種方法,希望使用C++來判斷這條線是否穿過三角形。平行於三角形且具有多於一個共同點的線應被視爲「不相交」。
我已經做了一些代碼,但它不起作用,並且即使當視覺表示清楚地顯示交叉點時,我也總是得到錯誤。
ofVec3f P1, P2;
P1 = ray.s;
P2 = ray.s + ray.t;
ofVec3f p1, p2, p3;
p1 = face.getVertex(0);
p2 = face.getVertex(1);
p3 = face.getVertex(2);
ofVec3f v1 = p1 - p2;
ofVec3f v2 = p3 - p2;
float a, b, c, d;
a = v1.y * v2.z - v1.z * v2.y;
b = -(v1.x * v2.z - v1.z * v2.x);
c = v1.x * v2.y - v1.y * v2.x;
d = -(a * p1.x + b * p1.y + c * p1.z);
ofVec3f O = P1;
ofVec3f V = P2 - P1;
float t;
t = -(a * O.x + b * O.y + c * O.z + d)/(a * V.x + b * V.y + c * V.z);
ofVec3f p = O + V * t;
float xmin = std::min(P1.x, P2.x);
float ymin = std::min(P1.y, P2.y);
float zmin = std::min(P1.z, P2.z);
float xmax = std::max(P1.x, P2.x);
float ymax = std::max(P1.y, P2.y);
float zmax = std::max(P1.z, P2.z);
if (inside(p, xmin, xmax, ymin, ymax, zmin, zmax)) {
*result = p.length();
return true;
}
return false;
這裏是)內部的定義(
bool primitive3d::inside(ofVec3f p, float xmin, float xmax, float ymin, float ymax, float zmin, float zmax) const {
if (p.x >= xmin && p.x <= xmax && p.y >= ymin && p.y <= ymax && p.z >= zmin && p.z <= zmax)
return true;
return false;
}
'inside()'做什麼? – Fureeish
對不起,我編輯了我的問題添加它 –
您是否正在尋找線段/三角形,線/三角形還是射線/三角形相交?從代碼中,我會說光線/三角形,但目前的描述是線/三角形。 – user3146587