Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.07;
Скачать: CL | DM;

Вниз

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.gif

TriangleStrip,
то получается
http://wonderu.nm.ru/trianglestrip.gif

TriangleFan
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 вся ветка

Текущий архив: 2005.08.07;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.046 c
1-1121591340
Чайничек
2005-07-17 13:09
2005.08.07
Удаление в файле


14-1121420388
KSergey
2005-07-15 13:39
2005.08.07
Не отображаются создаваемые папки под произвольным пользователем


14-1121668373
Antonn
2005-07-18 10:32
2005.08.07
Помогите найти решение задачки


14-1121290192
Alex_Korn
2005-07-14 01:29
2005.08.07
Черт !!! Застыл на одном месте !


10-1098875056
Николай
2004-10-27 15:04
2005.08.07
Проблема MS Access