http://msdn2.microsoft.com/zh-tw/library/ms771572.aspx
範例檔為上面的網址,一樣修改為 vb
請記得一定要加入下載後的資源檔到專案中
這次是 webbrowser application
所以請先新增 WpfBrowserApplication
而compile完後請點擊副檔名為 xbap 之檔案
以下為 Xaml code-
- <Page
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:my="clr-namespace"
- x:Class="Page1"
- Title="3D Cube Animation Demo"
- Loaded="OnLoaded"
- >
- <Page.Resources>
- <Storyboard x:Key="RotateStoryboard">
- <ParallelTimeline RepeatBehavior="Forever" Storyboard.TargetName="myRotate" Storyboard.TargetProperty="Angle" >
- <DoubleAnimation From="0" To="360" Duration="0:0:30"/>
- </ParallelTimeline>
- </Storyboard>
- <MeshGeometry3D x:Key="PlaneMesh"
- Positions="-1 -1 0 1 -1 0 -1 1 0 1 1 0"
- Normals="0 0 1 0 0 1 0 0 1 0 0 1"
- TextureCoordinates="0 1 1 1 0 0 1 0 "
- TriangleIndices="0 1 2 1 3 2" />
- <MeshGeometry3D x:Key="CubeMesh"
- TriangleIndices="0,1,2 3,4,5 6,7,8 9,10,11 12,13,14 15,16,17 18,19,20 21,22,23 24,25,26 27,28,29 30,31,32 33,34,35 "
- 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,0,1 0,0,1 0,0,1 0,0,1 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,0 1,0,0 1,0,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,0 -1,0,0 -1,0,0 "
- TextureCoordinates="1,0 1,1 0,1 0,1 0,0 1,0 0,0 1,0 1,1 1,1 0,1 0,0 0,0 1,0 1,1 1,1 0,1 0,0 1,0 1,1 0,1 0,1 0,0 1,0 1,1 0,1 0,0 0,0 1,0 1,1 0,1 0,0 1,0 1,0 1,1 0,1 "
- 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 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 "
- />
- <MeshGeometry3D x:Key="CubeInvertedMesh"
- TriangleIndices="0,1,2 3,4,5 6,7,8 9,10,11 12,13,14 15,16,17 18,19,20 21,22,23 24,25,26 27,28,29 30,31,32 33,34,35 "
- 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,0,-1 0,0,-1 0,0,-1 0,0,-1 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,0 -1,0,0 -1,0,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,0 1,0,0 1,0,0 "
- TextureCoordinates="0,1 1,1 1,0 1,0 0,0 0,1 1,1 1,0 0,0 0,0 0,1 1,1 1,1 1,0 0,0 0,0 0,1 1,1 0,1 1,1 1,0 1,0 0,0 0,1 0,0 0,1 1,1 1,1 1,0 0,0 1,0 0,0 0,1 0,1 1,1 1,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 -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 "
- />
- <Transform3DGroup x:Key="CubeMeshTransform">
- <Transform3DGroup.Children>
- <ScaleTransform3D ScaleX="10" ScaleY="10" ScaleZ="10" />
- </Transform3DGroup.Children>
- </Transform3DGroup>
- <Transform3DGroup x:Key="CubeMeshTransform2">
- <Transform3DGroup.Children>
- <ScaleTransform3D ScaleX="12" ScaleY="12" ScaleZ="12" />
- </Transform3DGroup.Children>
- </Transform3DGroup>
- </Page.Resources>
- <Grid Background="maroon" >
- <Grid.ColumnDefinitions>
- <ColumnDefinition Width="100"/>
- <ColumnDefinition Width="*" />
- </Grid.ColumnDefinitions>
- <StackPanel>
- <Button Click="OnImage1Animate" Height="50" Grid.Column="0" Grid.Row="0">Image 1 animate</Button>
- </StackPanel>
- <Viewport3D Focusable="true" Name="myViewport3D" ClipToBounds="true" Grid.Column="1" Grid.Row="0" >
- <Viewport3D.Camera>
- <PerspectiveCamera
- Position="0,0,3.0"
- LookDirection="0,0,-1"
- UpDirection="0,1,0"
- NearPlaneDistance="0.25"
- FarPlaneDistance="20"
- FieldOfView="60" />
- </Viewport3D.Camera>
- <ModelVisual3D>
- <ModelVisual3D.Transform>
- <Transform3DGroup>
- <Transform3DGroup.Children>
- <Transform3DCollection >
- <ScaleTransform3D ScaleX="1" ScaleY="1" ScaleZ="1" />
- <RotateTransform3D>
- <RotateTransform3D.Rotation>
- <AxisAngleRotation3D Axis="0 1 0" Angle="0" />
- </RotateTransform3D.Rotation>
- </RotateTransform3D>
- <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0" />
- </Transform3DCollection>
- </Transform3DGroup.Children>
- </Transform3DGroup>
- </ModelVisual3D.Transform>
- <ModelVisual3D.Content>
- <Model3DGroup >
- <Model3DGroup.Transform>
- <Transform3DGroup>
- <Transform3DGroup.Children>
- <Transform3DCollection >
- <ScaleTransform3D ScaleX="0.1" ScaleY="0.1" ScaleZ="0.1" />
- <RotateTransform3D>
- <RotateTransform3D.Rotation>
- <AxisAngleRotation3D Axis="0 1 0" Angle="0" />
- </RotateTransform3D.Rotation>
- </RotateTransform3D>
- <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0" />
- </Transform3DCollection>
- </Transform3DGroup.Children>
- </Transform3DGroup>
- </Model3DGroup.Transform>
- <Model3DGroup.Children>
- <!-- Group Child 0 -->
- <Model3DGroup >
- <Model3DGroup.Transform>
- <Transform3DGroup>
- <Transform3DGroup.Children>
- <Transform3DCollection >
- <ScaleTransform3D ScaleX="1" ScaleY="1" ScaleZ="1" />
- <RotateTransform3D >
- <RotateTransform3D.Rotation >
- <AxisAngleRotation3D x:Name="myRotate" Axis="1 0 0" Angle="0" />
- </RotateTransform3D.Rotation>
- </RotateTransform3D>
- <TranslateTransform3D OffsetX="0" OffsetY="0" OffsetZ="0" />
- </Transform3DCollection>
- </Transform3DGroup.Children>
- </Transform3DGroup>
- </Model3DGroup.Transform>
- <Model3DGroup.Children>
- <!-- Child 0 -->
- <GeometryModel3D Transform="{StaticResource CubeMeshTransform}" Geometry="{StaticResource CubeMesh}" >
- <GeometryModel3D.Material>
- <MaterialGroup>
- <MaterialGroup.Children>
- <EmissiveMaterial>
- <EmissiveMaterial.Brush>
- <ImageBrush ImageSource="roundcornersheet.png">
- <ImageBrush.Transform>
- <TransformGroup>
- <TransformGroup.Children>
- <RotateTransform CenterX="0.5" CenterY="0.5" Angle="0" />
- </TransformGroup.Children>
- </TransformGroup>
- </ImageBrush.Transform>
- </ImageBrush>
- </EmissiveMaterial.Brush>
- </EmissiveMaterial>
- </MaterialGroup.Children>
- </MaterialGroup>
- </GeometryModel3D.Material>
- <GeometryModel3D.BackMaterial>
- <MaterialGroup>
- <MaterialGroup.Children>
- <EmissiveMaterial>
- <EmissiveMaterial.Brush>
- <ImageBrush ImageSource="roundcornersheet.png">
- <ImageBrush.Transform>
- <TransformGroup>
- <TransformGroup.Children>
- <RotateTransform CenterX="0.5" CenterY="0.5" Angle="0" />
- </TransformGroup.Children>
- </TransformGroup>
- </ImageBrush.Transform>
- </ImageBrush>
- </EmissiveMaterial.Brush>
- </EmissiveMaterial>
- </MaterialGroup.Children>
- </MaterialGroup>
- </GeometryModel3D.BackMaterial>
- </GeometryModel3D>
- <GeometryModel3D Transform="{StaticResource CubeMeshTransform2}" Geometry="{StaticResource CubeMesh}" >
- <GeometryModel3D.Material>
- <MaterialGroup>
- <MaterialGroup.Children>
- <EmissiveMaterial>
- <EmissiveMaterial.Brush>
- <ImageBrush ImageSource="roundcornersheet.png">
- <ImageBrush.Transform>
- <TransformGroup>
- <TransformGroup.Children>
- <RotateTransform CenterX="0.5" CenterY="0.5" Angle="0" />
- </TransformGroup.Children>
- </TransformGroup>
- </ImageBrush.Transform>
- </ImageBrush>
- </EmissiveMaterial.Brush>
- </EmissiveMaterial>
- </MaterialGroup.Children>
- </MaterialGroup>
- </GeometryModel3D.Material>
- <GeometryModel3D.BackMaterial>
- <MaterialGroup>
- <MaterialGroup.Children>
- <EmissiveMaterial>
- <EmissiveMaterial.Brush>
- <ImageBrush ImageSource="roundcornersheet.png">
- <ImageBrush.Transform>
- <TransformGroup>
- <TransformGroup.Children>
- <RotateTransform CenterX="0.5" CenterY="0.5" Angle="0" />
- </TransformGroup.Children>
- </TransformGroup>
- </ImageBrush.Transform>
- </ImageBrush>
- </EmissiveMaterial.Brush>
- </EmissiveMaterial>
- </MaterialGroup.Children>
- </MaterialGroup>
- </GeometryModel3D.BackMaterial>
- </GeometryModel3D>
- </Model3DGroup.Children>
- </Model3DGroup>
- <Model3DGroup>
- <Model3DGroup.Children>
- <AmbientLight Color="#ffcccccc"/>
- <DirectionalLight Color="LightGray" Direction="-1,-1,-1" />
- </Model3DGroup.Children>
- </Model3DGroup>
- </Model3DGroup.Children>
- </Model3DGroup>
- </ModelVisual3D.Content>
- </ModelVisual3D>
- </Viewport3D>
- </Grid>
- </Page>
-
複製代碼 在專案中新增一個 vb 檔案 名稱為
trackball.vb 並加入程式碼如下-
-
- Option Strict On
- Option Explicit On
- Imports System
- Imports System.Collections.Generic
- Imports System.Windows
- Imports System.Windows.Input
- Imports System.Windows.Controls
- Imports System.Windows.Media
- Imports System.Windows.Media.Media3D
- Public Class Trackball
- Public Sub New()
- Dim _translate As Vector3D = New Vector3D(0, 0, 0)
- Dim _translateDelta As Vector3D = New Vector3D(0, 0, 0)
- Reset()
- End Sub
- Private _center As Vector3D
- Private _centered As Boolean
- Private _scale As Double
- Private _translate As Vector3D
- Private _rotation As Quaternion
- Private _slaves As List(Of Viewport3D)
- Private _scaling As Boolean
- Private _scaleDelta As Double
- Private _rotationDelta As Quaternion
- Private _point As Point
- Private _translateDelta As Vector3D
- Private _rotating As Boolean
- Private _translating As Boolean
- Public Sub Attach(ByVal element As FrameworkElement)
- With element
- AddHandler .MouseMove, AddressOf Me.MouseMoveHandler
- AddHandler .MouseRightButtonDown, AddressOf Me.MouseDownHandler
- AddHandler .MouseRightButtonUp, AddressOf Me.MouseUpHandler
- AddHandler .MouseWheel, AddressOf Me.OnMouseWheel
- End With
-
- End Sub
-
- Public Sub Detach(ByVal element As FrameworkElement)
-
- With element
- RemoveHandler .MouseMove, AddressOf Me.MouseMoveHandler
- RemoveHandler .MouseRightButtonDown, AddressOf Me.MouseDownHandler
- RemoveHandler .MouseRightButtonUp, AddressOf Me.MouseUpHandler
- RemoveHandler .MouseWheel, AddressOf Me.OnMouseWheel
- End With
- End Sub
- Public Property slaves() As List(Of Viewport3D)
- Get
- If (_slaves Is Nothing) Then _slaves = New List(Of Viewport3D)
- Return _slaves
- End Get
- Set(ByVal value As List(Of Viewport3D))
- _slaves = value
- End Set
- End Property
- Private _enabled As Boolean
- Public Property Enabled() As Boolean
- Get
- Return _enabled AndAlso (_slaves IsNot Nothing) AndAlso (_slaves.Count > 0)
- End Get
- Set(ByVal value As Boolean)
- _enabled = value
- End Set
- End Property
-
- Private Sub UpdateSlaves(ByVal q As Quaternion, ByVal s As Double, ByVal t As Vector3D)
- If (_slaves IsNot Nothing) Then
- For Each i As Viewport3D In _slaves
- Dim mv As ModelVisual3D = DirectCast(i.Children(0), ModelVisual3D)
- Dim t3dg As Transform3DGroup = DirectCast(mv.Transform, Transform3DGroup)
- Dim _GroupScaleTransform As ScaleTransform3D = DirectCast(t3dg.Children(0), ScaleTransform3D)
- Dim _GroupRotateTransform As RotateTransform3D = DirectCast(t3dg.Children(1), RotateTransform3D)
- Dim _GroupTranslateTransform As TranslateTransform3D = DirectCast(t3dg.Children(2), TranslateTransform3D)
- _GroupScaleTransform.ScaleX = s
- _GroupScaleTransform.ScaleY = s
- _GroupScaleTransform.ScaleZ = s
- _GroupRotateTransform.Rotation = New AxisAngleRotation3D(q.Axis, q.Angle)
- _GroupTranslateTransform.OffsetX = t.X
- _GroupTranslateTransform.OffsetY = t.Y
- _GroupTranslateTransform.OffsetZ = t.Z
- Next i
- End If
- End Sub
-
- Private Sub Reset()
- _rotation = New Quaternion(0, 0, 0, 1)
- _scale = 1
- _translate.X = 0
- _translate.Y = 0
- _translate.Z = 0
- _translateDelta.X = 0
- _translateDelta.Y = 0
- _translateDelta.Z = 0
- _rotationDelta = Quaternion.Identity
- _scaleDelta = 1
- UpdateSlaves(_rotation, _scale, _translate)
- End Sub
-
- Private Sub MouseMoveHandler(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs)
- If Not Enabled Then Return
- e.Handled = True
- Dim el As UIElement = DirectCast(sender, UIElement)
- If el.IsMouseCaptured Then
- Dim delta As Vector = _point - e.MouseDevice.GetPosition(el)
- Dim t As Vector3D = New Vector3D
- delta /= 2
- Dim q As Quaternion = _rotation
- If (_rotating = True) Then
- Dim mouse As Vector3D = New Vector3D(delta.X, -delta.Y, 0)
- Dim axis As Vector3D = Vector3D.CrossProduct(mouse, New Vector3D(0, 0, 1))
- Dim len As Double = axis.Length
- If (len < 0.00001 OrElse _scaling) Then
- _rotationDelta = New Quaternion(New Vector3D(0, 0, 1), 0)
- Else
- _rotationDelta = New Quaternion(axis, len)
- End If
- q = _rotationDelta * _rotation
- Else
- delta /= 20
- _translateDelta.X = delta.X * -1
- _translateDelta.Y = delta.Y
- End If
- t = _translate + _translateDelta
- UpdateSlaves(q, _scale * _scaleDelta, t)
- End If
- End Sub
- Private Sub MouseDoubleClickHandler(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
- Reset()
- End Sub
- Private Sub MouseUpHandler(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
- If (Not _enabled) Then Return
- e.Handled = True
- If (_rotating = True) Then
- _rotation = _rotationDelta * _rotation
- Else
- _translate += _translateDelta
- _translateDelta.X = 0
- _translateDelta.Y = 0
- End If
- Dim el As UIElement = DirectCast(sender, UIElement)
- el.ReleaseMouseCapture()
- End Sub
- Sub OnMouseWheel(ByVal sender As Object, ByVal e As System.Windows.Input.MouseWheelEventArgs)
- e.Handled = True
- _scaleDelta += (e.Delta / 1000)
- Dim q As Quaternion = _rotation
- UpdateSlaves(q, _scale * _scaleDelta, _translate)
- End Sub
- Private Sub MouseDownHandler(ByVal sender As Object, ByVal e As MouseButtonEventArgs)
- If Not Enabled Then Return
- e.Handled = True
- If (Keyboard.IsKeyDown(Key.F1) = True) Then
- Reset()
- Return
- End If
- Dim el As UIElement = DirectCast(sender, UIElement)
- _point = e.MouseDevice.GetPosition(el)
- If (Not _centered) Then
- Dim camera As ProjectionCamera = DirectCast(_slaves(0).Camera, ProjectionCamera)
- _center = camera.LookDirection
- _centered = True
- End If
- _scaling = (e.MiddleButton = MouseButtonState.Pressed)
- If (Keyboard.IsKeyDown(Key.Space) = False) Then
- _rotating = True
- Else
- _rotating = False
- End If
- el.CaptureMouse()
- End Sub
- End Class
-
-
-
複製代碼 最後再加入 page的程式碼(web表單)-
-
- Option Strict On
- Option Explicit On
- Imports System
- Imports System.Data
- Imports System.Windows
- Imports System.Windows.Data
- Imports System.Configuration
- Imports System.Windows.Media
- Imports System.Windows.Media.Media3D
- Imports System.Windows.Media.Animation
- Imports System.Windows.Media.Imaging
- Imports System.Reflection
- Imports System.Windows.Controls
- Imports System.Windows.Input
- Imports System.Windows.Threading
- Imports System.IO
- Public Class Page1
- Dim _trackball As Trackball
- Private Sub OnLoaded(ByVal sender As Object, ByVal e As EventArgs)
- _trackball = New Trackball()
- _trackball.Attach(Me)
- _trackball.Slaves.Add(myViewport3D)
- _trackball.Enabled = True
- End Sub
- Private Sub OnImage1Animate(ByVal sender As Object, ByVal e As RoutedEventArgs)
- Dim s As Storyboard
- s = DirectCast(Me.FindResource("RotateStoryboard"), Storyboard)
- Me.BeginStoryboard(s)
- End Sub
- End Class
-
複製代碼 |