Создание пользовательской сетки в C #, управляемой DirectX
Вопрос
Мне нужно создать 3D-сетку DirectX во время выполнения использование управляемого DirectX из C #.Мне не удалось найти никакой информации о том, как это сделать.
- Нет, я не могу использовать программу 3D-моделирования для создания своих объектов.Они должны быть точного размера и формы, и у меня нет никакой информации о размере или форме до времени выполнения.
- Нет, я не могу создать модель на основе существующих возможностей DirectX mesh.(Простой пример:DirectX позволит вам легко моделировать карандаш, используя сетку в виде конуса и сетку в виде цилиндра.Конечно, вы должны носить с собой две сетки для карандаша, а не только одну, и правильно расположить и сориентировать каждую.Но вы даже не можете сделать модель карандаша, разрезанную вдоль пополам, поскольку в ней нет сетки в виде полуцилиндра или полуконуса.)
- Во время выполнения у меня уже есть все вершины, и я знаю, какие из них соединить, чтобы получились необходимые треугольники.
- Все, что мне нужно, - это сплошной цвет.Мне не нужна текстурная карта.
Можно получить сетку сферы, используя этот вызов DirectX:
Mesh sphere = Mesh.Sphere(device, sphereRadius, sphereSlices, sphereStacks);
Эта сетка создается во время выполнения.
Что мне нужно знать, так это как создать аналогичную функцию:
Mesh shape = MakeCustomMesh(device, vertexlist, trianglelist);
где два списка могут быть любым подходящим контейнером / форматом.
Если кто-нибудь может указать мне на пример кода managed DirectX (C #), даже если он просто строит сетку из 3 жестко закодированных треугольников, это было бы большим преимуществом.
Решение
Есть несколько примеров кода, показывающих, как это сделать на Многомерная информация.Это создает сетку с несколькими подмножествами - если вам это не нужно, это еще проще.
По сути, вы просто создаете сетку:
Mesh mesh = new Mesh(numIndices, numVerticess, MeshFlags.Managed, CustomVertex.PositionColored.Format /* you'll need to set this */ , device);
Затем вы можете захватить буфер вершин сетки и буфер индексов и перезаписать его, используя:
IndexBuffer indices = mesh.IndexBuffer;
VertexBuffer vertices = mesh.VertexBuffer;
Затем соответствующим образом заполните индексы и вершины.