ПОВЕРХНОСТЬ

Работа с 2D и 3D графикой, видео, звуком.

Модератор: Mikle

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

ПОВЕРХНОСТЬ

Сообщение Bonesnapper » 23.12.2004 (Чт) 18:15

Кто нибудь подскажите как создать поверхность из примитивов
И как потом ее изменять

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 23.12.2004 (Чт) 18:32

Ну d3dx.CreateTeapot, например, создает поверхность в виде чайника. Вообще любая модель - поверхность. Короче вопрос непонятный.

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 23.12.2004 (Чт) 19:14

:?
Имеется ввиду ландшафт
Подскажите как сделать плоский пол из полигонов (например 32х32)
и
как потом менять высоты не разрывая целостности
(как я понимаю это чтото связанное с индексированием)

D'alex
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 144
Зарегистрирован: 08.05.2004 (Сб) 20:11
Откуда: Moscow

Сообщение D'alex » 23.12.2004 (Чт) 20:00

Ищи на форуме - такая тема уже была...чтото типа "генерация ландшафтов"- там вроде и код был описан в качестве примера ...

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 24.12.2004 (Пт) 1:27

а лучше юзать клевый движок iRender! пример ландшафта есть на сайте ))
ХЎ

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 24.12.2004 (Пт) 11:31

Или глянь в SDK пример Vertex Shaders. Там есть простая генерация регулярной сетки (не боись, Vertex Shaders тут не при чем :wink: ). А менять высоты - это менять координату Y у вертексов.

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 25.12.2004 (Сб) 0:47

d3drm писал(а):а лучше юзать клевый движок iRender! пример ландшафта есть на сайте ))

лучше юзать движок от UT 2004 :lol:
Я бы юзал твой если бы он был Open Sourse :wink:
все таки хочется понимать чем занимаешся :wink:
Mikle
Щас посмотрю

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 26.12.2004 (Вс) 20:45

если бы ты имел возможность разобраться с UT 2004, то ты бы не спрашивал как создать ландшафт )))
ХЎ

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 30.12.2004 (Чт) 0:00

d3drm писал(а):если бы ты имел возможность разобраться с UT 2004, то ты бы не спрашивал как создать ландшафт )))


Лучше ты бы примерчик какой нибуть простенький подкинул
а то чето не могу найти где в примере Vertex Shaders создание ландшафта :wink:

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 31.12.2004 (Пт) 13:08

Bonesnapper
Там нет создания ландшафта - там есть создание регулярной сетки и отрисовка ее с помощью Indexed Primitives. Этот же прием, как правило, применяют и для ландшафтов. Посмотри здесь:
http://www.gamedev.ru/articles/

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 02.01.2005 (Вс) 22:14

Чето нет там не чего :cry:
Может у кого есть пример создания регулярной сетки буду благодарен :roll:

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 05.01.2005 (Ср) 16:24

Вот мой ландшафт на рег. сетке. Без ЛОДа - просто ограничение дальности:
http://tuapse-mikle.narod.ru/terr.zip

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 05.01.2005 (Ср) 17:01

ЛОДа - ????
Вобще круто
Но не мог бы ты хоть чуть чуть обьяснить работу функций в класе
а то чето совсем "нечего не понимаю" :oops:

Мне бы хотя бы понять как плоский построить
подскажите как построить поверхность с помощью индексирования :?:

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 06.01.2005 (Чт) 0:18

у меня какая-то фигня выходит. я сменил HARDWARE_VERTEXPROCESSING на SOFTWARE, но думаю, не в этом дело. у меня идет жестокий клюк: часть полигонов берет свое начало в верхнем левом углу экрана, при движении камеры полигоны как-то переставляются. не знаю, что это такое, но жутко бесит. не первый пример который так работает. тут скриншот:

Изображение
ХЎ

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 06.01.2005 (Чт) 11:24

d3drm
Возможно это из-за D3DFMT_INDEX32. На старых карточках может не работать, но с D3DFMT_INDEX16 большого ландшафта не сделать :cry: , вернее можно - по частям, но это гиморрой и все равно будет медленно.
Bonesnapper
ЛОД, точнее LOD - Level of Detail, снижение детализации по мере удаления от камеры.
Класс LandScape можешь применять в своих программах "как есть", а делается там вкратце:
1. В Init задается вертексный буфер нужного формата, формат берется из .BMP файла (только GrayScale). Тут вертексный буфер - это двумерный массив типа vFormat. При инициализации значение X задается пропорционально первой размерности, а Z - второй. Y - вертикальное направление, для плоскости значение Y для всех элементов будет равно. Но тут не плоскость, а "горы", Y для каждого элемента берется из соответствующей точки .BMP файла.
2. В Property Let FrameSize задается размер ОТОБРАЖАЕМОГО фрагмента и по нему генерируется соответствующий индексный буфер.
3. В Render в длинном Select Case вычисляется позиция индексного буфера на вертексном в зависимости от позиции камеры и направления. Дальше в цикле Strip-ами выводится ландшафт.

Остальные ф-ции и методы не столь важны:
1. В .BMP можно задать всего 256 градаций высоты - явно мало, получаются ступеньки. FilterHeight делает фильтрацию значений Y вертексного буфера.
2. GetHeight просто возвращает значение высоты ландшафта для заданных X и Z.
3. Освещение сделано через Diffuse. CalcLiteMap его просчитывает, исходя из вектора направления света.

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 06.01.2005 (Чт) 15:52

Пробовал, Майкл, менять, тот же эффект. Есть еще идеи?
ХЎ

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 06.01.2005 (Чт) 19:12

Mikle
Почему если ScaleSize не равно 1 то чето все глючит (ландшафт под камерой не рисуется) :cry:
ты не мог бы подробней обьяснить зачем нужны iBuf,vBuf и чем мы их заполняем :oops:

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 07.01.2005 (Пт) 15:20

d3drm
А ты вместе с INDEX16 сделал iBuf() не Long, а Integer?
Еще попробуй уменьшить FrameSyze.
Bonesnapper
С ScaleSyse я глюкнул. Пока не было FrameSyze оно работало, переделаю.
зачем нужны iBuf,vBuf и чем мы их заполняем

ну это самые основы D3D, посмотри в SDK туториалы (6 шт.).

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 07.01.2005 (Пт) 21:11

Mikle, спасибо, все заработало. Для такой красоты и моей видеокарты - 5 fps в середине карты - это супер =)))
ХЎ

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 08.01.2005 (Сб) 11:04

d3drm
Не за что. У меня при FrameSyze=1024 FPS около 30 в центре карты. Представляешь красота, когда видно все без ограничений!

Bonesnapper
Исправление в классе LandScape, теперь можно менять ScaleSyze:
Код: Выделить всё
Public Sub Render(d3dDev As Direct3DDevice8, x As Single, z As Single, Ang As Single)
Dim x1 As Long, z1 As Long, x2 As Long, z2 As Long
Dim xx As Long, zz As Long, iz As Long, a As Single
  xx = x / ScaleXZ
  zz = z / ScaleXZ
  a = Ang / Pi
  Select Case a
    Case 0.25! To 0.75!
      x1 = xx - SizeOfFrame + 2&: x2 = xx + 1&
      z1 = SizeOfFrame * 2! * (0.25! - a) + zz
      z2 = z1 + SizeOfFrame - 1&
    Case 0.75! To 1.25!
      z1 = zz - SizeOfFrame + 2&: z2 = zz + 1&
      x1 = SizeOfFrame * 2! * (a - 1.25!) + xx
      x2 = x1 + SizeOfFrame - 1&
    Case 1.25! To 1.75!
      x1 = xx - 1&: x2 = xx + SizeOfFrame - 2&
      z1 = SizeOfFrame * 2! * (a - 1.75!) + zz
      z2 = z1 + SizeOfFrame - 1&
    Case Else
      If a > 1! Then a = a - 2!
      z1 = zz - 1&: z2 = zz + SizeOfFrame - 2&
      x1 = SizeOfFrame * 2! * (-0.25! - a) + xx
      x2 = x1 + SizeOfFrame - 1&
  End Select
  If x1 < 0& Then x1 = 0&
  If z1 < 0& Then z1 = 0&
  If x2 >= SizeX Then x2 = SizeX - 1&
  If z2 >= SizeZ Then z2 = SizeZ - 1&
  numTri = (x2 - x1 + 1&) * 2&
  numVertex = x2 - x1 + SizeX + 3&
  d3dDev.SetVertexShader vFlag
  If numTri > 0& Then
    For iz = z1 To z2
      d3dDev.DrawIndexedPrimitiveUP D3DPT_TRIANGLESTRIP, 0&, numVertex, numTri, iBuf(0&), D3DFMT_INDEX16, vBuf(x1, iz), SizeOfVertex
    Next iz
  End If
End Sub

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 10.01.2005 (Пн) 20:42

Mikle
угу! а я вот класс bsp в движке iRender обновил, смотри как красиво получается:

Тут пара скриншотов:

http://irender3d.com/board/viewtopic.php?t=51
ХЎ

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 10.01.2005 (Пн) 21:00

Очень узнаваемы Q3 карты :wink: .

d3drm
Астролог
Астролог
Аватара пользователя
 
Сообщения: 2873
Зарегистрирован: 29.05.2002 (Ср) 23:34
Откуда: МаСКвА

Сообщение d3drm » 11.01.2005 (Вт) 4:43

Да, теперь bsp карты даже узнаваемы :lol: на самом деле если не поленишься и скачаешь пример с сайта тебе понравится еще больше =)
ХЎ

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 11.01.2005 (Вт) 17:57

Mikle
чего-то походу не хватает
после замены:
У вас нет доступа для просмотра вложений в этом сообщении.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 12.01.2005 (Ср) 11:16

Замени D3DFMT_INDEX16 на D3DFMT_INDEX32. Я экспериментировал и забыл вернуть.

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 13.01.2005 (Чт) 0:33

Mikle
все заработало спасибо
немного разобрался как я понял ibuf нужен для того чтоба показать в каком порядке рисовать
Но скажи пожалуйста как там у тебя высота рассчитывается :roll:

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 13.01.2005 (Чт) 11:07

В строке:
vBuf(x, z).Pos.y = b * ScaleY + PosY
значение, взятое из .BMP (b), умножается на масштаб, заданный пользователем (ScaleY) и прибавляется к уровню нуля (PosY). Затем в FilterHeight идет фильтрация, вроде Smooth из фотошопа.

Bonesnapper
Постоялец
Постоялец
 
Сообщения: 434
Зарегистрирован: 12.09.2004 (Вс) 15:39

Сообщение Bonesnapper » 14.01.2005 (Пт) 21:44

Mikle
Не та высота :wink:
в функции GetHeight
в самой последней строчке (GetHeight = vBuf(ix, iz).Pos.y * (1! - xx)....)

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 15.01.2005 (Сб) 10:55

Вычисляется ячейка сетки, на которой находится объект. Вокруг ячейки лежат четыре вершины:
(ix, iz), (ix+1, iz), (ix, iz+1), (ix+1, iz+1)
Расстояние от объекта до (ix, iz) будет xx, zz.
В последней строке рассчитывается высота точки под объектом с помощью формулы линейной интерполяции между четырьмя точками на плоскости.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 15.01.2005 (Сб) 19:49

d3drm
Лазил-лазил я по твоему сайту, сайт красивый (похож на vbStreets) и посетителей много, а вот где скачать демку - так и не нашел :cry: .

След.

Вернуться в Мультимедиа

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 23

    TopList