Zanikanie niektórych modeli w XNA - dlaczego?

2011-07-25 17:32

Rejestracja: 9 lat temu

Ostatnio: 5 miesięcy temu

Lokalizacja: Kosmos

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

Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał

Pozostało 580 znaków

o_O
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

Rejestracja: 9 lat temu

Ostatnio: 5 miesięcy temu

Lokalizacja: Kosmos

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?


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał
edytowany 1x, ostatnio: xeo545x39, 2011-07-25 18:13

Pozostało 580 znaków

2011-07-25 18:17

Rejestracja: 9 lat temu

Ostatnio: 2 lata temu

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

Rejestracja: 9 lat temu

Ostatnio: 5 miesięcy temu

Lokalizacja: Kosmos

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?


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał
edytowany 1x, ostatnio: xeo545x39, 2011-07-25 18:57

Pozostało 580 znaków

o_O
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

Rejestracja: 9 lat temu

Ostatnio: 5 miesięcy temu

Lokalizacja: Kosmos

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


Co kurła debuguj ten kod i streszczaj się klientowi chce się fixa, a jak nie kurła to odpale visuala i ci pomoge a tego byś nie chciał

Pozostało 580 znaków

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