2008-09-16 13 views
4

Ich versuche, das aktuelle Problem mit GPU Fähigkeiten zu lösen: "gegeben eine Punktwolke P und eine orientierte Ebene durch einen Punkt und eine Normale (Pp, Np) die Punkte in der Wolke zurückgeben, die in einer Entfernung gleich oder weniger als EPSILON von der Ebene laugen ".Abfrage Punkte Epsilon-nah an einer Schnittebene in Punktwolke mit der GPU

Gespräch mit einem Kollegen I in Richtung auf die folgende Lösung konvergiert:

1) bereiten einen Eckenpuffers der Punkte mit einem daran befestigten Texturkoordinate so dass jeder Punkt ein anderer Eckpunkt 2) eingestellten Projektionsstatus Koordinate zu orthogonal 3) rotiere das Netz so, dass die Normale der Ebene mit der -z-Achse ausgerichtet ist und versetze es so, dass x, y, z = 0 entspricht Pp 4) setze die z-Clipping-Ebene so, dass z: [-EPSILON; + EPSILON] 5) Rendern zu einer Textur 6) die Textur von der Grafikkarte abrufen 7) die Textur von der Grafikkarte lesen und sehen, was p oints wurden (in Bezug auf ihre Indizes) gerendert, das sind die Punkte innerhalb des gewünschten Entfernungsbereichs.

Jetzt sind die Probleme die folgenden: q1) Muss ich einen Fensterrahmen öffnen, um solch eine Operation zu machen? Ich arbeite in MATLAB und benenne MEX-C++. Aus Erfahrung weiß ich, dass sobald du einen neuen Rahmen öffnest, der ganze Anzug kläglich zusammenbricht! q2) Was ist das Primitive, um einem GLPoint eine Texturkoordinate zu geben? q3) Mir ist nicht klar, wie das Rendern einer Textur implementiert werden würde? Jede Referenz, Tutorial wäre super ... q4) Wie würden Sie diese Textur von der Karte abrufen? Wiederum wäre jede Referenz, Tutorial wäre toll ...

Ich bin auf einem engen Zeitplan, so wäre es schön, wenn Sie mir die Namen der Techniken, die ich lernen sollte, eher auf die GLSL-Spezifikation Dokument und die OpenGL-API als jemand getan hat. Das sind ein bisschen zu vage Antworten auf meine Frage.

Vielen Dank für einen Kommentar.

p.s. Beachten Sie auch, dass ich lieber keine Ressource wie CUDA verwenden würde, wenn möglich, also etwas, das verwendet, so viele OpenGL-Elemente wie möglich, ohne dass ich einen neuen Shader schreiben muss.

Hinweis: cross posted bei http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=245911#Post245911

Antwort

0

Ok zunächst als wenig Haftungsausschluss: Ich habe nichts über 3D-Programmierung kennen.

Jetzt ist meine rein mathematische Idee:

eine Ebene, die durch eine normale N (der Einheitslänge) und einen Abstand L von der Ebene zum Zentrum (der Punkt [0/0/0]) gegeben. Der Abstand eines Punktes X zur Ebene ist gegeben durch das Skalarprodukt von N und X minus L den Abstand zum Zentrum. Sie müssen also nur prüfen, ob

| n ist. x - L | < = Epsilon

. als Skalarprodukt und | | der absolute Wert

Natürlich müssen Sie die Ebene mit der normalen ersten schneiden den Abstand L.

Vielleicht hilft zu bekommen.

+0

Wenn Sie dies abstimmen, hinterlassen Sie bitte einen Kommentar warum. Ich würde gerne wissen. – Sarien

1

Es ist einfach: Sei n die Normale der Ebene und x sei der Punkt.

n_u = n/norm(n)   //this is a normal vector of unit length 
d = scalarprod(n,x) //this is the distance of the plane to the origin 

for each point p_i 
    d_i = abs(scalarprod(p_i,n) - d) //this is the distance of the point to the plane 

Offensichtlich "scalarprod" bedeutet "Skalarprodukt" und "abs" bedeutet "Absolutwert". Wenn Sie sich wundern, warum gerade den Artikel über Skalarprodukte bei Wikipedia lesen.

0

Ich habe eine Frage für Andrea Tagliasacchi, Warum?

Nur wenn Sie sich 1000 Punkte und mögliche 100s von Ebenen ansehen, wäre die Verwendung der beschriebenen Methode von Vorteil. Wie es scheint, den Punkt und das Flugzeug zu punktieren, wie umrissen mein Corporal Touchy.

Auch aufgrund der endlichen Natur der Pixel werden Sie oft feststellen, dass zwei oder mehr Punkte auf das gleiche Pixel in der Textur projiziert werden.

Wenn Sie dies immer noch tun möchten, könnte ich ein Beispielprogramm in C++ aufarbeiten, aber wie dies mit MATLAB helfen würde, weiß ich nicht, da ich nicht damit vertraut bin.

+0

Ich sehe immer noch nicht, wie es schneller sein könnte, die Berechnungen müssen noch gemacht werden. :) Vielleicht weißt du, wie das intern gemacht wird? – Sarien

0

Es scheint mir, dass Sie in der Lage sein sollten, etwas ähnliches wie Corporal Touchy-Methode ein Vertex-Programm und nicht in einer For-Schleife, oder? Vielleicht verwenden Sie eine C-API zur GPU-Programmierung, z. B. CUDA?