我只是想用图像(纹理文件here)纹理一个3D对象。为此,我使用了System.Windows.Media3D
这些东西。我的问题是立方体没有用图像纹理化。当我用 a 绘制立方体时SolidColorBrush
,立方体是可见的。用 Cube替换后SolidColorBrush
,ImageBrush
Cube 变得不可见。我的错在哪里?下面的代码使用了程序化的方法,因为我想在后面的程序中动态生成纹理和网格。
主窗口.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>
主窗口.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 = @"./Texture.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(imgBrush);
//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);
}
}
}