ПОВЕРХНОСТЬ

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

Модератор: Mikle

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

Сообщение Mikle » 12.02.2005 (Сб) 10:15

Значений "по умолчанию" там нигде нет. В примере FrameSize = 255, а единице равен ScaleSize - то есть масштаб по X и Z. Причем с вычислением ScaleSize там есть ошибка, как ее исправить указано на второй странице данной темы.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 12.02.2005 (Сб) 19:44

Прямоугольный полигон описан четырьмя вертексами
1 2
4 3
Есть ли принятый стандарт для диагонали?
Между 1-3 или 2-4? Или каждый делает как заблагорассудится?
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

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

Сообщение Mikle » 12.02.2005 (Сб) 20:05

Если резать на стрипы, вопросов не возникает. Попробуй выбрать начало, направление, а порезать по-другому.

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

Сообщение d3drm » 13.02.2005 (Вс) 17:56

Mikle писал(а):Значений "по умолчанию" там нигде нет. В примере FrameSize = 255, а единице равен ScaleSize - то есть масштаб по X и Z. Причем с вычислением ScaleSize там есть ошибка, как ее исправить указано на второй странице данной темы.



Клево, разобрался - действительно клево когда ландшафт прорисовывается весь, хотя у меня при этом выдает 3 fps =)
ХЎ

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

Сообщение Bonesnapper » 14.02.2005 (Пн) 18:18

Кто нибудь подскажите пожайлуста
как с помошью этой функции нарисовать только часть поверхности
(только верхнюю часть,нижнюю часть или середину)
d3dDevice.DrawIndexedPrimitiveUP D3DPT_TRIANGLELIST, 0&, m_NumVertices, m_NumIndices / 3, iBuf2(0&), D3DFMT_INDEX32, vBuf2(0), SizeOfVertex2
если отнимать (например 2000) от m_NumIndices / 3 то рисуется только верхняя часть
как поставить параметры чтобы можно было выбрать какой кусок рисовать
зарание спасибо :wink:
пример прилогается
У вас нет доступа для просмотра вложений в этом сообщении.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 14.02.2005 (Пн) 23:01

Майкл, при повороте камеры иногда по краям отсекается даже то, что не нужно отсекать (видимую часть)... Можно ли как-нть от этого избавиться? Это скорее всего глюки округления... :roll:

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

Сообщение Mikle » 15.02.2005 (Вт) 15:24

Код: Выделить всё
    Case 0.25! To 0.75!
      x1 = x - SizeOfFrame + 3&: x2 = x + 2&          '***
      z1 = SizeOfFrame * 2! * (0.25! - a) + z
      z2 = z1 + SizeOfFrame - 1&
    Case 0.75! To 1.25!
      z1 = z - SizeOfFrame + 3&: z2 = z + 2&          '***
      x1 = SizeOfFrame * 2! * (a - 1.25!) + x
      x2 = x1 + SizeOfFrame - 1&
    Case 1.25! To 1.75!
      x1 = x - 2&: x2 = x + SizeOfFrame - 3&          '***
      z1 = SizeOfFrame * 2! * (a - 1.75!) + z
      z2 = z1 + SizeOfFrame - 1&
    Case Else
      If a > 1! Then a = a - 2!
      z1 = z - 2&: z2 = z + SizeOfFrame - 3&          '***
      x1 = SizeOfFrame * 2! * (-0.25! - a) + x
      x2 = x1 + SizeOfFrame - 1&

Это на вскидку - проверить не на чем. Замена в строках, отмеченных "'***". Если мало, попробуй еще увеличить (вместо 2& и 3& будет 3& и 4& или 4& и 5&).

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

Сообщение Bonesnapper » 17.02.2005 (Чт) 12:05

а на мой вопрос чето никто не отвечает :cry:

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

Сообщение Mikle » 17.02.2005 (Чт) 15:56

Bonesnapper
В моем примере и так отображается не вся поверхность, а квадратный фрагмент размером FrameSize и от произвольного вертекса.

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 17.02.2005 (Чт) 21:40

Есть прямоугольная поверхность, например 4х4х2 полигонов.
Имеются ли отличия в особенностях прорисовки примитивов
D3DDevice.DrawIndexedPrimitive D3DPT_TRIANGLESTRIP
если
D3DVertexBuffer8SetData vBuf, 0&, SizeOfVBuf, 0&, SVArray(0)
D3DIndexBuffer8SetData iBuf, 0&, SizeOfIBuf, 0&, SIArray(0)
и
D3DVertexBuffer8SetData vBuf, 0&, SizeOfVBuf, 0&, SVArray(0,0)
D3DIndexBuffer8SetData iBuf, 0&, SizeOfIBuf, 0&, SIArray(0,0)
???
У меня если массивы одномерные - вся прямоугольная поверхность рисуется нормально, на двумерных - только первая строка (4х2) полигонов! Методы настройки вертексов и индексов в обеих случаях применяю одинаковые.
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 17.02.2005 (Чт) 21:47

