StealthEule
Hallo alle zusammen.
Ich nutze C# und WPF in meinen Aktuellen Projekt (mein Erstes in dieser Kombination), und bin dabei auf ein Problem gestoßen.
Ich habe in einer XAML ein Viewport3D geschrieben und habe es per Knopfdruck in ein Frame geladen. Bis hierhin funktioniert das alles wunderbar. Nun möchte ich die Farbe (Material) eines Visuall3D’s andern, habe aber keine Ahnung wie ich dies Anstellen soll.
Meine Idee war es aus dem Visual3D Objekt ein Geometry3D Objekt zu machen und mit ein neues Material zu einen Geometry3DModel zu verbinden. Dafür habe ich aber im Internet leider keine Lösungsansatz gefunden.
Da ich noch etwas unerfahren mit WPF und C# bin würde ich mich über ein paar Zeilen Code oder für einen Lösungsvorschlag freuen.
talla
Hallo,
deine Idee ist schon ganz richtig, aber so wie du die Klassen durcheinander wirst, fehlt da wahrscheinlich noch ein bisschen der Zusammenhang.
| Zitat: |
| aus dem Visual3D Objekt ein Geometry3D Objekt zu machen |
Geht nicht. Sind zwei völlig unterschiedliche Dinge.
Ein Visual3D ist ein Objekt, welches in einem Viewport3D angezeigt wird und allgemeines 3D Zeugs bereitstellt, wie z.B. Hit-Testing, Transformation, etc. Das Objekt selber hat erstmal keine Darstellung, sondern zeigt ein Model3D an.
Jetzt gibts verschiedene Model3Ds wie z.B. das GeometryModel3D was hier benötigt wird. Und dieses GeometryModel3D besteht eineseits auf der Geometry3D welches die eigentliche Form beschreibt und dem (Back)Material welches das Aussehen der Oberfläche darstellt.
Jetzt hast du also die Möglichkeit ein festes Geometry3D Objekt zu erstellen und immer wenn du nen anderes Material benötigst ein GeometryModel3D aus fester Geometry3D und dem neuen Material zu erstellen und dieses GeometryModel3D kannst du dann dem Visual3D wo es angezeigt werden soll, neu zuweisen.
Wenn man die Zusammenhänge zwischen den Klassen kennt, ist es natürlich auch problemlos möglich bei bestehenden Objekten über die entsprechenden Properties auf das Material zuzugreifen und dann zu ändern, wobei dort ne Menge Casts notwendig sein können, da z.B. Properties wie Visual3DModel von Visual3D mit den abstrakten Basisklassen (hier. Model3D) arbeiten.
StealthEule
Talla danke für deine schnelle Antwort.
ich habe deinen ersten Ansatz befolgt und habe die XML bis auf die Geometry3D runtergeprochen. Danach habe die Kamera und Licht einstellungen in eine Seperate XAML gespeichert und in das Projekt geladen.
soweit funktioniert jetzt alles.
P.s.: Ich muss zu meiner Schande gestehen das ich bis vor ein halbes Jahr nur in VB.Net Windows.Forms gearbeidet habe und leider manchmal mit den c# +wpf auf Kriegsfuß stehe. Trozdem möchte ich nicht mehr mit VB.Net und Windowsforms programieren müssen.
StealthEule
Für alle die vor dem selben Problem stehen habe ich jetzt noch eine andere möglichkeit gefunden.
In Xaml am GeometryModel3D ein x:Name vergeben und im code mit Findname im Viewport suchen und ändern.
damit sparrt man sich das zwischenspeichern der Geometry.
finde ich persöhnlich für eine Elegantere lösung.
P.S. kann man natürlich auch für transformation nutzen.
talla
Naja, tut halt nur wenn man dem nen eindeutigen Namen geben kann :) Wenn man viele Objekte hat, geht das eher nicht. Je nachdem obs für den Fall wichtig ist, muss man beachten, dass es auch zur Laufzeit langsamer sein kann über FindName zu gehen, da er ja die Ressourcen erst rekursiv durchgehen muss.