I
ITD_Chair
Guest
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: Portable Network Graphics - Wikipedia
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);
}
}
}
Continue reading...
possible texture: Portable Network Graphics - Wikipedia
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);
}
}
}
Continue reading...