Вопрос

Что ж, я создаю минкрафт, подобную местности, которая - как Minecraft разделится на регионы. Моя проблема просто в том, что некоторые лица не показываются, а верхняя и правая часть регионов 6x6 не показывают.

Мне было интересно, сможет ли кто -нибудь проверить мой код, чтобы увидеть, что я делаю не так, вот функция:

    public void BuildFaceVertices(Vector3 pos, BlockFaceDirection blockFaceDirection)
    {
        Vector3 topLeftFront = new Vector3(0f, 1f, 0f) + pos;
        Vector3 bottomLeftFront = new Vector3(0f, 0f, 0f) + pos;
        Vector3 topRightFront = new Vector3(1f, 1f, 0f) + pos;
        Vector3 bottomRightFront = new Vector3(1f, 0f, 0f) + pos;
        Vector3 topLeftBack = new Vector3(0f, 1f, -1f) + pos;
        Vector3 topRightBack = new Vector3(1f, 1f, -1f) + pos;
        Vector3 bottomLeftBack = new Vector3(0f, 0f, -1f) + pos;
        Vector3 bottomRightBack = new Vector3(1f, 0f, -1f) + pos;

        Vector2 topLeft = new Vector2(0.0f, 0.0f);
        Vector2 topRight = new Vector2(1.0f, 0.0f);
        Vector2 bottomLeft = new Vector2(0.0f, 1.0f);
        Vector2 bottomRight = new Vector2(1.0f, 1.0f);

        switch (blockFaceDirection)
        {
            case BlockFaceDirection.ZIncreasing:
                SolidVertices.Add(new VertexPositionTexture(topRightFront, topRight));
                SolidVertices.Add(new VertexPositionTexture(bottomRightFront, bottomRight));
                SolidVertices.Add(new VertexPositionTexture(bottomLeftFront, bottomLeft));
                SolidVertices.Add(new VertexPositionTexture(topRightFront, topRight));
                SolidVertices.Add(new VertexPositionTexture(bottomLeftFront, bottomLeft));
                SolidVertices.Add(new VertexPositionTexture(topLeftFront, topLeft));
                break;
            case BlockFaceDirection.ZDecreasing:
                SolidVertices.Add(new VertexPositionTexture(topRightBack, topLeft));
                SolidVertices.Add(new VertexPositionTexture(topLeftBack, topRight));
                SolidVertices.Add(new VertexPositionTexture(bottomRightBack, bottomLeft));

                SolidVertices.Add(new VertexPositionTexture(topLeftBack, topRight));
                SolidVertices.Add(new VertexPositionTexture(bottomLeftBack, bottomRight));
                SolidVertices.Add(new VertexPositionTexture(bottomRightBack, bottomLeft));              
                break;
            case BlockFaceDirection.YIncreasing:
                SolidVertices.Add(new VertexPositionTexture(topRightBack, topRight));
                SolidVertices.Add(new VertexPositionTexture(topRightFront, bottomRight));
                SolidVertices.Add(new VertexPositionTexture(topLeftFront, bottomLeft));

                SolidVertices.Add(new VertexPositionTexture(topRightBack, topRight));
                SolidVertices.Add(new VertexPositionTexture(topLeftFront, bottomLeft));
                SolidVertices.Add(new VertexPositionTexture(topLeftBack, topLeft));                 
                break;
            case BlockFaceDirection.YDecreasing:
                SolidVertices.Add(new VertexPositionTexture(bottomLeftFront, topLeft));
                SolidVertices.Add(new VertexPositionTexture(bottomRightFront, topRight));
                SolidVertices.Add(new VertexPositionTexture(bottomLeftBack, bottomLeft));

                SolidVertices.Add(new VertexPositionTexture(bottomRightFront, topRight));
                SolidVertices.Add(new VertexPositionTexture(bottomRightBack, bottomRight));
                SolidVertices.Add(new VertexPositionTexture(bottomLeftBack, bottomLeft));
                break;
            case BlockFaceDirection.XIncreasing:
                SolidVertices.Add(new VertexPositionTexture(topRightBack, topRight));
                SolidVertices.Add(new VertexPositionTexture(bottomRightFront, bottomLeft));
                SolidVertices.Add(new VertexPositionTexture(topRightFront, topLeft));
                SolidVertices.Add(new VertexPositionTexture(topRightBack, topRight));
                SolidVertices.Add(new VertexPositionTexture(bottomRightBack, bottomRight));
                SolidVertices.Add(new VertexPositionTexture(bottomRightFront, bottomLeft));
                break;
            case BlockFaceDirection.XDecreasing:
                SolidVertices.Add(new VertexPositionTexture(topLeftBack, topLeft));
                SolidVertices.Add(new VertexPositionTexture(topLeftFront, topRight));
                SolidVertices.Add(new VertexPositionTexture(bottomLeftFront, bottomRight));
                SolidVertices.Add(new VertexPositionTexture(topLeftBack, topLeft));
                SolidVertices.Add(new VertexPositionTexture(bottomLeftFront, bottomRight));
                SolidVertices.Add(new VertexPositionTexture(bottomLeftBack, bottomLeft));
                break;

        }
    }'

Этот код отображается: s1100.photobucket.com/albums/g420/darestium/ Первое изображение имеет лица, которые не рисуют, а последнее имеет стороны областей, которые не нарисованы.

Заранее спасибо, Darestium

Это было полезно?

Решение

Ваша проблема связана с тем, что называется Backface Culling. Недавно я создал что -то похожее на то, что вы делаете, и столкнулся с теми же проблемами. Решение простое, но может быть сложно в зависимости от того, как вы создаете свои вершины. Решение: вы должны построить свои индексы в порядке по часовой стрелке. Это означает, что если вы смотрите на лицо с той стороны, с которой вы хотите увидеть его, индексы этого лица должны быть в порядке по часовой стрелке в вашем массиве. Похоже, вы не включили свой код для строительных индексов, только вершины, но я сделаю предложение, что вы создаете свой Вершины В порядке по часовой стрелке, а затем просто перечислите свои индексы как 0, 1, 2 (и т. Д., В порядке). Из бегемого взгляда на ваш оператор переключателя кажется, что вершины «Zincrearing» направления находятся в порядке по часовой стрелке, но «Zdecreasing» переходит от Top Right к Topleft к инициативу. Если вы просматриваете «zdecreasing» лицо со спины, как я думаю, тогда я думаю, что это порядок против часовой стрелки, и не появится (или, скорее, будет нарисована внутренняя сторона этой части куба, которое будет вам не видно).

Если в вашей голове трудно придумать, просто сделайте небольшой бумажный куб и маркируйте углы. Когда вы создаете вершины, проследите углы и убедитесь, что они находятся в порядке по часовой стрелке.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top