我正在尝试移动一个立方体,点击它并跟踪鼠标。我的多维数据集是这样实现的:
App.xaml
<MeshGeometry3D x:Key="solidCube"
Positions="2, 2, 2 -2, 2, 2 -2, -2, 2 2, -2, 2 2, 2, -2 -2, 2, -2 -2, -2, -2 2, -2, -2"
TriangleIndices="0,1,2 2,3,0 3,4,0 7,4,3 5,4,7 7,6,5 1,5,6 6,2,1 2,6,7 7,3,2 1,0,4 4,5,1"/> MainWindow.xaml
<ModelVisual3D.Content>
<GeometryModel3D x:Name="solidCubeGeometryModel3D" Geometry="{StaticResource solidCube}">
<GeometryModel3D.Material>
<DiffuseMaterial>
<DiffuseMaterial.Brush>
<SolidColorBrush Color="Red" Opacity="1.0"/>
</DiffuseMaterial.Brush>
</DiffuseMaterial>
</GeometryModel3D.Material>
<GeometryModel3D.Transform>
<TranslateTransform3D x:Name="myTranslateTransform3D" OffsetX="0" OffsetY="0" OffsetZ="0" />
</GeometryModel3D.Transform>
</GeometryModel3D>
</ModelVisual3D.Content> 我的视区周围有一个TrackballDecorator,它保存事件:
<custom:TrackballDecorator x:Name="trackballDecorator" Grid.Column="1"MouseLeftButtonDown="OnMouseLeftButtonDown"
MouseMove="OnMouseMove"
MouseWheel="OnMouseWheel"
MouseLeftButtonUp="OnMouseLeftButtonUp"
PreviewTextInput="OnPreviewTextInput"
LostMouseCapture="OnLostMouseCapture"
Width="600" Height="600">
<custom:Interactive3DDecorator Grid.Column="1">
/// viewport etc... 我的第一个活动,OnMouseLeftButtonDown,取自http://www.charlespetzold.com/3D/,鼠标跟踪的例子,它是:
protected void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs args)
{
base.OnMouseLeftButtonDown(args);
Point ptMouse = args.GetPosition(myViewport);
HitTestResult result = VisualTreeHelper.HitTest(myViewport, ptMouse);
// We're only interested in 3D hits.
RayMeshGeometry3DHitTestResult result3d =
result as RayMeshGeometry3DHitTestResult;
if (result3d == null)
return;
// We're only interested in ModelVisual3D hits.
ModelVisual3D vis3d = result3d.VisualHit as ModelVisual3D;
if (vis3d == null)
return;
// We're only interested in visuals with translate transforms.
transTracking = vis3d.Transform as TranslateTransform3D; //NULL !!!!!!!!!!!
if (transTracking == null)
return;
LineRange range;
ViewportInfo.Point2DtoPoint3D(myViewport, ptMouse, out range);
pointOriginal = range.PointFromZ(transTracking.OffsetZ);
transOriginal = transTracking.Clone();
isTracking = true;
CaptureMouse();
Focus();
args.Handled = true;
} 我更新了它,删除了覆盖,并在参数中添加了一个对象发送器。对于我的ModelVisual3D转换为空,有没有什么非常明显的遗漏?
提前感谢,如果你需要更多的信息来帮助我,只需问:D
发布于 2011-11-10 21:21:33
是否将vis3d.Transform设置为任何值?
如果不是,那就是问题所在,如果是,那么检查它实际上是一个TranslateTransform3D。如果是其他类型,则as转换将无效,并将返回null。
你已经说过,它实际上是一个MatrixTransform3D,它是一个通用的矩阵变换。将行更改为:
transTracking = vis3d.Transform as MatrixTransform3D;它应该是有效的。
https://stackoverflow.com/questions/8078286
复制相似问题