Um die 3D-Position des Objekts zu bestimmen, würde ich Raytracing empfehlen.
Angenommen, das Modell befindet sich in Weltraumkoordinaten, müssen Sie auch die Weltraumkoordinaten der Augenposition und die Koordinaten des Weltenraums der Bildebene kennen. Mit diesen beiden Punkten können Sie einen Strahl berechnen, mit dem Sie das Modell schneiden, von dem ich anmaß, dass es aus Dreiecken besteht.
Dann können Sie den Strahldreieck-Test verwenden, um die 3D-Position der Berührung zu bestimmen, indem Sie das Dreieck finden, das den kürzesten Schnittpunkt mit der Bildebene hat. Wenn Sie möchten, welches Dreieck berührt wird, möchten Sie diese Informationen auch speichern, wenn Sie die Schnitttests durchführen.
Diese Seite gibt ein Beispiel, wie ray Dreieck Kreuzung Tests zu tun: http://www.scratchapixel.com/lessons/3d-basic-lessons/lesson-9-ray-triangle-intersection/ray-triangle-intersection-geometric-solution/
Edit:
Aktualisiert einige Beispiel-Code zu haben. Es ist ein leicht modifizierter Code, den ich aus einem Raytracing-Projekt von C++ übernommen habe, das ich vor einiger Zeit gemacht habe, also müssen Sie es etwas modifizieren, damit es für iOS funktioniert. Auch wäre der Code in seiner aktuellen Form nicht einmal nützlich, da er nicht den tatsächlichen Schnittpunkt zurückgibt, sondern eher, wenn der Strahl das Dreieck schneidet oder nicht.
// 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;
}
Die tatsächliche Schnittpunkt Sie interessieren würde, ist P.
+1 - Es ist sehr einfach und einfach, Technik zu implementieren. Hier haben Sie mehr Informationen und Quellcode in Processing (so etwas wie Java) - http://wiki.processing.org/w/Picking_with_a_color_buffer – cyriel
Kann ich irgendwelche iOS-Beispielcodes in diesem Thema haben? –
Suche nach Render für Textur zum Rendern. Dann sollte es für Sie einfach sein, Farben zu finden. http://stackoverflow.com/questions/8439697/openg-l-es-2-0-render-to-texture – codetiger