Cube with texture not visible

ITD Weimar 21 Reputation points
2020-10-15T07:44:51.98+00:00

I want to texture a cube with an image. My problem is, that the cube is invisible in case I use the ImageBrush. When using a SolidColorBrush everything is fine. I need to do this programmatically because in the main project all objects and materials are created on runtime. I don't know where my fault is. May someone help me to figure it out?

possible texture: https://en.wikipedia.org/wiki/Portable_Network_Graphics#/media/File:PNG_transparency_demonstration_1.png

MainWindow.xaml

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Label 
                HorizontalAlignment="Center" 
                TextBlock.TextAlignment="Center" 
                FontSize="20" 
                Foreground="Red" 
                Content="Model: Cube"/>
        <Viewport3D x:Name="MainViewport">
            <Viewport3D.Camera>
                <PerspectiveCamera 
                        FarPlaneDistance="20" 
                        LookDirection="0,0,1" 
                        UpDirection="0,1,0" 
                        NearPlaneDistance="1" 
                        Position="0,0,-3" 
                        FieldOfView="45" />
            </Viewport3D.Camera>
        </Viewport3D>
    </Grid>
</Window>

MainWindow.xaml.cs

using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Media.Media3D;

namespace WpfApp1
{
    /// <summary>
    /// Interaktionslogik für MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            //setup the 3D Object
            ModelVisual3D model = new ModelVisual3D();
            Model3DGroup mdlGroup = new Model3DGroup();

            //Jpg Texture as main purpose
            BitmapImage imgSource = new BitmapImage();
            string texturePath = @"./Texture2.PNG";
            imgSource.BeginInit();
            imgSource.UriSource = new Uri(texturePath, UriKind.Relative);
            imgSource.EndInit();
            ImageBrush imgBrush = new ImageBrush(imgSource);

            //Solid Black as alternative for testing
            SolidColorBrush colorBrush = new SolidColorBrush(Color.FromRgb(0,0,0));

            //Create Material
            DiffuseMaterial material = new DiffuseMaterial(colorBrush);

            //Generating the model
            GeometryModel3D internalModel = new GeometryModel3D(new MeshGeometry3D(), material)
            {
                BackMaterial = material
            };

            //Generating the mesh of the model
            MeshGeometry3D mesh = (MeshGeometry3D)internalModel.Geometry;
            mesh.Positions.Add(new Point3D(-0.5, -0.5, -0.5));
            mesh.Positions.Add(new Point3D(-0.5, 0.5, -0.5));
            mesh.Positions.Add(new Point3D(0.5, 0.5, -0.5));
            mesh.Positions.Add(new Point3D(0.5, 0.5, -0.5));
            mesh.Positions.Add(new Point3D(0.5, -0.5, -0.5));
            mesh.Positions.Add(new Point3D(-0.5, -0.5, -0.5));
            mesh.TriangleIndices.Add(0);
            mesh.TriangleIndices.Add(1);
            mesh.TriangleIndices.Add(2);
            mesh.TriangleIndices.Add(3);
            mesh.TriangleIndices.Add(4);
            mesh.TriangleIndices.Add(5);
            mesh.Normals.Add(new Vector3D(0, 0, -1));
            mesh.Normals.Add(new Vector3D(0, 0, -1));
            mesh.Normals.Add(new Vector3D(0, 0, -1));
            mesh.Normals.Add(new Vector3D(0, 0, -1));
            mesh.Normals.Add(new Vector3D(0, 0, -1));
            mesh.Normals.Add(new Vector3D(0, 0, -1));
            mesh.Freeze();

            //including everything
            mdlGroup.Children.Add(internalModel);
            DirectionalLight myDirLight = new DirectionalLight
            {
                Color = Colors.White,
                Direction = new Vector3D(-3, -4, -5)
            };
            mdlGroup.Children.Add(myDirLight);
            model.Content = mdlGroup;
            this.MainViewport.Children.Add(model);
        }
    }
}
Windows Presentation Foundation
Windows Presentation Foundation
A part of the .NET Framework that provides a unified programming model for building line-of-business desktop applications on Windows.
2,756 questions
0 comments No comments
{count} votes

Accepted answer
  1. Peter Fleischer (former MVP) 19,321 Reputation points
    2020-10-15T10:38:47.153+00:00

    Hi,
    your PerspectiveCamera look to the front side. If you want to see the BackMaterial set PerspectiveCamera to other direction:

                 <PerspectiveCamera 
                         FarPlaneDistance="20" 
                         LookDirection="0,0,-1" 
                         UpDirection="0,1,0" 
                         NearPlaneDistance="1" 
                         Position="0,0,3" 
                         FieldOfView="45" />
    

0 additional answers

Sort by: Most helpful

Your answer

Answers can be marked as Accepted Answers by the question author, which helps users to know the answer solved the author's problem.