第28回codeseek勉強会

勉強会のお知らせです。

http://www.codeseek.net/event/index.html

 
—————————-
第28回codeseek勉強会
「Windows Server 2008、Visual Studio 2008、SQL Server 2008コミュニティラウンチ」
(共催:tk-engineeringこみゅぷらすeパウダ~.Net/C# Group)
2008年5月27日(火) 19:00~21:00

場所:渋谷駅からすぐの貸し会議室 (ご登録後お知らせいたします)

募集締め切り:2008年5月25(日)23時59分59秒
24名まで
無料

第28回codeseek勉強会は、
Windows Server 2008、Visual Studio 2008、SQL Server 2008の発売に合わせた、
コミュニティラウンチとして開催します。
スピーカーは、宇宙仮面様、めさいあ様、ひろりん様、こた様の予定です。
内容については調整中です。

参加をご希望の方は以下の事項を記入しメールにてご登録ください。

送付先:codeseektatsugoro(アットマーク)yahoo.co.jp

メールタイトル:codeseek勉強会参加希望
名前(必須):
メールアドレス(必須):
住所(必須):
ハンドル:
連絡用電話番号:
懇親会に参加する:はい/いいえ/未定

いただいた情報はcodeseekの活動自身のためにしか使いません。
いただいた情報を会場にお知らせすることがあります。
登録なしでの参加はできません。

WPF Morphing してみる

眼を開いた状態と目を閉じた状態の MeshGeometry3Dを、スライダーで線形合成してみた

左から右へ、眼を開いた状態、目を閉じた状態、合成したもの

眼をあいている状態では、目の周りにアイシャドウを引いていたりして、合成した時に汚くなることがある。結構細かいところに気をつける必要あり。

それから、六角大王で dxf ファイルにエクスポートした際に、頂点数が変わってしまう。このため、単純にマッピングできず、TriangleIndices でマッピングを取っている。このため、処理的にはかなり重い。動かない場所は処理しないなどの高速化が必要かもしれない。

それから、六角大王から通常状態と目を閉じた状態でエクスポートした場合、わずかに座標がずれている。このため、単純に動かない場所は処理しないという処理ができない。結構厄介だ・・・・・

namespace Morphing_V1
{
    public partial class Window1 : System.Windows.Window
    {

・・・
        GeometryModel3D gm1 = null;
        MeshGeometry3D mg10 = null;
        Point3DCollection p3dcol10 = null;

・・・

        private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            double v = this.slider1.Value / 10d;
            for (int c = 0; c < this.NormalOR32.Children.Count; c++)
            {
                gm1 = (GeometryModel3D)(this.NormalOR32.Children[c]);
                mg10 = (MeshGeometry3D)(gm1.Geometry);
                p3dcol10 = mg10.Positions;

                gm2 = (GeometryModel3D)(this.CloseEyesOR40.Children[c]);
                mg20 = (MeshGeometry3D)(gm2.Geometry);
                p3dcol20 = mg20.Positions;                gmRes = (GeometryModel3D)(this.ResOR50.Children[c]);
                mRes = (MeshGeometry3D)(gmRes.Geometry);
                poRes = mRes.Positions;                Point3DCollection resPoCol = poRes;                for (int j = 0; j < mg10.TriangleIndices.Count; j++)
                {
                    int inorm = mg10.TriangleIndices[j];
                    int ia = mg20.TriangleIndices[j];
                    resPoCol[ia] = new Point3D(
                        p3dcol10[inorm].X * v + p3dcol20[ia].X * (1.0 – v),
                        p3dcol10[inorm].Y * v + p3dcol20[ia].Y * (1.0 – v),
                        p3dcol10[inorm].Z * v + p3dcol20[ia].Z * (1.0 – v));
                }
                mRes.Positions = resPoCol;            }
        }
    }
}

頂点座標を直接変更する

スライダーで、MeshGeometry3Dの BOX の頂点座標 Positions を直接変更してみる。このぐらいの頂点数なら問題なくスムーズに変形できるが・・・・・

image

image