Mikle писал(а):Это на вскидку - проверить не на чем. Замена в строках, отмеченных "'***". Если мало, попробуй еще увеличить (вместо 2& и 3& будет 3& и 4& или 4& и 5&).
Майкл, ставил я по 10 и даже 20... - нифига...(кстати где-то при ста перезагрузилась система) все равно отсекает.... именно по краям... Я чуть-чуть не могу понять какие именно ты берешь углы? Если по четвертям, что чет не похоже... Если нет, то может стоит побольше значений взять? Короче не знаю, но эта штука страшно бесит, когда несешься, потом поворачиваешь а она обрубками рисует по краям...... :cry:

Yurich
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 675
Зарегистрирован: 05.03.2003 (Ср) 3:43
Откуда: DONBASS/Gorlovka

Сообщение Yurich » 18.02.2005 (Пт) 2:04

Yurich писал(а):Имеются ли отличия в особенностях прорисовки примитивов
D3DDevice.DrawIndexedPrimitive D3DPT_TRIANGLESTRIP

И еще. Прога валится при
D3DCREATE_SOFTWARE_VERTEXPROCESSING
режим оконный
на HARDWARE вроде все ОК. Не могу доехать.
Пример Майкла с водичкой работает без проблем!!!
- Какой треугольник не подвластен законам геометрии?
- У которого все углы тупые!

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

Сообщение Mikle » 18.02.2005 (Пт) 16:52

Yurich
Может в варианте с SVArray(0,0), SIArray(0,0) поменять местами строки со столбцами?
Замечал, что Software и Hardware режимы поразному воспринимают неверное указание MinIndex. Когда без ошиьок - оба работают одинаково.
Vovik
Посмотрю дома.

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

Сообщение Bonesnapper » 21.02.2005 (Пн) 23:50

А что при использовании индексированных примитивов
матрица текстур не работает чтоли :cry:

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 22.02.2005 (Вт) 8:16

Bonesnapper писал(а):А что при использовании индексированных примитивов
матрица текстур не работает чтоли :cry:
Как это не работает? Все работает. :?

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

Сообщение Bonesnapper » 22.02.2005 (Вт) 9:40

D3DDevice.SetTextureStageState 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2
D3DDevice.SetTransform D3DTS_TEXTURE1, mat
Ввожу это чето неработает
Наверное опять чтото забыл???? :roll:

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 23.02.2005 (Ср) 21:05

Mikle писал(а):Vovik
Посмотрю дома.
Ну че там, Майкл, смотрел? Просто все клево пашет, кроме этой части.... :cry:

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

Сообщение Mikle » 25.02.2005 (Пт) 16:15

Код: Выделить всё
Select Case a
    Case 0.25! To 0.75!
      x1 = xx - SizeOfFrame + 3&: x2 = xx + 2&
      z1 = SizeOfFrame * (1.9! * (0.25! - a) - 0.025!) + zz
      z2 = z1 + SizeOfFrame - 1&
    Case 0.75! To 1.25!
      z1 = zz - SizeOfFrame + 3&: z2 = zz + 2&
      x1 = SizeOfFrame * (1.9! * (a - 1.25!) - 0.025!) + xx
      x2 = x1 + SizeOfFrame - 1&
    Case 1.25! To 1.75!
      x1 = xx - 2&: x2 = xx + SizeOfFrame - 3&
      z1 = SizeOfFrame * (1.9! * (a - 1.75!) - 0.025!) + zz
      z2 = z1 + SizeOfFrame - 1&
    Case Else
      If a > 1! Then a = a - 2!
      z1 = zz - 2&: z2 = zz + SizeOfFrame - 3&
      x1 = SizeOfFrame * (1.9! * (-0.25! - a) - 0.025!) + xx
      x2 = x1 + SizeOfFrame - 1&
  End Select

Вот так лучше? И еще уменьши zNear.

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

Сообщение Mikle » 26.02.2005 (Сб) 9:32

Код: Выделить всё
Public Sub Render(d3dDev As Direct3DDevice8, x As Single, z As Single, Angle As Single, Diff As Single)
Dim x1 As Long, z1 As Long, x2 As Long, z2 As Long, iz As Long, r As Single
 
  If Diff > 0! Then r = SizeOfFrame * 0.5! Else r = SizeOfFrame * 0.5! * (1! + Diff * 0.3!)
  x1 = x / ScaleXZ - Sin(Angle) * r - SizeOfFrame * 0.5!
  z1 = z / ScaleXZ + Cos(Angle) * r - SizeOfFrame * 0.5!
  x2 = x1 + SizeOfFrame - 1&
  z2 = z1 + SizeOfFrame - 1&

  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


Вот так еще лучше. В старом варианте при сильном наклоне, стоя боком на крутом склоне, часть склона, находящаяся сзади, пропадала.
В новом варианте я добавил зависимость от наклона, так что не забудьте переделать вызов (добавился новый параметр Diff). При этом получилось короче старого варианта.

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

