Форум: "Media";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];
ВнизDirect3D. Полигон Найти похожие ветки
← →
WondeRu © (2005-03-30 12:03) [0]Как с помощью Direct3D нарисовать невыпуклый закрашенный многоугольник?
← →
NailMan © (2005-03-30 16:30) [1]Также как и впуклый и выпуклый :-)
Задаешь точки треугов и триангллистом Drawаешь.
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
← →
wiz (2005-03-30 16:52) [2]открываем яндекс/гугл и ищем по ключевому слову тесселяция (tesselation)
← →
WondeRu © (2005-03-31 09:26) [3]что такое тесселяция знаю... в OpenGL это TESS Objects...
а вот как нарисовать полигон по вершинам, используя VertexBuffer?
← →
NailMan © (2005-03-31 09:43) [4]описываешь свой многоугольник треугами, которые представляются тремя вершинами. Разбиение многоугольника тут произвольное. Например есть многоуг(ребра не рисую, только точки):
* *
1 2
*5
*3 *4
координаты точек тебе известны, я их писать не буду, а буду заменять индексами.
описать ты его можешь так:
1тр - 123
2тр - 243
3тр - 254
Описываем всегда по часовой стрелке, так как по умолчанию в Д3Д стоит D3DCULL_CCW.
Следовательно в буфере у тебя будут вершины: 123243254 и дравать будешь трианглистом 3 примитива.
Текстурные координаты тут уже сам распределишь я думаю.
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
← →
WondeRu © (2005-03-31 10:38) [5]NailMan © (31.03.05 9:43) [4]
этот вариант подходит лишь для выпуклого многоугольника... а вот этот вариант не прокатит:*1
*11 *2
*10 *3
*8 *4
*6
*7 *5
последовательно соединяем вершиныи получаем звездочку...
нужна тесселяция....
в некоторых источниках ( http://graphicsbb.itgo.com/solutions/extrude.html ) предлагают использовать GLUTesselator, но его нецелессобразно использовать в Managed DirectX...
в DirectX 9 SDK нашел такой метод:
Tessellate Method
--------------------------------------------------------------------------------
Note: This documentation is preliminary and is subject to change.
Performs uniform tessellation based on the tessellation level.
Definition
C# public void Tessellate(
float tessLevel,
Mesh mesh
);
Parameters
tessLevel System.Single. [in] Tessellation level. This is the number of vertices introduced between existing vertices. The range of this floating-point parameter is between 0 and 32.
mesh Microsoft.DirectX.Direct3D.Mesh. [in] Resulting tessellated mesh. For more information, see Mesh.
но вот как его применить ума не приложу
← →
NailMan © (2005-03-31 11:54) [6]WondeRu ©
В Д3Д нет понятий выпуклый или нет, это в математике есть. Твой пример я распишу так:
1,2,11
2,3,4
4,5,6
6,7,8
8,10,11
8,11,6
6,11,2
6,2,4
И чего тут мудрить?
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
← →
WondeRu © (2005-03-31 13:35) [7]NailMan © (31.03.05 11:54) [6]
И чего тут мудрить?
а программно??? ;)
тесселяция нужна...
NailMan © (31.03.05 11:54) [6]
В Д3Д нет понятий выпуклый или нет, это в математике есть
бред
← →
A22 © (2005-03-31 13:42) [8]в D3D нет понятия выпуклый или не выпуклый, это в математике есть
не бред
← →
NailMan © (2005-03-31 15:48) [9]WondeRu ©
тесселяцией твою фигуру не получить, ибо можно считать ее примитивной. Нечего разбивать.
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
← →
WondeRu © (2005-03-31 15:54) [10]A22 © (31.03.05 13:42) [8]
не бред
объяснитесь!!!
вот что я делаю:
инициализация буфера:
CustomVertex.PositionColored[] verts = new CustomVertex.PositionColored[11];
verts[0].SetPosition(new Vector3(0.0f, 0.6f, 1.0f));
verts[0].Color = System.Drawing.Color.Aqua.ToArgb();
verts[1].SetPosition(new Vector3(0.4f, 0.6f, 1.0f));
verts[1].Color = System.Drawing.Color.Black.ToArgb();
verts[2].SetPosition(new Vector3(0.5f, 1.0f, 1.0f));
verts[2].Color = System.Drawing.Color.Purple.ToArgb();
verts[3].SetPosition(new Vector3(0.6f, 0.6f, 1.0f));
verts[3].Color = System.Drawing.Color.Purple.ToArgb();
verts[4].SetPosition(new Vector3(1.0f, 0.6f, 1.0f));
verts[4].Color = System.Drawing.Color.Purple.ToArgb();
verts[5].SetPosition(new Vector3(0.7f, 0.4f, 1.0f));
verts[5].Color = System.Drawing.Color.Purple.ToArgb();
verts[6].SetPosition(new Vector3(0.9f, 0.2f, 1.0f));
verts[6].Color = System.Drawing.Color.Purple.ToArgb();
verts[7].SetPosition(new Vector3(0.5f, 0.3f, 1.0f));
verts[7].Color = System.Drawing.Color.Purple.ToArgb();
verts[8].SetPosition(new Vector3(0.2f, 0.2f, 1.0f));
verts[8].Color = System.Drawing.Color.Purple.ToArgb();
verts[9].SetPosition(new Vector3(0.3f, 0.4f, 1.0f));
verts[9].Color = System.Drawing.Color.Purple.ToArgb();
verts[10].SetPosition(new Vector3(0.0f, 0.6f, 1.0f));
verts[10].Color = System.Drawing.Color.Aqua.ToArgb();
когда я рисуюLineStrip
(вот вид звездочки... мне ее нада "закрасить")
http://wonderu.nm.ru/linestrip.gifTriangleStrip
,
то получается
http://wonderu.nm.ru/trianglestrip.gifTriangleFan
http://wonderu.nm.ru/trianglefan.gif
← →
NailMan © (2005-03-31 16:26) [11]если ты не пользуешь indexBuffers то на каждый примитив ты задаешь 3 вершины если будешь рендерить как trianlelists, пшследовательно в определенном порядке перечислить вершины для strip и Fan-а, но при этом фигура должна "сходиться" этими методами, тоесть перечислив(занеся их в буфер) по правилам все вершины ты получишь ту фигуру что задумал без артефактов.
В общем случае нужно в буфер заносить тройки вершин образующих треугольник. Твоя фигура ни страйпом(лайнстрайп мы вообще забываем) ни фаном не описываются, то есть она этими методами не "сходима".
Потому описывай ее так как положено и как я тебе перечислил. Условно обозначенные вершины будут заноситься в обязательном порядке так:
1,2,11,2,3,4,4,5,6,6,7,8,8,10,11,8,11,6,6,11,2,6,2,4
и рендеря их как TriangleList ты получишь свою звезду.
Есть определенный список фигур (примитивов), которые могут "сходиться" с помощью trianglefan или trianglestrip, а именно:
прямоугольник - TriangleStrip - 2 примитива последовательно "лесенкой", 4 вершины в описании; TriangleFan - 8 примитивов радиально от центра, 10 вершин в описании.
Сфера(эллипсоиды) - зависит от типа сферы(тип посторения сетки), сходится TriangleStrip
Цилиндр:
Круг(приближенно круг) - сходится TriangleFan-ом. Типа торец цилиндра
Поверхность цилиндра(замкнутая) - сходится TriangleStrip. Это вообще класический пример использования TriangleStrip.
Все остальное как правило не сходимы этими способами рендера и выводятся triangleList-ом.
Чтобы экономить вершинный буфер, используют vertexbuffers и indexbuffers в паре. ТОгда описывают в VB все вершины объекта, а в индексном буфере описывают тройки индексов вершин, которые образуют треуги. Собсно в
[6] NailMan © я и привел содержимое индексного буфера.
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
← →
A22 © (2005-03-31 17:07) [12]в общем-то я имел ввиду лишь то, звезду и что угодно еще можно собрать из треугольников и мудрить не над чем. не получается стрипом - делается листом, только и всего..
← →
WondeRu © (2005-04-01 09:45) [13]A22 © (31.03.05 17:07) [12]
блин, а если элементов несколько тысяч???!!! они читаются из файла... я без понятия, какой формы будет полигон!
← →
NailMan © (2005-04-01 09:54) [14]WondeRu ©
А это твои проблемы. Делай в Максе модель и грузи их .X предварительно сконвертнув из 3DS. И не имей гемора.
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
← →
WondeRu © (2005-04-01 10:09) [15]NailMan © (01.04.05 9:54) [14]
блин... это не игрушка,а промышленный проект! а файлы КАД-системы!
← →
NailMan © (2005-04-01 10:56) [16]WondeRu ©
Есть поддержка скиптов? Значит придется написать экспортер в удобоваримый формат с таким алгоритмом преобразования линий в треуги как понятно это директу. Иначе пробовать конвертерами это сделать, в чем я сумневаюсь.
Так что все таки придется писать самому конвертер. Задача у тебя совсем нетривиальная, вот и гемор.
---
P.L.U.R. and WBR, NailMan aka 2:5020/3337.13
← →
WondeRu © (2005-04-01 11:33) [17]NailMan © (01.04.05 10:56) [16]
Задача у тебя совсем нетривиальная, вот и гемор.
оочень даже тривиальная! У меня есть уже работающая программа (тесселяция с помощью GLU), но она работает под OpenGL (Win32, также есть версия под .NET), вот я ее хочу переделать под DirectX (.NET)
← →
Sapersky (2005-04-02 12:36) [18]http://www.geocities.com/foetsch/extrude/extrude.htm
← →
Sapersky (2005-04-02 13:22) [19]Пардон, не заметил приведённую в [5] ссылку.
Во всяком случае, метод заполнения буфера по тому примеру можно посмотреть. Хотя я посмотрел - понял не много :(
Если писать самому... есть относительно простой метод триангуляции:
http://www.citforum.netis.ru/programming/theory/alg_triangl/index.shtml
Жаль, варианта этого документа с картинкой не нашёл (должна быть после фразы "При этом могут иметь место следующие два случая:"), но наверное и так понять можно.
С пересечениями и вложенными фигурами этот алгоритм не работает.
Общая рекомендация - (особенно "если элементов несколько тысяч") - использовать индексы. Т.е. вершины запихиваем как есть, а потом для них генерируем индексы по данному или другому алгоритму.
У меня есть реализация, но она из разряда "без поллитры не разберёшься" (и местами глючит) - не уверен, что поможет.
Страницы: 1 вся ветка
Форум: "Media";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.047 c