Domanda

Nel tentativo di applicare un materiale al mio GeometryModel3D in fase di esecuzione in questo modo:

        var model3D = ShardModelVisual.Content as GeometryModel3D;
        var materialGroup = model3D.Material as MaterialGroup;

        BitmapImage image;
        ResourceLoader.TryLoadImage("pack://application:,,,/AnzSurface;component/path file/img.png", out image, ".png");
        var iceBrush = new ImageBrush(image);
        var grp = new TransformGroup();
        grp.Children.Add(new ScaleTransform(0.25, 0.65, 0.5, 0.5));
        grp.Children.Add(new TranslateTransform(0.0, 0.0));
        iceBrush.Transform = grp;
        var iceMat = new DiffuseMaterial(iceBrush);
        materialGroup.Children.Add(iceMat);

Il che tutto funziona benissimo, e il materiale viene aggiunto.

Quello che non capisco è come posso mappare gli utenti fanno clic sullo schermo per gli offset che devono essere applicate al TranslateTransform.

vale a dire. al momento, x: -0.25 si muove il materiale a ritroso lungo l'asse X, ma non ho idea di come ottenere quel tipo di una coordinata da parte degli utenti del mouse ...

quando lo faccio:

e.MouseDevice.GetPosition (ShardsViewPort3D);

che mi dà normale X / corrds Y del clic del mouse ...

Grazie per qualsiasi aiuto si può dare!

È stato utile?

Soluzione

Sembra che si desidera far scorrere il materiale intorno sulla geometria quando si fa clic su di esso. Ecco come:

Usa ha colpito il test per tradurre il vostro coordinate X / Y dal clic del mouse in un RayMeshGeometry3DHitTestResult come descritto nel mio in precedenza rispondere . Questo vi darà la MeshGeometry3D che è stato colpito, i vertici del triangolo che è stato colpito, e la relativa posizione in quel triangolo.

Look up ogni indice vertice (VertexIndex1, VertexIndex2, VertexIndex2) nella MeshGeometry3D.TextureCoordinates per ottenere le coordinate della texture. Questo vi darà tre (u, v) le coppie come oggetti Point. Moltiplicare ogni il (u, v) coppie di peso corrispondenti al risultato di misura colpo (VertexWeight1, VertexWeight2, VertexWeight3) e aggiungere le coppie insieme, cioè:

uMouse = u1 * VertexWeight1 + u2 * VertexWeight2 + u3 * VertexWeight3
vMouse = v1 * VertexWeight1 + v2 * VertexWeight2 + v3 * VertexWeight3

Ora si dispone di un punto (uMouse, vmouse) che indica dove il vostro materiale il mouse è stato cliccato.

Se si desidera un particolare punto sulla vostra struttura per passare alla esattamente dove è stato cliccato il mouse, basta sottrarre il (uMouse, vmouse), dove il mouse è stato cliccato da (u, v) coordinate del luogo nel materiale che si vuole apparire sotto il mouse, e impostarla come TranslateTransform. Se si desidera gestire il trascinamento, memorizzare il computerizzata (uMouse, vmouse), dove la resistenza e ha iniziato la trasformazione a partire dall'inizio di trascinamento, poi come progredisce trascinando calcolare il nuovo file di trasformazione come:

translate = (uMouse,vMouse) - (uMouseDragStart, vMouseDragStart) + origTranslate

Nel codice potrai scrivere questo come aggiunte Point. Ho scritto fuori come (u, v) in questa spiegazione, perché ho pensato che fosse più facile da capire se ho fatto così. In realtà il codice per calcolare (uMouse, vmouse) avrà un aspetto più simile a questo:

var uv1 = hit.MeshHit.TextureCoordinates[hit.VertexIndex1];
var uv2 = hit.MeshHit.TextureCoordinates[hit.VertexIndex2];
var uv3 = hit.MeshHit.TextureCoordinates[hit.VertexIndex3];

var uvMouse = new Vector(
  uv1.X * hit.VertexWeight1 + uv2.X * hit.VertexWeight2 + uv3.X * hit.VertexWeight3)
  uv1.Y * hit.VertexWeight1 + uv2.Y * hit.VertexWeight2 + uv3.Y * hit.VertexWeight3);

ed il codice per aggiornare durante un trascinamento la trasformazione avrà un aspetto simile a questo:

...
var translate = translateAtDragStart + uvMouse - uvMouseAtDragStart;
... = new TranslateTransform(translate.X, translate.Y);

Si dovrà adattare questa alla situazione precisa.

Si noti che il callback HitTest può essere chiamato più volte, a partire dalla maglia più vicino e spostando indietro. Può anche essere chiamato con 2D colpisce, per esempio, se un oggetto 2D è di fronte al vostro Viewport3D. Quindi, ti consigliamo di controllare ogni colpo per vedere se è veramente ciò che si vuole, ad esempio durante il trascinamento si desidera mantenere il controllo della posizione sulla maglia essere trascinato anche se non è più di tutto. HitTestResultBehavior.Stop Ritorno da te richiamata una volta che avete agito sulla maglia trascinato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top