Сообщение d3drm » 26.02.2005 (Сб) 13:03

Замечательно! Вот что значит у человека руки растут туда, куда надо. Супер!
ХЎ

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

Сообщение d3drm » 27.02.2005 (Вс) 20:03

Mikle, не совсем понял, что значит Diff? Просто поворот по X или с хитростью какой? =)
ХЎ

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

Сообщение Mikle » 28.02.2005 (Пн) 11:10

Diff - просто угол наклона камеры по X. В рассчете камеры он участвует:
D3DXMatrixRotationX Mtrx, Diff
d3dDevice.SetTransform D3DTS_VIEW, Mtrx

Если вторую текстуру накладывать по второй паре tu - tv, на каких-то компьютерах это может оказаться быстрее, т. к. не вычисляются в реалтайм текстуретрансформ, но на каких-то медленнее, т. к. растет вертексбуфер.

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 09.03.2005 (Ср) 18:26

Mikle писал(а):
Код: Выделить всё
Public Sub Render(d3dDev As Direct3DDevice8, x As Single, z As Single, Angle As Single, Diff As Single)
Dim x1 As Long, z1 As Long, x2 As Long, z2 As Long, iz As Long, r As Single
 
  If Diff > 0! Then r = SizeOfFrame * 0.5! Else r = SizeOfFrame * 0.5! * (1! + Diff * 0.3!)
  x1 = x / ScaleXZ - Sin(Angle) * r - SizeOfFrame * 0.5!
  z1 = z / ScaleXZ + Cos(Angle) * r - SizeOfFrame * 0.5!
  x2 = x1 + SizeOfFrame - 1&
  z2 = z1 + SizeOfFrame - 1&

  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


Вот так еще лучше. В старом варианте при сильном наклоне, стоя боком на крутом склоне, часть склона, находящаяся сзади, пропадала.
В новом варианте я добавил зависимость от наклона, так что не забудьте переделать вызов (добавился новый параметр Diff). При этом получилось короче старого варианта.

Вот теперь все стало работать как надо! :D Только вот нашел еще пару маленьких багов:
1) При растягивании ландшафта по XZ полигоны тсновятся больше, а так как высота Y определяется по лин. инт., то камера начинает перескакивать, если залазить допустим на гору (при невысокой скорости).
2) Ели ландшафт не пропорциональный (92х20), то рендерятся какие-то левый треугольники :shock:
Можно ли это все поправить? ( по поводу 1: Стоит ли или можно пренебречь и не расстягивать ландшафт, а просто рендерить больше полигонов... но скорость... :roll: ).

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

Сообщение Mikle » 09.03.2005 (Ср) 18:42

1. Посмотрю дома.
2. Такие маленькие (92*20) я не пробовал, а 256*1024 - работало нормально. Тоже гляну.

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

Сообщение Mikle » 10.03.2005 (Чт) 15:33

1. Странно, у меня все корректно работает при изменении любых коэффициентов.
2. Проблема в считывании данных из .BMP. Я делаю ландшафтные .BMP в пятом фотошопе, сохраняю в Grayscale, 8bit, без сжатия. При размерах, кратных четырем все читается корректно.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 10.03.2005 (Чт) 17:49

Дык это...
Сканлайны BMP выравниваются на границу DWORD :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

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

Сообщение Mikle » 10.03.2005 (Чт) 17:57

GSerg
Сканлайны BMP выравниваются на границу DWORD

У меня, как видишь, то же. А у Vovikа 92*20 (тоже DWORD) не работает. Может некоторые программы выравнивают по QWORD?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 11.03.2005 (Пт) 7:15

Да не должно...
MSDN писал(а):Each scan is a multiple of 32 bits.


А цветность во всех случаях 256?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Vovik
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 643
Зарегистрирован: 02.08.2003 (Сб) 15:14
Откуда: Belarus, Minsk

Сообщение Vovik » 12.03.2005 (Сб) 8:39

Mikle писал(а):1. Странно, у меня все корректно работает при изменении любых коэффициентов.
2. Проблема в считывании данных из .BMP. Я делаю ландшафтные .BMP в пятом фотошопе, сохраняю в Grayscale, 8bit, без сжатия. При размерах, кратных четырем все читается корректно.
1. Все заработало. Там закралась ошибка, которая и давала маленькую погрешность, выраженную в скачках...(это я делал подгон под себя) ..
2. А вот эта штука и вправду глюкает... правда лэнд 20х96... приду, вывалю скрины.

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

Сообщение d3drm » 14.04.2005 (Чт) 1:59

все никак не могу догнать кое-что с индексами, может, Mikle, поможешь?

на твоем примере. Вот допустим на ландшафте у меня есть точка, которая на карте высот имеет позицию (5, 5). Какой у нее будет индекс? Как его рассчитать?
ХЎ

Пред.След.

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

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

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

    TopList