using System;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Media3D;namespace Morphing_V2
{
    public partial class Window1 : System.Windows.Window
    {
        private void slider1_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
        {
            double v = slider1.Value / 10f;

            GeometryModel3D gm3d = (GeometryModel3D)this.BoxOR9.Children[0];
            MeshGeometry3D mesh3d = (MeshGeometry3D)gm3d.Geometry;            for (int i = 0; i < mesh3d.Positions.Count; i++)
            {
                mesh3d.Positions[i] = new Point3D(
                   originalMeshGeometry3DPosition[i].X * v,
                   originalMeshGeometry3DPosition[i].Y * v,
                   originalMeshGeometry3DPosition[i].Z * v);
            }
        }        Point3DCollection originalMeshGeometry3DPosition = null;        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            GeometryModel3D gm3d = (GeometryModel3D)this.BoxOR9.Children[0];
            MeshGeometry3D mesh3d = (MeshGeometry3D)gm3d.Geometry;            originalMeshGeometry3DPosition = new Point3DCollection();
            for (int i = 0; i < mesh3d.Positions.Count; i++)
                originalMeshGeometry3DPosition.Add(mesh3d.Positions[i]);
        }
    }
}<Window x:Class=”Morphing_V2.Window1″ Title=”Morphing_V2″ Width=”497″ Height=”450″ 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/interactivedesigner/2006″ xmlns:c=”http://schemas.openxmlformats.org/markup-compatibility/2006″ c:Ignorable=”d” Loaded=”Window_Loaded”>
    <Grid>
        <Viewport3D x:Name=”ZAM3DViewport3D” ClipToBounds=”true” Width=”400″ Height=”300″>
            <Viewport3D.Resources>
                <ResourceDictionary>
                    <MaterialGroup x:Key=”ER___Default_MaterialMR1″ >
                        <DiffuseMaterial>
                            <DiffuseMaterial.Brush>
                                <SolidColorBrush Color=”#D3C8AD” Opacity=”1.000000″/>
                            </DiffuseMaterial.Brush>
                        </DiffuseMaterial>
                        <SpecularMaterial SpecularPower=”93.8667″>
                            <SpecularMaterial.Brush>
                                <SolidColorBrush Color=”#333333″ Opacity=”1.000000″/>
                            </SpecularMaterial.Brush>
                        </SpecularMaterial>
                    </MaterialGroup>
                    <Transform3DGroup x:Key=”SceneTR7″ >
                        <TranslateTransform3D OffsetX=”0″ OffsetY=”0″ OffsetZ=”0″/>
                        <ScaleTransform3D ScaleX=”1″ ScaleY=”1″ ScaleZ=”1″/>
                        <RotateTransform3D>
                            <RotateTransform3D.Rotation>
                                <AxisAngleRotation3D Angle=”0″ Axis=”0 1 0″/>
                            </RotateTransform3D.Rotation>
                        </RotateTransform3D>
                        <TranslateTransform3D OffsetX=”0″ OffsetY=”0″ OffsetZ=”0″/>
                    </Transform3DGroup>
                    <Transform3DGroup x:Key=”BoxOR9TR8″ >
                        <TranslateTransform3D OffsetX=”0″ OffsetY=”0″ OffsetZ=”0″/>
                        <ScaleTransform3D ScaleX=”1″ ScaleY=”1″ ScaleZ=”1″/>
                        <RotateTransform3D>
                            <RotateTransform3D.Rotation>
                                <AxisAngleRotation3D Angle=”47.33348273″ Axis=”0.5325566653 -0.8245461129 -0.1910683281″/>
                            </RotateTransform3D.Rotation>
                        </RotateTransform3D>
                        <TranslateTransform3D OffsetX=”0″ OffsetY=”0″ OffsetZ=”0″/>
                    </Transform3DGroup>
                    <MeshGeometry3D x:Key=”BoxOR9GR10″
                        TriangleIndices=”0,1,2 2,3,0 4,5,6 6,7,4 8,9,10 10,11,8 12,13,14 14,15,12 16,17,18 18,19,16 20,21,22 22,23,20 ”
                        Normals=”0,0,-1 0,0,-1 0,0,-1 0,0,-1 0,0,1 0,0,1 0,0,1 0,0,1 0,-1,0 0,-1,0 0,-1,0 0,-1,0 1,0,0 1,0,0 1,0,0 1,0,0 0,1,0 0,1,0 0,1,0 0,1,0 -1,0,0 -1,0,0 -1,0,0 -1,0,0 ”
                        Positions=”-0.5,-0.5,-0.5 -0.5,0.5,-0.5 0.5,0.5,-0.5 0.5,-0.5,-0.5 -0.5,-0.5,0.5 0.5,-0.5,0.5 0.5,0.5,0.5 -0.5,0.5,0.5 -0.5,-0.5,-0.5 0.5,-0.5,-0.5 0.5,-0.5,0.5 -0.5,-0.5,0.5 0.5,-0.5,-0.5 0.5,0.5,-0.5 0.5,0.5,0.5 0.5,-0.5,0.5 0.5,0.5,-0.5 -0.5,0.5,-0.5 -0.5,0.5,0.5 0.5,0.5,0.5 -0.5,0.5,-0.5 -0.5,-0.5,-0.5 -0.5,-0.5,0.5 -0.5,0.5,0.5 ”
                    />
                </ResourceDictionary>
            </Viewport3D.Resources>            <Viewport3D.Camera>
                <PerspectiveCamera x:Name=”FrontOR6″ FarPlaneDistance=”10″ LookDirection=”0,0,-1″ UpDirection=”0,1,0″ NearPlaneDistance=”1″ Position=”0,0,2.38423″ FieldOfView=”39.5978″ />
            </Viewport3D.Camera>            <ModelVisual3D>
                <ModelVisual3D.Content>
                    <Model3DGroup x:Name=”Scene” Transform=”{DynamicResource SceneTR7}”> <!– Scene (XAML Path = ) –>
                        <AmbientLight Color=”#333333″ />
                        <DirectionalLight Color=”#FFFFFF” Direction=”-0.612372,-0.5,-0.612372″ />
                        <DirectionalLight Color=”#FFFFFF” Direction=”0.612372,-0.5,-0.612372″ />
                        <Model3DGroup x:Name=”BoxOR9″ Transform=”{DynamicResource BoxOR9TR8}”> <!– Box (XAML Path = (Viewport3D.Children)[0].(ModelVisual3D.Content).(Model3DGroup.Children)[3]) –>
                            <GeometryModel3D x:Name=”BoxOR9GR10″ Geometry=”{DynamicResource BoxOR9GR10}” Material=”{DynamicResource ER___Default_MaterialMR1}” BackMaterial=”{DynamicResource ER___Default_MaterialMR1}”/>
                        </Model3DGroup>
                    </Model3DGroup>
                </ModelVisual3D.Content>
            </ModelVisual3D>
        </Viewport3D>
        <Slider Height=”31″ HorizontalAlignment=”Left” Margin=”37.5,0,0,8″ Name=”slider1″ VerticalAlignment=”Bottom” Width=”100″ ValueChanged=”slider1_ValueChanged” />
    </Grid>
