Извините за форматирование, комментарии не любят возврат каретки: Координата X: положительный верный. Координата Y: положительный вверх. Координата Z: положительный вне экрана (к вам)

новании информации в главе 73D-программирование для Windows (Чарльз Петцольд)Я попытался написать вспомогательную функцию, которая проецирует Point3D на стандартную 2D-точку, которая содержит соответствующие экранные координаты (x, y):

public Point Point3DToScreen2D(Point3D point3D,Viewport3D viewPort )
{
    double screenX = 0d, screenY = 0d;

    // Camera is defined in XAML as:
    //        <Viewport3D.Camera>
    //             <PerspectiveCamera Position="0,0,800" LookDirection="0,0,-1" />
    //        </Viewport3D.Camera>

    PerspectiveCamera cam = viewPort.Camera as PerspectiveCamera;

    // Translate input point using camera position
    double inputX = point3D.X - cam.Position.X;
    double inputY = point3D.Y - cam.Position.Y;
    double inputZ = point3D.Z - cam.Position.Z;

    double aspectRatio = viewPort.ActualWidth / viewPort.ActualHeight;

    // Apply projection to X and Y
    screenX = inputX / (-inputZ * Math.Tan(cam.FieldOfView / 2));

    screenY = (inputY * aspectRatio) / (-inputZ * Math.Tan(cam.FieldOfView / 2));

    // Convert to screen coordinates
    screenX = screenX * viewPort.ActualWidth;

    screenY = screenY * viewPort.ActualHeight;


    // Additional, currently unused, projection scaling factors
    /*
    double xScale = 1 / Math.Tan(Math.PI * cam.FieldOfView / 360);
    double yScale = aspectRatio * xScale;

    double zFar = cam.FarPlaneDistance;
    double zNear = cam.NearPlaneDistance;

    double zScale = zFar == Double.PositiveInfinity ? -1 : zFar / (zNear - zFar);
    double zOffset = zNear * zScale;

    */

    return new Point(screenX, screenY);
}

Однако при тестировании эта функция возвращает неправильные координаты экрана (проверяется путем сравнения 2D-координат мыши с простой 3D-формой). Из-за отсутствия опыта в 3D программировании я не понимаю, почему.

Раздел с комментариями к блоку содержит вычисления масштабирования, которые могут быть важны, однако я не уверен, как, и книга продолжается с MatrixCamera, использующим XAML. Изначально я просто хочу, чтобы базовый расчет работал независимо от того, насколько он неэффективен по сравнению с матрицами.

Кто-нибудь может посоветовать, что нужно добавить или изменить?

Ответы на вопрос(1)

Ваш ответ на вопрос