ModelVisual3D Преобразовать нуль при попытке переместить объект - PullRequest
0 голосов
/ 10 ноября 2011

Я пытаюсь переместить куб, нажимая на него и отслеживая мышь.Мой куб реализован так:

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

1 Ответ

0 голосов
/ 10 ноября 2011

Установлено ли vis3d.Transform на что-нибудь?

Если проблема не в этом, но если это так, проверьте, действительно ли это TranslateTransform3D.Если это что-то еще, тогда преобразование as будет недействительным и вернет null.

. Вы сказали, что на самом деле это MatrixTransform3D, что является общим преобразованием матрицы.Измените свою строку на:

transTracking = vis3d.Transform as MatrixTransform3D;

, и она должна работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...