Zanikanie niektórych modeli w XNA - dlaczego?

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);
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.

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?

0

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-us/library/microsoft.xna.framework.graphics.renderstate.cullmode%28v=xnagamestudio.31%29.aspx

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?

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ą.

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

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