Textur-mapping in MATLAB
Habe ich Punkte im 3D-Raum und Ihre entsprechenden 2D-Bild Punkten. Wie kann ich ein mesh aus der 3D-Punkte, dann textur die Dreieck-Flächen gebildet, die durch die Maschen?
- Wenn Sie erhebliche änderungen an Ihrer Frage, ist es meist besser, das ursprüngliche material, und fügen Sie dann das neue material mit der überschrift "BEARBEITEN" oder "UPDATE". So, die Antworten, die ein bisschen mehr Sinn machen. 😉
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beachten Sie, dass die Funktion
trisurf
, dass Sie ursprünglich versucht, gibt ein handle zu einem patch Objekt. Wenn man sich die'FaceColor'
- Eigenschaft für patch-Objekte, können Sie sehen, dass es keine'texturemap'
option. Diese option ist nur gültig für die'FaceColor'
- Eigenschaft von Oberfläche Objekte. Sie müssen also einen Weg finden, um zu Plotten Ihre dreieckigen Fläche als Oberfläche - Objekt anstelle eines patch Objekt. Hier sind zwei Möglichkeiten, dies zu nähern:, Wenn die Daten in ein einheitliches raster...
Wenn die Koordinaten Ihrer Oberfläche Daten repräsentieren ein einheitliches raster, so dass
z
ist eine rechteckige Menge der Punkte, die Spanne ausxmin
zuxmax
in der x-Achse undymin
zuymax
in der y-Achse können Sie zeichnen Sie es mitsurfen
statttrisurf
:Zur illustration der Ergebnisse der oben genannten code, ich initialisiert die Daten als
Z = peaks;
, verwendet die integrierten sample-Bild'peppers.png'
, und legen Sie diex
undy
Werte erstrecken sich von 1 bis 16. Dies führte in den folgenden textur-mapped-Oberfläche:, Wenn Ihre Daten nicht-gleichmäßiger Abstand...
Wenn Sie Ihre Daten nicht regelmäßig verteilt sind, können Sie eine Reihe von regelmäßig angeordneten
X
undY
Koordinaten (wie ich oben mitmeshgrid
) und verwenden Sie anschließend die Funktionengriddata
oderTriScatteredInterp
zur Interpolation in einem regelmäßigen Gitter vonZ
Werte aus Ihrer unregelmäßigen Reihe vonz
Werte. Ich erörtern, wie diese beiden Funktionen in meine Antwort auf eine andere Frage ALSO. Hier ist eine verfeinerte version der code, den Sie mit gebuchtTriScatteredInterp
(Hinweis: da der R2013ascatteredInterpolant
ist die empfohlene alternative):In diesem Fall müssen Sie ersten wählen Sie die Werte von
N
undM
für die Größe der matrixZ
. Um zu veranschaulichen, die Ergebnisse der oben genannten code, ich initialisiert die Daten fürx
,y
, undz
wie folgt und verwendet die eingebaute sample-Bild'peppers.png'
:Diese führte in den folgenden textur-mapped-Oberfläche:
Feststellen, dass es scharfe Kanten in der Nähe der Ecken der Oberfläche. Dies sind die Orte, an denen waren es zu wenige Punkte für
TriScatteredInterp
ausreichend fit mit einer interpolierten Oberfläche. DieZ
Werte an diesen stellen sind dahernan
, was in der Fläche Punkt nicht gezeichnet werden.TriScatteredInterp
- Klasse wurde erstmals in version 7.8 (R2009a): mathworks.com/access/helpdesk/help/techdoc/rn/.... Wenn Sie eine ältere version verwenden, müssen Sie gehen mit GRIDDATA.Wenn Ihr die textur ist bereits in der richtigen geometrie können Sie einfach regelmäßige alten texture-mapping.
Den link zu the MathWorks Dokumentation von textur-mapping:
http://www.mathworks.com/access/helpdesk/help/techdoc/visualize/f0-18164.html#f0-9250
Re-EDIT: Aktualisiert den code ein wenig:
Versuchen, dieses Vorgehen (ich habe es zu arbeiten).
Also [x,y,z] ist der 'Oberfläche' oder eher eine matrix mit einer Anzahl von Punkten in der form (x,y,z), sind auf der Oberfläche. Beachten Sie, dass das Bild gestreckt wird, um die Oberfläche angepasst.
(x(n),y(n),z(n))
.b=double(a)/255;
ist unnötig. Sie können einfach verwenden Siea
direkt als'CData'
Wert.