Zanikanie niektórych modeli w XNA - dlaczego?

Odpowiedz Nowy wątek
2011-07-25 17:32
0

Witam! Napisałem prostą aplikację wykorzystującą modele 3D w XNA. Mam taki problem, bo gdy poruszę kamerę i zajdzie za którąś ścianę (model) to ona po prostu znika, z różnych stron to się dzieje, ale nie zauważyłem dlaczego tak się dzieje, wszystkie ściany widać tylko z jednej strony, po przejechaniu gdzieś dalej, niewidocznych jest kilka. Kod:

// (DRAW) tak rysuję modele:
foreach (MyModel Object in Objects)
            {
                // Copy any parent transforms.
                Matrix[] Transforms = new Matrix[Object.Model.Bones.Count];
                Object.Model.CopyAbsoluteBoneTransformsTo(Transforms);
 
                // Draw the model. A model can have multiple meshes, so loop.
                foreach (ModelMesh Mesh in Object.Model.Meshes)
                {
                    // This is where the mesh orientation is set, as well 
                    // as our camera and projection.
                    foreach (BasicEffect Effect in Mesh.Effects)
                    {
                        Effect.EnableDefaultLighting();
                        Effect.AmbientLightColor = new Vector3(0.5f);
                        Effect.World = Transforms[Mesh.ParentBone.Index] * Matrix.CreateRotationY(MathHelper.ToRadians(Object.Rotation)) * Matrix.CreateTranslation(Object.Position);
                        Effect.View = View;
                        Effect.Projection = Projection;
                    }
                    // Draw the mesh, using the effects set above.
                    Mesh.Draw();
                }
 
// (UPDATE) macierze: (CameraPosition to Vector3)
View = Matrix.CreateLookAt(CameraPosition, Vector3.Zero, Vector3.Up);
            Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), graphics.GraphicsDevice.Viewport.AspectRatio, 1.0f, 10000.0f);

<error>There was an error during loading user signature. Please try to reboot the Universe and check again.</error>

Pozostało 580 znaków

2011-07-25 17:59
o_O
0

Tak na suche spojrzenie to wszystko wydaje się dobre, może masz dziwny model?
Wejdź na XNA Creators i porównaj swój kod to sampli. Spróbuj też na innym modelu.

Pozostało 580 znaków

2011-07-25 18:07
0

Tzn. tak: wszystko robię z dokumentacji XNA, oprócz tego, że mam swoje modele, a zanikają tylko płaskie obiekty, który nie mają grubości właśnie moja ściana, w Blenderze jest jako Plane. Zaś kula i inne obiekty faktycznie 3D nie zanikają. Jak mówię dzieje się tylko tak z Plane'ami obojętnie w jakiej pozycji są, w niektórych momentach zanikają, jak kamera jest za nimi, chodź nie wszystkie. Musi być na to jakaś reguła ;/

I jeszcze takie pytanie, zauważyłem, że tekstury nadane w Blenderze nie przechodzą na .fbx Czyli, że muszę ręcznie je nakładać w XNA?


<error>There was an error during loading user signature. Please try to reboot the Universe and check again.</error>
edytowany 1x, ostatnio: xeo545x39, 2011-07-25 18:13

Pozostało 580 znaków

2011-07-25 18:17

Nie dam sobie ręki uciąć, ale pewnie jest tak samo jak w ogl. Prymitywy mają 2 strony i domyślnie jest rysowana tylko jedna. Jest to związane z wydajnością - jak masz model złożony z kilkuset tysięcy wielokątów to bez sensu jest malowanie jego wnętrza, którego nie widać.
Skoro rysujesz coś płaskiego(po prostu prymityw), to jak popatrzysz na to od tyłu to nie zobaczysz figury. Oczywiście takie zachowanie można ustawić. Nie wiem jak to jest w XNA, ale pewnie podobnie jak w ogl - wybierasz czy ma być rysowany przód czy tył czy obie strony prymitywu, strona jest określana kolejnością definiowania wierzchołków(zgodnie lub przeciwnie do ruchu wskazówek zegara).

//edit: znalazłem - nazywa się to backface culling i można to ustawić:
http://msdn.microsoft.com/en-[...]%28v=xnagamestudio.31%29.aspx


edytowany 5x, ostatnio: byku_guzio, 2011-07-25 18:25

Pozostało 580 znaków

2011-07-25 18:42
0

Dzięki byku, to by było logiczne, w którymś tutku z dokumentacji XNA czy na necie widziałem to CullMode, ale nie było napisane do czego to jest.


Mam jeszcze takie pytanie, a nie chce tworzyć nowego wątku - ma ktoś pomysł na reakcję na kolizję? Chodzi mi o to, że jak uderzy w ścianę moja kula, to żeby odwrócił się wektor jej prędkości, ale ten odpowiedni wektor prostopadły do danej ściany (dobrze mówię?), tyle, że mam planszę gotową i chciałbym od każdej ściany tej mini mapki się odbijała. Nie chcę gotowych silników fizycznych. Da się to jakoś prosto zrobić? Jakieś pomysły?


<error>There was an error during loading user signature. Please try to reboot the Universe and check again.</error>
edytowany 1x, ostatnio: xeo545x39, 2011-07-25 18:57

Pozostało 580 znaków

2011-07-25 22:21
o_O
0

Generalną zasadę znajdziesz w necie bez problemu.
W XNA 4 doszło dużo helperów do kolizji, masz sfery, piramidki i inne zabawki, posiadają one metodę Intersect, podajesz drugi obszar a to już samo sprawdzi czy się przecinają.
Przy wersji 3 jest ciut więcej roboty bo i helperów mniej ale sfera i płaszczyzna to tam też są.

Pozostało 580 znaków

2011-07-26 12:41
0

To, że takie helperki są to wiem, bez nich ani rusz :D, ale nie wiem jak wykryć, że kula uderzyła akurat w tą ścianę, a nie w drugą (tego samego modelu). Z oddzielnymi modelami ścian jest łatwiej, ale nie będę budował mapy w XNA ;P


<error>There was an error during loading user signature. Please try to reboot the Universe and check again.</error>

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0