オブジェクトの3D位置を特定するには、レイトレーシングをお勧めします。
モデルがワールドスペース座標であると仮定すると、アイ・ロケーションのワールド空間座標とイメージ・プレーンのワールド空間座標も知る必要があります。これら2つの点を使って、モデルと交差するために使う線を計算することができます。線は三角形で構成されています。
次に、レイ・トライアングル・テストを使用して、イメージ・プレーンに最も近い交差点を持つ三角形を見つけることによって、タッチの3D位置を決定することができます。どの三角形をタッチするかを知りたい場合は、交差テストを行うときにその情報を保存することもできます。
このページでは、光線三角形の交差テストを行う方法の例を示します:http://www.scratchapixel.com/lessons/3d-basic-lessons/lesson-9-ray-triangle-intersection/ray-triangle-intersection-geometric-solution/
編集:いくつかのサンプルコードを持つように更新
。ちょっと前に私が行ったC++レイトレーシングプロジェクトから少し修正したコードをいくつか修正して、iOS用に少し修正する必要があります。また、現行の形式のコードは、実際の交点を返さず、光線が三角形と交差するかどうかにかかわらず有用ではありません。あなたが興味がある
// d is the direction the ray is heading in
// o is the origin of the ray
// verts is the 3 vertices of the triangle
// faceNorm is the normal of the triangle surface
bool
Triangle::intersect(Vector3 d, Vector3 o, Vector3* verts, Vector3 faceNorm)
{
// Check for line parallel to plane
float r_dot_n = (dot(d, faceNorm));
// If r_dot_n == 0, then the line and plane are parallel, but we need to
// do the range check due to floating point precision
if (r_dot_n > -0.001f && r_dot_n < 0.001f)
return false;
// Then we calculate the distance of the ray origin to the triangle plane
float t = (dot(faceNorm, (verts[0] - o))/r_dot_n);
if (t < 0.0)
return false;
// We can now calculate the barycentric coords of the intersection
Vector3 ba_ca = cross(verts[1]-verts[0], verts[2]-verts[0]);
float denom = dot(-d, ba_ca);
dist_out = dot(o-verts[0], ba_ca)/denom;
float b = dot(-d, cross(r.o-verts[0], verts[2]-verts[0]))/denom;
float c = dot(-d, cross(verts[1]-verts[0], o-verts[0]))/denom;
// Check if in tri or if b & c have NaN values
if ( b < 0 || c < 0 || b+c > 1 || b != b || c != c)
return false;
// Use barycentric coordinates to calculate the intersection point
Vector3 P = (1.f-b-c)*verts[0] + b*verts[1] + c*verts[2];
return true;
}
実際の交点がP.
+1 - 技術を実装するのは非常に簡単で簡単です。ここではProcessing(Javaのようなもの)にもっと多くの情報とソースコードがあります - http://wiki.processing.org/w/Picking_with_a_color_buffer – cyriel
このトピックにはどのサンプルコードもありますか? –
レンダリングのためにテクスチャにレンダリングを検索します。そうすれば、色を見つけるのは簡単です。 http://stackoverflow.com/questions/8439697/opengl-es-2-0-render-to-texture – codetiger