1. 程式人生 > >使用WPF實現3D場景[一]

使用WPF實現3D場景[一]

建立 release http fuse 就是 eat solid width 源代碼

原文:使用WPF實現3D場景[一]

在這篇文章裏,將介紹如何實現一個簡單的三維場景,一個三維的空間,包括空間內的三維物體的組合.

首先介紹一下一個三維場景裏的基本元素:

先是定義一個簡單的三維的場景環境

代碼如下:

技術分享圖片<Viewport3D?Name="myViewport">
技術分享圖片
</Viewport3D>

以上是定義了一個名稱叫做 myViewport 的的三維場景,接下來可以在這個三位場景裏添加一些元素:

元素一:照相機

照相機是三維場景內用戶的視角,當然照相機也是唯一的。

來看如何定義一個簡單的照相機代碼:

技術分享圖片<Viewport3D.Camera>
技術分享圖片????????
<PerspectiveCamera?FarPlaneDistance="3000"?NearPlaneDistance="0.25"?FieldOfView="90"?Position="1800,0,0"?LookDirection="-1,0,0"?UpDirection="0,1,0"></PerspectiveCamera>
技術分享圖片??????
</Viewport3D.Camera>

這裏面描述了照相機在三維場景裏的位置,包括它觀察的角度,最遠的視線,等等這樣信息和屬性。如果想靈活的使用照相機改變視角會在第二講和第三講裏詳盡的介紹。

元素一:三維模型

三維模型是三維場景內的物體,也就是模型中的元素,不唯一,可以組合,重疊。

來看如何定義一個簡單的三維模型組合的代碼:

