Sensortag 第四弹 实现风铃的摆动
时间:10-02
整理:3721RD
点击:
之前建立的风铃模型导入到wpf工程之后,就可以着手实现模型的运动了。
由于建模的时候把各个需要运动的部件的轴心都设置为了实际摆动的中心,在这里只需要直接设置旋转的角度就可以了
以中间的部件为例:
在工程中创建两个lable,代表摆动的x、y两个轴的角度:
<Label Content="x" HorizontalAlignment="Left" Margin="12,526,0,44" Name="angle_x" Width="18" Visibility="Collapsed" />
<Label Content="y" HorizontalAlignment="Left" Margin="36,0,0,44" Name="angle_y" Width="18" Visibility="Collapsed“ />
然后在部件模型的属性中摆动的x轴角度和y轴角度分别建立数据绑定为刚才撞见的两个lable的值:
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Angle="{Binding ElementName=angle_y, Path=Content, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, StringFormat=\{0:D\}}" Axis="1 0 0" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Angle="{Binding ElementName=angle_x, Path=Content, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, StringFormat=\{0:D\}}" Axis="0 0 1" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
现在使用鼠标右键拖动的坐标该变量模拟计算出来的摆动角度
在鼠标移动的事件中检测右键是否按下,若是,则根据移动的坐标距离改变两个lable的值,这样即实现鼠标拖动风铃摆动了
Private Sub MainWindow_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles Me.MouseMove
If right_down = 1 Then
position = Mouse.GetPosition(Me)
If position <> start_position Then
mouse_moved = 1
tmp_position.X = last_position.X + position.X - start_position.X
tmp_position.Y = last_position.Y - position.Y + start_position.Y
If tmp_position.X / 8 < 25 And tmp_position.X / 8 > -25 Then
stop_position.X = tmp_position.X
End If
If tmp_position.Y / 5 < 25 And tmp_position.Y / 5 > -25 Then
stop_position.Y = tmp_position.Y
End If
angle_x.Content = stop_position.X / 8
angle_y.Content = stop_position.Y / 5
swing_angle = Math.Sqrt(angle_x.Content ^ 2 + angle_y.Content ^ 2)
End If
End If
End Sub
当然中间有一些临时试出来的计算参数,是为了让鼠标移动的距离和摆动的距离相符,大家参考一下就好了,不用深究....
ok,下面就是实际操作的视频:
由于建模的时候把各个需要运动的部件的轴心都设置为了实际摆动的中心,在这里只需要直接设置旋转的角度就可以了
以中间的部件为例:
在工程中创建两个lable,代表摆动的x、y两个轴的角度:
<Label Content="x" HorizontalAlignment="Left" Margin="12,526,0,44" Name="angle_x" Width="18" Visibility="Collapsed" />
<Label Content="y" HorizontalAlignment="Left" Margin="36,0,0,44" Name="angle_y" Width="18" Visibility="Collapsed“ />
然后在部件模型的属性中摆动的x轴角度和y轴角度分别建立数据绑定为刚才撞见的两个lable的值:
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Angle="{Binding ElementName=angle_y, Path=Content, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, StringFormat=\{0:D\}}" Axis="1 0 0" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
<RotateTransform3D>
<RotateTransform3D.Rotation>
<AxisAngleRotation3D Angle="{Binding ElementName=angle_x, Path=Content, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, StringFormat=\{0:D\}}" Axis="0 0 1" />
</RotateTransform3D.Rotation>
</RotateTransform3D>
现在使用鼠标右键拖动的坐标该变量模拟计算出来的摆动角度
在鼠标移动的事件中检测右键是否按下,若是,则根据移动的坐标距离改变两个lable的值,这样即实现鼠标拖动风铃摆动了
Private Sub MainWindow_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Input.MouseEventArgs) Handles Me.MouseMove
If right_down = 1 Then
position = Mouse.GetPosition(Me)
If position <> start_position Then
mouse_moved = 1
tmp_position.X = last_position.X + position.X - start_position.X
tmp_position.Y = last_position.Y - position.Y + start_position.Y
If tmp_position.X / 8 < 25 And tmp_position.X / 8 > -25 Then
stop_position.X = tmp_position.X
End If
If tmp_position.Y / 5 < 25 And tmp_position.Y / 5 > -25 Then
stop_position.Y = tmp_position.Y
End If
angle_x.Content = stop_position.X / 8
angle_y.Content = stop_position.Y / 5
swing_angle = Math.Sqrt(angle_x.Content ^ 2 + angle_y.Content ^ 2)
End If
End If
End Sub
当然中间有一些临时试出来的计算参数,是为了让鼠标移动的距离和摆动的距离相符,大家参考一下就好了,不用深究....
ok,下面就是实际操作的视频: