概要
HelixToolkitは、オブジェクトに対してマテリアルとして画像を貼ることができます。
貼る方法の備忘録です。
XAMLで指定する方法
XAMLで、RectangleVisual3Dに画像を貼り付ける方法は、下記のとおりとなります。
画像は何故か90度転倒した状態で表示されるためRotateTransformを使って補正しています。
カメラ位置の問題かとも思ったのですが、ViewCubeの表示からすると正しいようなので、画像の方で対応しています。
<Window x:Class="HelixToolkitTestSample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:helix="clr-namespace:HelixToolkit.Wpf;assembly=HelixToolkit.Wpf"
Title="MainWindow"
Width="800"
Height="600"
Background="Black">
<Grid>
<helix:HelixViewport3D x:Name="viewport3d"
ShowCameraInfo="True"
ShowViewCube="True">
<!-- カメラ -->
<helix:HelixViewport3D.DefaultCamera>
<PerspectiveCamera FieldOfView="45"
LookDirection="0.0,0.0,-122.334"
NearPlaneDistance="0.125"
Position="0.966,0.831,68.597"
UpDirection="0.0,1.0,0.0" />
</helix:HelixViewport3D.DefaultCamera>
<!-- 光源 -->
<helix:SunLight />
<helix:RectangleVisual3D Width="30" Length="40">
<helix:RectangleVisual3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<ImageBrush ImageSource="pack://application:,,,/Images/grayscale28.jpg">
<ImageBrush.Transform>
<RotateTransform CenterX="0.5" CenterY="0.5" Angle="90" />
</ImageBrush.Transform>
</ImageBrush>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</helix:RectangleVisual3D.Material>
</helix:RectangleVisual3D>
</helix:HelixViewport3D>
</Grid>
</Window>
コードビハインドで指定する方法
DiffuseMaterialクラスを使って、画像を指定する方法は一緒です。
HelixToolkitには、MaterialHelperクラスというユーティリティクラスが用意されておりMaterialHelper.CreateImageMaterialメソッドなどを利用すると簡単にBitmapImageをマテリアルへ変換する事ができます。
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var image = new BitmapImage(new Uri("pack://application:,,,/Images/grayscale28.jpg"));
var brush = new ImageBrush(image);
brush.Transform = new RotateTransform(90, 0.5, 0.5);
var material = new DiffuseMaterial(brush);
var rect = new RectangleVisual3D() { Width = 30, Length = 40, Material = material };
viewport3d.Children.Add(rect);
}
}