Проектирование 3D точки к 2D координате экрана

В строке ниже в вашем коде вы добавляете только последний элемент списка массивов в поле со списком.

jEmployeeComboList.addItem(employees.get(employees.size()-1).getName());

Вы можете добавить все предметы, как это:

for (Employee emp : employees) {
    jEmployeeComboList.addItem(emp.getName());
}
7
задан Ash 6 February 2009 в 04:27
поделиться

6 ответов

Так как координаты Windows являются z в экран (x, пересекают y), я использовал бы что-то как

screenY = viewPort.ActualHeight * (1 - screenY);

вместо

screenY = screenY * viewPort.ActualHeight;

исправлять screenY для размещения Windows.

Поочередно, Вы могли использовать OpenGL. При установке области просмотра x/y/z диапазон Вы могли оставить его в "собственных" единицах и позволить OpenGL преобразовать в координаты экрана.

Править: Так как Ваш источник является центром. Я попробовал бы

screenX = viewPort.ActualWidth * (screenX + 1.0) / 2.0
screenY = viewPort.ActualHeight * (1.0 - ((screenY + 1.0) / 2.0))

Экран + 1.0 преобразовывает из [-1.0, 1.0] к [0.0, 2.0]. В которой точке, Вы делитесь на 2,0 для получения [0.0, 1.0] для умножения. Для составления Windows y, зеркально отражаемого от Декартова y, Вы преобразовываете из [1.0, 0.0] (верхний левый угол к нижнему левому углу), к [0.0, 1.0] (верхний для понижения) путем вычитания предыдущего экрана от 1,0. Затем можно масштабироваться к ActualHeight.

2
ответ дан 7 December 2019 в 03:21
поделиться

Я создал и успешно протестировал метод работы при помощи 3DUtils исходная библиотека Codeplex.

Реальная работа выполняется в TryWorldToViewportTransform () метод от 3DUtils. Этот метод не будет работать без него (см. вышеупомянутую ссылку).

Очень полезная информация была также найдена в статье Eric Sink: автомасштабирование.

NB. Могут быть более надежные/эффективные подходы, раз так добавьте их как ответ. Тем временем это достаточно хорошо для моих потребностей.

    /// <summary>
    /// Takes a 3D point and returns the corresponding 2D point (X,Y) within the viewport.  
    /// Requires the 3DUtils project available at http://www.codeplex.com/Wiki/View.aspx?ProjectName=3DTools
    /// </summary>
    /// <param name="point3D">A point in 3D space</param>
    /// <param name="viewPort">An instance of Viewport3D</param>
    /// <returns>The corresponding 2D point or null if it could not be calculated</returns>
    public Point? Point3DToScreen2D(Point3D point3D, Viewport3D viewPort)
    {
        bool bOK = false;

        // We need a Viewport3DVisual but we only have a Viewport3D.
        Viewport3DVisual vpv =VisualTreeHelper.GetParent(viewPort.Children[0]) as Viewport3DVisual;

        // Get the world to viewport transform matrix
        Matrix3D m = MathUtils.TryWorldToViewportTransform(vpv, out bOK);

        if (bOK)
        {
            // Transform the 3D point to 2D
            Point3D transformedPoint = m.Transform(point3D);

            Point screen2DPoint = new Point(transformedPoint.X, transformedPoint.Y);

            return new Nullable<Point>(screen2DPoint);
        }
        else
        {
            return null; 
        }
    }
4
ответ дан 7 December 2019 в 03:21
поделиться
  1. Не ясно, чего Вы пытаетесь достигнуть с aspectRatio коэффициентом. Если точка находится на краю поля зрения, то это должно быть на краю экрана, но если aspectRatio! =1 это не. Попробуйте установку aspectRatio=1 и сделайте квадрат окна. Координаты являются все еще неправильными?

  2. ActualWidth и ActualHeight кажется, половина размера окна действительно, таким образом, screenX будет [-ActualWidth; ActualWidth], но не [0; ActualWidth]. Это то, что Вы хотите?

1
ответ дан 7 December 2019 в 03:21
поделиться

screenX и screenY должны становиться вычисленными относительно экранного центра...

0
ответ дан 7 December 2019 в 03:21
поделиться

Я не вижу исправление для того, что при рисовании использования Windows API, источник находится в левом верхнем углу экрана. Я предполагаю, что Ваша система координат

y
|
|
+------x

Кроме того, Ваша система координат принимает источник в центре, на вопрос Scott, или является им в левом нижнем углу?

Но, экран Windows API

+-------x
|
|
|
y

Вам было бы нужно координатное преобразование для движения от классического Последователя Декарта в Windows.

0
ответ дан 7 December 2019 в 03:21
поделиться

Это не обращается к вопросу о ALGORITM, но может быть полезно для того, чтобы Peple поступить по этому вопросу (как я сделал).

В .NET 3.5 Вы можете использовать Visual3D.Transformteancestor (визуальный предчный) . Я использую это, чтобы нарисовать каркас на холсте над моим трехмерным видом на просмотр:

    void CompositionTarget_Rendering(object sender, EventArgs e)
    {
        UpdateWireframe();
    }

    void UpdateWireframe()
    {
        GeometryModel3D model = cube.Content as GeometryModel3D;

        canvas.Children.Clear();

        if (model != null)
        {
            GeneralTransform3DTo2D transform = cube.TransformToAncestor(viewport);
            MeshGeometry3D geometry = model.Geometry as MeshGeometry3D;

            for (int i = 0; i < geometry.TriangleIndices.Count;)
            {
                Polygon p = new Polygon();
                p.Stroke = Brushes.Blue;
                p.StrokeThickness = 0.25;
                p.Points.Add(transform.Transform(geometry.Positions[geometry.TriangleIndices[i++]]));
                p.Points.Add(transform.Transform(geometry.Positions[geometry.TriangleIndices[i++]]));
                p.Points.Add(transform.Transform(geometry.Positions[geometry.TriangleIndices[i++]]));
                canvas.Children.Add(p);
            }
        }
    }

Это также учитывает любые преобразования на модели и т. Д.

. См. Также: http://blogs.smsdn.com/wpf3d /archive/2009/05/13/Transforming-bounds.aspx

2
ответ дан 7 December 2019 в 03:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: