Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.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 вся ветка

Форум: "Media";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.047 c
1-1121728449
jcrush
2005-07-19 03:14
2005.08.07
Найти в списке memo буквы КД и по горячим клавишам заменить


6-1114670407
Pavelkq
2005-04-28 10:40
2005.08.07
NMFTP + Nlist = Range check error


3-1119801157
serguncho
2005-06-26 19:52
2005.08.07
Транзакции в Firebird


14-1121750288
БарЛог
2005-07-19 09:18
2005.08.07
Помогите перевести порошок =)


10-1098704391
Vitalik_P
2004-10-25 15:39
2005.08.07
Работа с Word - поиск и замена





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский