Helix Toolkit WPF, измените вектор камеры одним щелчком мыши - PullRequest
0 голосов
/ 12 марта 2019

У меня есть вид в виде спирали с 4 прямоугольниками, когда я щелкаю один из них, я хочу, чтобы камера видела этот прямоугольник. Мой код работает нормально, но как только я немного прокручиваю с помощью колесика мыши (для увеличения / уменьшения), то уже невозможно щелкать и просматривать поле, как я хочу. Идет то же событие щелчка мышью, и я не замечаю никакой разницы при отладке. Просто камера не двигается. Прокрутка как-то все портит, но я не знаю как и что делать. РЕДАКТИРОВАТЬ: также щелчок правой кнопкой мыши и перемещение камеры таким образом вызывает ту же ошибку.

<helix:HelixViewport3D x:Name="View"
                       Background="{DynamicResource ControlBackgroundBrush}"
                       ItemsSource="{Binding Visuals}"
                       ShowCameraInfo="False"
                       ShowCoordinateSystem="True"
                       ShowViewCube="False"
                       ZoomExtentsWhenLoaded="False"
                       ModelUpDirection="0,1,0"
                       DefaultCamera="{Binding DefCamera}"
                       >

    <helix:HelixViewport3D.Camera>
        <PerspectiveCamera FieldOfView="61"
                           LookDirection="{Binding LookDirection}"
                           Position="{Binding CameraPosition}"
                           UpDirection="0,1,0" />
    </helix:HelixViewport3D.Camera>

    <!-- Selecting is done by first deselecting all boxes on mouse down
         then selecting the correct one on mouse up -->

    <i:Interaction.Triggers>
        <i:EventTrigger EventName="MouseLeftButtonDown">
            <cal:ActionMessage MethodName="DeselectAll" />
        </i:EventTrigger>
    </i:Interaction.Triggers>

</helix:HelixViewport3D>

Этот класс UIElement определяет прозрачную рамку вокруг оригинальной рамки. При нажатии запускается действие selectionChanged в родительском классе. Это действие вычисляет новую Позицию и Lookdirection, которые связаны в XAML выше.

public class InteractiveBoxVisual3D : System.Windows.UIElement3D
{
    public int SensorID { get; set; }
    public bool IsSelected { get; set; }

    private System.Action SelectionChanged;

    /// <summary>
    /// Constructor
    /// </summary>
    /// <param name="mat">Matrix which defines the position and rotation</param>
    /// <param name="box">Box defines the box size in XYZ</param>
    /// <param name="sensorID">Sensor ID of the sensor</param>
    /// <param name="selectionChanged">Action run when box is selected or deselected</param>
    public InteractiveBoxVisual3D(Matrix3D mat, Box3D box, int sensorID, System.Action selectionChanged)
    {
        SensorID = sensorID;
        IsSelected = false;
        SelectionChanged = selectionChanged;
        Material material = MaterialHelper.CreateMaterial(Colors.Transparent);
        MeshBuilder meshBuilder = new MeshBuilder();

        Vector3D VX = new Vector3D(mat.M11, mat.M12, mat.M13);
        Vector3D VY = new Vector3D(mat.M21, mat.M22, mat.M23);

        // This selection box is larger by this amount, to avoid graphical errors
        int margin = 10;

        meshBuilder.AddBox(new Point3D(mat.OffsetX, mat.OffsetY, mat.OffsetZ), VX, VY, box.Lx + margin, box.Wy + margin, box.Hz + margin);
        Visual3DModel = new GeometryModel3D(meshBuilder.ToMesh(), material);
    }

    public void Select()
    {
        GeometryModel3D box = Visual3DModel as GeometryModel3D;
        box.Material = MaterialHelper.CreateMaterial(Colors.White);
        IsSelected = true;
        SelectionChanged.Invoke();
    }

    public void DeSelect()
    {
        GeometryModel3D box = Visual3DModel as GeometryModel3D;
        box.Material = MaterialHelper.CreateMaterial(Colors.Transparent);
        IsSelected = false;
        SelectionChanged.Invoke();
    }

    // There is a simulaneous mouse DOWN event which runs DeselectAll()
    protected override void OnMouseUp(System.Windows.Input.MouseButtonEventArgs e)
    {
        if (e.LeftButton == System.Windows.Input.MouseButtonState.Released)
        {
            Select();
            e.Handled = true;
        }
    }
}

1 Ответ

0 голосов
/ 13 марта 2019

Вы можете использовать функцию Viewport3D.LookAt или Camera.LookAt для непосредственного управления камерой.

...