</Window>

第27回 Codeseek勉強会 プレゼン・デモ資料

2008年4月30日(水) 第27回 Codeseek勉強会で、「宇宙仮面のZAM3D で簡単3D XAML プログラミング」というタイトルで、僭越ながら講師をやらせていただきました。
ここでは、その資料、デモサンプルなどをアップします。
AGENDA
  1. 自己紹介
  2. WPF と XAML の概要
  3. Expression Blend
  4. ZAM3D とは
  5. ZAM3D と Visual Studio の連携
  6. XAML の基礎 Viewport3D
  7. アニメーションと Storyboard
  8. WPF の 3D 能力
  9. 3Dデータのインポート
  10. 回してみよう
  11. ベクトルの外積とクオータニオン
  12. 触ってみよう Hit Test
  13. おまけ 初音ミクは電気羊の夢を見るか
説明に使用した PowerPoint はこちらからどおぞ。
デモパッケージ
デモに使用したパッケージはこちらからどおぞ。
巨大(78MB)なので、ご注意ください。
また、グラフィックスアクセラレータがないと、厳しいです。
使用したなソフトウェア
  • ZAM 3D 1.0
  • Visual Studio 2008
  • 六角大王 Super 5.5
注意
このデモで使用している 3D データは下記のものを使用しています。使用条件は下記 URL より確認してください。
HONDA CRX の 3D モデリングデータ
http://www.honda.co.jp/WebPlamo/
初音ミクの 3D モデリングデータ
http://kiomodel3.sblo.jp/