それぞれ4つの頂点がわかっている3次元空間上にある四角形が、交わっているか判定したく、
ファーストステップとして、下記のサイトを参考に2平面から交線を求めるコードを実装してみました。
https://www.hiramine.com/programming/graphics/3d_planeintersection.html
http://webmath.las.osakafu-u.ac.jp/top/std/help/help0201011036.pdf
交線を求めて、平行か平行じゃないかというところはわかったのですが、
平面が交わっているかの判定方法がわからず困っています。
欲を言えば、交わっていた場合、交線の線分の情報も知りたく、両端の2点の座標も取りたいと思っています。
ひとまず最初の交差判定でつまずいているので、こちらだけでも教えていただけると幸いです。
よろしくお願いいたします。
下記コードはopenFrameworks(c++)で実装しております。
openFrameworks
1// ofVec4f(float x,float y,float z,float w) 4次元座標格納するクラス 2// ofVec3f(float x,float y,float z) 3次元座標格納するクラス 3// ofPoint(float x,float y,float z = 0.0) 2次元or3次元座標格納するクラス 4 5//-------------------------------------------------------------- 6void ofApp::update(){ 7 ofVec4f planeA(1,-1,-1,1); //サイトの例の値を仮にいれてます 8 ofVec4f planeB(2,1,4,-1); 9 ofVec3f vec; 10 ofPoint point; 11 cout << calcIntersection(planeA, planeB, vec, point) << endl; 12} 13 14//-------------------------------------------------------------- 15ofVec4f ofApp::getPlaneEquation(const ofPoint &p1, const ofPoint &p2, const ofPoint &p3) { 16 ofVec3f vecAB(p2.x - p1.x, p2.y - p1.y, p2.z - p1.z); 17 ofVec3f vecAC(p3.x - p1.x, p3.y - p1.y, p3.z - p1.z); 18 ofVec3f cross = vecAB.cross(vecAC); //外積を計算 19 float d = -(cross.x * p1.x + cross.y * p1.y + cross.z * p1.z); 20 return ofVec4f(cross.x, cross.y, cross.z, d); 21} 22 23//-------------------------------------------------------------- 24bool ofApp::calcIntersection(ofVec4f planeA, ofVec4f planeB, ofVec3f &vec, ofPoint &point) { 25 vec = ofVec3f(planeA.x, planeA.y, planeA.z).cross(ofVec3f(planeB.x, planeB.y, planeB.z)); 26 if (vec.z != 0.0) { 27 point.x = (planeA.w * planeB.y - planeB.w * planeA.y) / vec.z; 28 point.y = (planeA.w * planeB.x - planeB.w * planeA.x) / (-vec.z); 29 point.z = 0; 30 return true; 31 } 32 if (vec.y != 0.0) { 33 point.x = (planeA.w * planeB.z - planeB.w * planeA.z) / (-vec.y); 34 point.y = 0; 35 point.z = (planeA.w * planeB.x - planeB.w * planeA.x) / vec.y; 36 return true; 37 } 38 if (vec.x != 0.0) { 39 point.x = 0; 40 point.y = (planeA.w * planeB.z - planeB.w * planeA.z) / vec.x; 41 point.z = (planeA.w * planeB.y - planeB.w * planeA.y) / (-vec.x); 42 return true; 43 } 44 return false; 45} 46
回答5件
あなたの回答
tips
プレビュー