Как экспортировать текстуры fbx из Blender для использования в Monogame - PullRequest
0 голосов
/ 27 апреля 2019

Я пытаюсь использовать Blender, чтобы сделать простую игральную карту с текстурой с обеих сторон для лица и спины и загрузить ее в Monogame.Сама модель в порядке и показывает на эмуляторе при запуске, но я не могу включить текстуры.

Genymotion emulator

Текстуры на карте, кажется, хорошо отображаются вBlender.Материалы настроены на «без тени», поэтому на них не должны влиять правильные уровни освещенности?

Card in Blender

Я пробовал использовать разные настройки версии и различные режимы пути из«копировать» в «полосу пути» при экспорте файла.

Export FBX settings

В менеджере контента выходной каталог настроен на основную папку контента, поэтому проблем со ссылками не должно бытьс текстурами я надеюсь.

Content manager

Все текстуры находятся в одной папке.

Textures

Содержимое - всезагружен вручную в Visual Studio.

Solution Explorer

Вот код, который я использую для рисования карты, показывающей различные настройки освещения, с которыми я играл.

    private void DrawCard(Model m, Vector3 v, CardFacing c, PlayerFacing p)
    {
        foreach (var mesh in m.Meshes)
        {
            foreach (var effect1 in mesh.Effects)
            {
                var effect = (BasicEffect)effect1;

                effect.TextureEnabled = true;
                effect.EnableDefaultLighting();
                //effect.PreferPerPixelLighting = true;

                //effect.AmbientLightColor = Color.White.ToVector3();
                effect.DiffuseColor = Color.White.ToVector3();
                //effect.EmissiveColor = Color.White.ToVector3() * 2f;

                //effect.DirectionalLight0.Direction = Vector3.Normalize(new Vector3(0, 0, 1));

                effect.Alpha = 1;
                effect.VertexColorEnabled = false;

                Matrix mCardFacing = new Matrix();

                switch(c)
                {
                    case CardFacing.Down:
                        mCardFacing = Matrix.CreateRotationY((float)(Math.PI / 180) * 180) * Matrix.CreateRotationX((float)(Math.PI / 180) * 90) * Matrix.CreateTranslation(new Vector3(0, 0, 0));
                        break;
                    case CardFacing.Up:
                        mCardFacing = Matrix.CreateRotationZ((float)(Math.PI / 180) * 180) * Matrix.CreateRotationX((float)(Math.PI / 180) * 90) * Matrix.CreateTranslation(new Vector3(0, 0, 0));
                        break;
                    case CardFacing.Hand:
                        mCardFacing = Matrix.CreateRotationX((float)(Math.PI / 180) * -20);
                        break;
                }

                Matrix mPlayerFacing = new Matrix();

                switch (p)
                {
                    case PlayerFacing.North:
                        mPlayerFacing = Matrix.CreateRotationZ((float)(Math.PI / 180) * 0);
                        break;
                    case PlayerFacing.East:
                        mPlayerFacing = Matrix.CreateRotationZ((float)(Math.PI / 180) * 90);
                        break;
                    case PlayerFacing.South:
                        mPlayerFacing = Matrix.CreateRotationZ((float)(Math.PI / 180) * 180);
                        break;
                    case PlayerFacing.West:
                        mPlayerFacing = Matrix.CreateRotationZ((float)(Math.PI / 180) * 270);
                        break;
                }

                effect.World = mCardFacing * Matrix.CreateTranslation(v) * mPlayerFacing;
                effect.View = view;
                effect.Projection = projection;
            }

            mesh.Draw();
        }
    }

Есть идеи?Спасибо.

1 Ответ

1 голос
/ 29 апреля 2019

3D-модель обычно не содержит текстуру.Файл FBX хранит информацию о том, где находится каждая вершина, как они связаны и какая часть текстуры находится в любой отдельной точке.

Он не хранит текстуру.Поэтому вам нужно загружать текстуру отдельно, как вы загружаете любую другую текстуру (вам нужна Texture2D, даже если это 3d-модель).

Затем вы можете назначить свою текстуру эффекту:

effect.Texture = cardTexture;

Я считаю, что это должно правильно отображать эффект.

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

...