Zobacz wyniki ankiety na temat zarobków programistów w Polsce. Czytaj więcej..
1

Hej,

mam pewien problem z transformacją siatek (Mesh z biblioteki Direct3D). Otóż, wszystko działa zgodnie z opisami w tutorialach, ale dla jednego obiektu... a ja mam ich kilka. Konkretniej w liscie 'objects' przechowuję siatki (te standardowe z klasy Mesh, a wiec Mesh.Box, Mesh.Torus, Mesh.Sfere itd..), a w obiekcie 'activeObject' trzymam aktualnie wybrana siatke (wybieram z poziomu klawiatury 1,2,3...). Nastepnie na niej operuje i przesuwam sobie ja strzalkami (uzyskujac wektor 'move'). Fragment kodu wyglada tak:

foreach (GeometricObject obj in this.objects)
        {
            if (obj != this.activeObject)
            {
                obj.Mesh = MeshUtils.ChangeMeshColor(obj.Mesh, Color.Yellow, device);
            }
            else
            {
                obj.Mesh = MeshUtils.ChangeMeshColor(obj.Mesh, Color.Green, device);
                obj.GeometryMatrix.Translate(this.move);
            }
            device.Transform.World = obj.GeometryMatrix;
            obj.Mesh.DrawSubset(0);
        } 

(jak widać podświetlam sobie jeszcze na zielono aktywną siatkę). Klasa GeometricObject opakowuje po prostu klasę directx-ową Mesh). Nie działają mi jednak dobrze (tak jak chcę) te transformacje, a mianowicie po każdej zmianie obiektu (zmianie activeObjectu) zmienia mi się widok (jakby orientacja na ekranie), a jak w ogóle przeskoczę sobie przez wszystkie obiekty (siatki) po kolei... to na końcu wszystkie mi sie pokrywaja znajdujac w jednym miejscu na ekranie, a przecież powinno działać, skoro widok mam ustawiony cały czas tak:

  device.Transform.View = Matrix.LookAtLH(new Vector3(0.0f, 2.0f, -25.0f), // Camera position
                new Vector3(0.0f, 0.0f, 0.0f),   // Look-at point
                new Vector3(0.0f, 1.0f, 0.0f));  // Up vector

Zetknął się z Was z tym ktoś kiedyś? nie wiem gdzie może być problem...o czym zapominam? (aha, podmiana kolorów siatek go bynajmniej nie stanowi).

PS: Zadałem to pytanie również na stackoverflow:

http://stackoverflow.com/questions/2395996/switch-between-active-objects-understanding-transform-view

ale mam wrażenie, że w gąszczu innych pytań...zaginęło. Może tutaj będzie łatwiej?

flag
1 
dodałbym jakiś nowy tag (directx), ale nie mam uprawnień – Kamil Hawdziejuk Mar 7 at 15:08
Trochę za mało informacji żeby odpowiedzieć coś konstruktywnego. Jakich konkretnie typów używasz? Co to jest GeometricObject? Jakiego typu jest GeometricObject.GeometryMatrix? Czy to Twoje własne typy, czy coś DirectX'owego? Co dzieje się w kodzie poza tym, co wkleiłeś? – vigrid Mar 8 at 12:19
Klasa GeometricObject opakowuje po prostu klasę directx-ową Mesh - dodałem do opisu. Co do tego co się dzieje więcej w kodzie to właściwie tyle, że po zdarzeniu przyciśnięcia strzałki następuje zmiana wektora przesunięcia, więc zmienia się on jedynie tak: this.move.x += 1; this.move.x -= 1; this.move.y += 1; this.move.y -= 1; (w zależności od kierunku przesunięcia). Na początku wektor this.move = (0,0,0) – Kamil Hawdziejuk Mar 8 at 13:27

1 Answer

1

Udało się..jejku wygląda jednak na to, że nie działa poprawnie metoda Translate dla macierzy (Microsoft.Directx.Matrix) ;/ musze się temu lepiej przyjrzeć, w każdym razie

obj.GeometryMatrix.Translate(this.move);

ustawia mi po prostu macierz na macierz translacji (zamiast przesuwać o taką macierz)...pomogło obejście utworzenia macierzy translacji i przemnożenia przez istniejąca macierz, czyli tak:

obj.GeometryMatrix *= Matrix.Translation(this.move);

(przy czym oczywiście teraz po każdej takiej operacji this.move ustawiam na Vector(0,0,0))

link|flag

Your Answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.