技術分享圖片??????<ModelVisual3D?x:Name="topModelVisual3D">
技術分享圖片????????
<ModelVisual3D.Children>
技術分享圖片??????????
<ModelVisual3D>
技術分享圖片????????????
<ModelVisual3D.Content>
技術分享圖片??????????????
<DirectionalLight?Color="#FFFFFFFF"?Direction
="-3,-4,-5"?/>
技術分享圖片????????????
</ModelVisual3D.Content>
技術分享圖片??????????
</ModelVisual3D>
技術分享圖片
技術分享圖片??????????
<ModelVisual3D>
技術分享圖片????????????
<ModelVisual3D.Content>
技術分享圖片??????????????
<GeometryModel3D?Geometry="{StaticResource?chair}">
技術分享圖片????????????????
<GeometryModel3D.Material>
技術分享圖片??????????????????
<DiffuseMaterial>
技術分享圖片????????????????????
<DiffuseMaterial.Brush>
技術分享圖片??????????????????????
<SolidColorBrush?Color="Yellow"?Opacity="1.0"?/>
技術分享圖片????????????????????
</DiffuseMaterial.Brush>
技術分享圖片??????????????????
</DiffuseMaterial>
技術分享圖片????????????????
</GeometryModel3D.Material>
技術分享圖片????????????????
<GeometryModel3D.Transform>
技術分享圖片??????????????????
<TranslateTransform3D?OffsetX="0"?OffsetY="-200"?OffsetZ="-600"?/>
技術分享圖片????????????????
</GeometryModel3D.Transform>
技術分享圖片??????????????
</GeometryModel3D>
技術分享圖片????????????
</ModelVisual3D.Content>
技術分享圖片??????????
</ModelVisual3D>
技術分享圖片
技術分享圖片??????????
<ModelVisual3D>
技術分享圖片????????????
<ModelVisual3D.Content>
技術分享圖片??????????????
<GeometryModel3D?Geometry="{StaticResource?table}">
技術分享圖片????????????????
<GeometryModel3D.Material>
技術分享圖片??????????????????
<DiffuseMaterial>
技術分享圖片????????????????????
<DiffuseMaterial.Brush>
技術分享圖片??????????????????????
<SolidColorBrush?Color="Yellow"?Opacity="1.0"?/>
技術分享圖片????????????????????
</DiffuseMaterial.Brush>
技術分享圖片??????????????????
</DiffuseMaterial>
技術分享圖片????????????????
</GeometryModel3D.Material>
技術分享圖片????????????????
<GeometryModel3D.Transform>
技術分享圖片??????????????????
<TranslateTransform3D?OffsetX="0"?OffsetY="20"?OffsetZ="60"?/>
技術分享圖片????????????????
</GeometryModel3D.Transform>
技術分享圖片??????????????
</GeometryModel3D>
技術分享圖片????????????
</ModelVisual3D.Content>
技術分享圖片??????????
</ModelVisual3D>
技術分享圖片
技術分享圖片
技術分享圖片??????????
<ModelVisual3D>
技術分享圖片????????????
<ModelVisual3D.Content>
技術分享圖片??????????????
<GeometryModel3D?Geometry="{StaticResource?man}">
技術分享圖片????????????????
<GeometryModel3D.Material>
技術分享圖片??????????????????
<DiffuseMaterial>
技術分享圖片????????????????????
<DiffuseMaterial.Brush>
技術分享圖片??????????????????????
<SolidColorBrush?Color="black"?Opacity="1.0"?/>
技術分享圖片????????????????????
</DiffuseMaterial.Brush>
技術分享圖片??????????????????
</DiffuseMaterial>
技術分享圖片????????????????
</GeometryModel3D.Material>
技術分享圖片????????????????
<GeometryModel3D.Transform>
技術分享圖片??????????????????
<TranslateTransform3D?OffsetX="75"?OffsetY="20"?OffsetZ="0"?/>
技術分享圖片????????????????
</GeometryModel3D.Transform>
技術分享圖片??????????????
</GeometryModel3D>
技術分享圖片????????????
</ModelVisual3D.Content>
技術分享圖片????????????
技術分享圖片????????????
技術分享圖片????????????
<ModelVisual3D.Transform>
技術分享圖片??????????????
<Transform3DGroup>
技術分享圖片????????????????
<ScaleTransform3D?ScaleX="10"?ScaleY="10"?ScaleZ="10"??x:Name="scaleTransform"/>
技術分享圖片????????????????
<MatrixTransform3D/>
技術分享圖片????????????????
<RotateTransform3D?>
技術分享圖片??????????????????
<RotateTransform3D.Rotation?>
技術分享圖片????????????????????
<AxisAngleRotation3D?Angle="275"?Axis="0,0,1"?x:Name="myAngleRotationMan"/>
技術分享圖片??????????????????
</RotateTransform3D.Rotation>
技術分享圖片????????????????
</RotateTransform3D>
技術分享圖片??????????????
</Transform3DGroup>
技術分享圖片????????????
</ModelVisual3D.Transform>?
技術分享圖片????????????
技術分享圖片????????????
技術分享圖片??????????
</ModelVisual3D>
技術分享圖片????????
</ModelVisual3D.Children>
技術分享圖片????????
技術分享圖片????????
<ModelVisual3D.Transform>
技術分享圖片??????????
<Transform3DGroup>
技術分享圖片????????????
<MatrixTransform3D/>
技術分享圖片????????????
<RotateTransform3D?>
技術分享圖片??????????????
<RotateTransform3D.Rotation?>
技術分享圖片????????????????
<AxisAngleRotation3D?Angle="0"?Axis="0,10,0"?x:Name="myAngleRotationChair"/>
技術分享圖片??????????????
</RotateTransform3D.Rotation>
技術分享圖片????????????
</RotateTransform3D>
技術分享圖片??????????
</Transform3DGroup>
技術分享圖片????????
</ModelVisual3D.Transform>
技術分享圖片??????
</ModelVisual3D>

來看一下效果:

?

?

?

技術分享圖片

到這裏就完成了整個的三維場景的建立。

補充元素:動畫效果

如果想讓整體的三維模型都能動起來,就需要為三維場景添加動畫效果。

看一段可以讓三維場景按縱軸(中心軸)旋轉的代碼:

技術分享圖片???<Viewport3D.Triggers>
技術分享圖片????????
<EventTrigger?RoutedEvent="Viewport3D.Loaded">
技術分享圖片??????????
<BeginStoryboard>
技術分享圖片????????????
<Storyboard>
技術分享圖片??????????????
<DoubleAnimation?
技術分享圖片????????????????
Storyboard.TargetName="myAngleRotationChair"
技術分享圖片????????????????Storyboard.TargetProperty
="Angle"
技術分享圖片????????????????From
="0"?To="360"?Duration="0:0:10"
技術分享圖片????????????????RepeatBehavior
="Forever"?/>
技術分享圖片????????????
</Storyboard>
技術分享圖片??????????
</BeginStoryboard>
技術分享圖片????????
</EventTrigger>
技術分享圖片??????
</Viewport3D.Triggers>

填寫如上代碼之後就完成了一個最簡單的三維動畫的處理。

好的~如果您對更多的三維場景變成想有所了解,請關註第二講。

如果您想下載源代碼或收聽語音教程,請訪問:微軟webcast

?

再次感謝您的關註,謝謝!

使用WPF實現3D場景[一]