XNA i znikające powierzchnie

Odpowiedz Nowy wątek
2014-08-12 06:53
Riw
0

Witam,mam pewien problem z XNA,otóż mam następującą klasę Floor


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace XNA_First_Person_Camera
{
    class Floor
    {
        //Atrybuty - Attributes
        private int floorWidth;
        private int floorHeight;
        private VertexBuffer floorBuffer;
        private GraphicsDevice device;
        private Color[] floorColors = new Color[2] { Color.White, Color.Black };
        //Konstruktor
        public Floor(GraphicsDevice device, int width, int height)
        {
            this.device = device;
            this.floorWidth = width;
            this.floorHeight = height;
            BuildFloorBuffer();
        }
        //Buduje Vertex Buffer
        private void BuildFloorBuffer()
        {
            List<VertexPositionColor> vertexList = new List<VertexPositionColor>();
            int counter = 0;
            //Pętla tworząca podłoge
            for (int x = 0; x < floorWidth; x++)
            {
                counter++;
                for (int z = 0; z < floorHeight; z++)
                {
                    counter++;

                    //Pętla tworząca wierzchołki
                    foreach (VertexPositionColor vertex in FloorTile(x, z, floorColors[counter % 2]))
                    {
                        vertexList.Add(vertex);
                    }
                }
            }
            //Tworzy Buffer
            floorBuffer = new VertexBuffer(device,VertexPositionColor.VertexDeclaration,vertexList.Count,BufferUsage.None);
            floorBuffer.SetData<VertexPositionColor>(vertexList.ToArray());
        }
        //Definiuje pojedyńczą komórkę w naszej podłodze
        private List<VertexPositionColor> FloorTile(int xOffset, int zOffset, Color TileColor)
        {
            List<VertexPositionColor> vList = new List<VertexPositionColor>();
            vList.Add(new VertexPositionColor(new Vector3(0 + xOffset, 0, 0 + zOffset), TileColor));
            vList.Add(new VertexPositionColor(new Vector3(1 + xOffset, 0, 0 + zOffset), TileColor));
            vList.Add(new VertexPositionColor(new Vector3(0 + xOffset, 0, 1 + zOffset), TileColor));
            vList.Add(new VertexPositionColor(new Vector3(1 + xOffset, 0, 0 + zOffset), TileColor));
            vList.Add(new VertexPositionColor(new Vector3(1 + xOffset, 0, 1 + zOffset), TileColor));
            vList.Add(new VertexPositionColor(new Vector3(0 + xOffset, 0, 1 + zOffset), TileColor));
            return vList;
        }
        //Metoda rysująca
        public void Draw(Camera camera, BasicEffect effect)
        {
            effect.VertexColorEnabled = true;
            effect.View = camera.View;
            effect.Projection = camera.Projection;
            effect.World = Matrix.Identity;

            //Pętla rysująca Wierzchołki
            foreach (EffectPass pass in effect.CurrentTechnique.Passes)
            {
                pass.Apply();
                device.SetVertexBuffer(floorBuffer);
                device.DrawPrimitives(PrimitiveType.TriangleList, 0, floorBuffer.VertexCount / 3 );
            }
        }
    }
}

I gdy się włącza grę to wyświetla się szachownica po czym za pośrednictwem innej klasy mogę się po niej poruszać.Narazie wszystko działa ok,ale jeżeli spojrzę na szachownice pod innym kątem,tak aby np.widzieć ją od dołu,albo zobaczyć bok,to ona znika,a ja starałbym się tego unikać,wie ktoś jakich zmian muszę dokonać ?

edytowany 1x, ostatnio: Riw, 2014-08-12 06:54

Pozostało 580 znaków

2014-08-13 07:51
0

W obiektach 3d widok ściany z tyłu zawsze nie jest rysowany . Takie FPS protection bo po co rysować tył ściany w sześcianie, i tak go nie widać więc po co rysować. Boku też nie widać bo bok ściany nie ma grubości 1 piksela. On ma grubość 0 pixela. Dla obiektów 3d żeby uzyskać taki efekt jak chcesz musisz rysować sześcian o wysokości 1 pixela. Wtedy będziesz mógł oglądać bok i spód.

A jak to zrobić ? - Riw 2014-08-13 08:19

Pozostało 580 znaków

2014-08-14 08:11

W swoim programie rysujesz 1 ścianę, podłogę , powierzchnię. Zrób ich jeszcze 5 ale pamiętaj o odpowiednich wierzchołkach tak aby ściany tworzyły sześcian.

BTW.. jesteś pewny, że użytkownik musi widzieć to co dzieje się pod podłogą.... Jeśli nie to ogranicz obrót kamery do pewnego kąta

Troszkę info o grafice 3d w WPF-e. W sumie ta wiedza odnosi się do grafiki 3d w komputerach. http://kindohm.com/technical/WPF3DTutorial.htm

a wiesz może jak zrobić żeby kamera nie mogła przez tą ścianę przenikać ? - Riw 2014-08-14 11:34

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