3D空間のどこかに線と三角形があります。言い換えれば、私は三角形の3点(それぞれ[x、y、z])とその線の2つの点([x、y、z])を持っています。3Dの線と三角間の交差
私は、線が三角形を横切るかどうかを判断するために、C++を使ってうまくいけばよい方法を見つけ出す必要があります。三角形に平行で、複数の点が共通する線は、「交差しない」と数えます。
私はすでにいくつかのコードを作っていますが、それはうまくいかず、視覚的な表現が明確に交差点を示しても、私は常にfalseになります。
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
申し訳ありません、私の質問を編集して追加しました –
実際に線分/三角形、線/三角形、または線/三角形の交差点を探していますか?コードから、私はray/triangleと言っているが、現在の説明はline/triangleだ。 – user3146587