3D-графика для .NET.

Я хотел бы научиться создавать простые 3D-приложения для Windows 7/desktop. Под этим я подразумеваю сферы, треугольники или пиксели, перемещающиеся в трехмерном пространстве. На данный момент это не должно быть очень сложным. Для этого я хотел бы использовать язык С# с .NET(Java/С++ - мой второй приоритет).

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

Я думал об обучении XNA, но потом я узнал, что Microsoft больше не планирует его разрабатывать и поддерживать. SharpDX также показался хорошим способом, но это, по-видимому, предназначено для приложений Windows Store и телефона.

Когда вы смотрели в Интернете, Managed DirectX казался именно тем, что я искал (синтаксис, сложность), но опять же, это способ слишком устаревать для меня.

Не могли бы вы посоветовать мне, чему я должен научиться создавать простые, но прочные 3D-приложения?

Ответы

Ответ 1

Взгляните на SlimDX. Это бесплатная, свободная, управляемая библиотека для DirectX (DirectX 11). Каждый релиз совпадает с выпуском DirectX, поэтому большую часть времени он довольно современен. Я использовал его, и было очень легко начать. Здесь (прокрутка вниз) - это сравнение с другими возможностями, которые вы упомянули.

Ответ 2

Простейшим, вероятно, является использование WPF 3D. Это графическая система с сохраненным режимом, поэтому, если у вас нет огромных потребностей (т.е. Специальных шейдеров для эффектов и т.д.), Ее очень легко настроить и использовать напрямую.

В противном случае более подходящая 3D-система, такая как XNA, может быть более подходящей. Это будет больше работы по настройке, но даст вам больше контроля.

Ответ 3

В мире OpenGL я использовал OpenTK. Мне пришлось строить поверх существующего кода с помощью C#, чтобы отображать плоские геометрические объекты без затенения и реалистичных эффектов.

Вот пример:

render

Сгенерировано из кода:

void InitModels()
{
    Scene.CoordinateSystem cs1 = new Scene.CoordinateSystem(world.Ground)
    {
        DrawSize = 1,
        Visible = false
    };
    Scene.CoordinateSystem cs2 = new Scene.CoordinateSystem(world.Ground, 0.6 * vec3.J)
    {
        DrawSize = 0.5,
        Orientation = rot3.RotateXDegrees(-15)
    };
    Scene.Cube cube = new Scene.Cube(cs1)
    {
        CubeSize = 0.5
    };
    cs2.AddPoint(new point3(vec3.O,1), Color.Firebrick, 15);
    var line = cs2.AddLine(new line3(-vec3.I, vec3.I), 20, Color.SlateGray, 2);
    line.SetPattern(0xFF0F, GeometryTest.Scene.Stripple.Scale2);

    cube.BindTexture(5, GeometryTest.Properties.Resources.julia, true);
    cube.AddText(3, "OpenTK 1.0", Color.DarkMagenta, 0.5f, 0.5f, 1.0f);

}