flat7th

+ C#でXAML

created 2010-07-21 modified 2011-10-25 

C#でXAMLでWPFなキューブが回るプログラムです。
少し前まで、3DプログラミングとGUIツールキットがうまく組み合わさっているものって知らなかった。ほとんど無かったと思います。ですが、これ(WPF)は、いいです。



ダウンロードはこちら

ファイル備考
WpfApplication1.zipソース
WpfApplication1.exe実行ファイルのみ

何かのお役に立てるなら、「修正済みBSDライセンス」または「X11ライセンス」でご利用ください。

修正済みBSDライセンスとは

詳しくは さまざまなライセンスとそれらについての解説 - GNU プロジェクト - フリーソフトウェア財団 (FSF) をどうぞ。

Window1.xaml

<Window x:Class="WpfApplication1.Window1"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   Title="Window1" Height="359" Width="430">
   <Grid>
       <TextBox Name="textBox1" Margin="12,21,117,0" Height="26" VerticalAlignment="Top" />

       <Button Name="button1" Click="button1_Click" Margin="153,0,83,53" Height="26"
        VerticalAlignment="Bottom" >Button</Button>
       
       <Slider Height="22" Margin="27,0,0,25" Name="slider1"
        VerticalAlignment="Bottom" HorizontalAlignment="Left" 
        Width="154" ValueChanged="slider1_ValueChanged" Minimum="-1" Maximum="1" />

       <Canvas Margin="27,66,12,97" Name="canvas1" >

       <Viewport3D Name="vp3d" ClipToBounds="True" Width="369" Height="158"
        Canvas.Left="0" Canvas.Top="0">

           <Viewport3D.Camera>
               <PerspectiveCamera x:Name="camera" 
              FieldOfView="45"
              NearPlaneDistance="0.1" 
              FarPlaneDistance="50" 
              Position="0,3,10" 
              LookDirection="0,-3,-10" 
              UpDirection="0,10,0"/>
           </Viewport3D.Camera>

           <ModelVisual3D x:Name="object3D">
               <ModelVisual3D.Content>
                   <GeometryModel3D>
                       <GeometryModel3D.Geometry>
                           <!-- 頂点集合を定義して、頂点のインデックスで三角の集合を定義する。 -->
                           <!-- 三角を反時計回りに指定すれば、法線ベクトルは省略できるらしい。 -->
                           <MeshGeometry3D
                               Positions="
           1,1,1 -1,1,1 -1,-1,1 1,-1,1
           1,1,-1 -1,1,-1 -1,-1,-1 1,-1,-1
           "
                               TriangleIndices="
           1,2,0 3,0,2  4,7,5 6,5,7
           0,3,4 7,4,3  1,5,2 6,2,5
           5,1,4 0,4,1  3,2,7 6,7,2
           "
                               Normals=""
                               TextureCoordinates=""
           >

                           </MeshGeometry3D>
                       </GeometryModel3D.Geometry>

                       <GeometryModel3D.Material>
                           <MaterialGroup>
                               <DiffuseMaterial>
                                   <DiffuseMaterial.Brush>
                                       <SolidColorBrush Color="#ccff66"/>
                                   </DiffuseMaterial.Brush>
                               </DiffuseMaterial>
                           </MaterialGroup>
                       </GeometryModel3D.Material>

                   </GeometryModel3D>
               </ModelVisual3D.Content>
           </ModelVisual3D>

           <ModelVisual3D x:Name="Light">
               <ModelVisual3D.Content>
                   <DirectionalLight Color="#FFFFFF" Direction="-5,-5,-5" />
               </ModelVisual3D.Content>
           </ModelVisual3D>

       </Viewport3D>
   
       </Canvas>

   </Grid>
</Window>

Window1.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Media3D;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApplication1
{
   /// <summary>
   /// Window1.xaml の相互作用ロジック
   /// </summary>
   public partial class Window1 : Window
   {
       Viewport3D vp;
       PerspectiveCamera cam;
       const Double camR = 10.0;

       public Window1()
       {
           InitializeComponent();

           vp = (Viewport3D)canvas1.Children[0];
           cam = (PerspectiveCamera)vp.Camera;
       }

       private void button1_Click(object sender, RoutedEventArgs e)
       {
           DateTime dt = DateTime.Now;
           
           textBox1.Text = dt.ToString();
       }

       private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
       {
           textBox1.Text = slider1.Value.ToString();

           Double x, z;
           x = Math.Sin(slider1.Value * Math.PI / 2);
           z = Math.Cos(slider1.Value * Math.PI / 2);

           Point3D p;
           p = cam.Position;
           p.X = x * camR;
           p.Z = z * camR;
           cam.Position = p;

           Vector3D v;
           v = cam.LookDirection;
           v.X = -x * camR;
           v.Z = -z * camR;
           cam.LookDirection = v;
       }
   }
}