Снова Ландшафт

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

Модератор: Mikle

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

Сообщение d3drm » 18.12.2005 (Вс) 10:33

а если у тебя будет 100 текстур, ты будешь создавать 100 буферов? ))) ЛОЛ )
ХЎ

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 18.12.2005 (Вс) 10:38

Ну тогда как на нужных мне вертексах поменять текстуру?
#define ROFL 0xDDDD

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 18.12.2005 (Вс) 10:41

Код: Выделить всё
Public Function rayCollision(Start As D3DVECTOR, Direction As D3DVECTOR, Vertice1 As D3DVECTOR, Vertice2 As D3DVECTOR, Vertice3 As D3DVECTOR, t As Double, U As Double, V As Double, Optional NoCollideI As Boolean = False) As Byte
Dim edge1 As D3DVECTOR
Dim edge2 As D3DVECTOR
Dim tvec As D3DVECTOR, pvec As D3DVECTOR, qvec As D3DVECTOR
Dim inv_det As Double
Dim det As Double
On Local Error Resume Next
'Íàõîäèì ãðàíè
D3DXVec3Subtract edge1, Vertice2, Vertice1
D3DXVec3Subtract edge2, Vertice3, Vertice1
D3DXVec3Cross pvec, Direction, edge2

'Íàõîäèì äåòåðìèíàíò.Åñëè îí  áëèçêî ê íóëþ, çíà÷èò òî÷êà âíå òðåóãîëüíèêà
det = D3DXVec3Dot(edge1, pvec)
If det > -EPSILON And det < EPSILON Then
rayCollision = 0
Exit Function
End If
inv_det = 1 / det
'Íàõîäèì u è ïðîâåðÿåì
D3DXVec3Subtract tvec, Start, Vertice1
U = D3DXVec3Dot(tvec, pvec) * inv_det
If U < 0 And U > 1 Then
rayCollision = 0
Exit Function
End If
'------""------- v è ïðîâåðÿåì
D3DXVec3Cross qvec, tvec, edge1

V = D3DXVec3Dot(Direction, qvec) * inv_det
If V < 0 And U + V > 1 Then
rayCollision = 0
Exit Function
End If

'ïîñ÷èòàåì t,òðåóãîëüíèê ïåðåñå÷åííûé ëó÷îì
t = D3DXVec3Dot(edge2, qvec) * inv_det
rayCollision = 1
End Function

Нахожу вертексы сканируя область ланда и v4.pos.x почему-то всегда -511
#define ROFL 0xDDDD

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

Сообщение Mikle » 18.12.2005 (Вс) 10:42

DirectXManiac
Есть направление луча.Нужно найти полигон, где луч пересекает его на ландшафте.

Наверное есть еще и позиция начала луча?
Теоретически такой луч может пересечь ландшафт в нескольких точках, тебе нужна ближняя?

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 18.12.2005 (Вс) 10:43

Позиция начала это позиция курсора на экране..
#define ROFL 0xDDDD

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 18.12.2005 (Вс) 10:46

Видимо что не правильно считаеться с курсором, потому как он всё время стоит в центре экрана или формы
#define ROFL 0xDDDD

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

Сообщение Mikle » 18.12.2005 (Вс) 10:46

А проекция какая? Просто если изометрия, то все проще, тем более если направление фиксировано, ландшафт просто скроллится по экрану, как в стратегиях.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 18.12.2005 (Вс) 10:47

Нет.Проэкция от первого лица.
#define ROFL 0xDDDD

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

Сообщение Mikle » 18.12.2005 (Вс) 10:47

DirectXManiac
он всё время стоит в центре экрана или формы

Теперь понятно, от первого лица, перспектива. Прикину код.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 18.12.2005 (Вс) 10:48

Давай.Пожалуйста всю ночь мучался.Так как поменять текстуру?
#define ROFL 0xDDDD

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 18.12.2005 (Вс) 10:51

Код: Выделить всё

   Dim t As Double, U As Double, V As Double, t1 As Double, u1 As Double
Dim vdir As D3DVECTOR
Dim v1 As Double, v2, v3, v4, v5, v6
Dim a As Long, b As Long, c As Long, d As Long, e As Long, f As Long
Dim maxx As Single, maxy As Single, tempv As D3DVECTOR
tempv = CamPos
maxx = LS.SizeX / 16
maxy = LS.SizeZ / 16
vdir = GetMousePickDirection(X, Y)
a = Int(tempv.X / 256)
b = Int(tempv.z / 256)
c = Int((tempv.X Mod 256) / 16)
d = Int((tempv.z Mod 256) / 16)
e = a * ((1 / 16) + 1)
f = b * ((1 / 16) + 1)

Dim i As Long
For i = 0 To 1 / 64
  If d >= 0 And d < maxy - 1 And c >= 0 And c < maxx Then
       v3 = f * maxy + e
       v2 = (f + 1) * maxy + e
       v1 = (f + 1) * maxy + e + 1
       v6 = f * maxy + e
       v5 = (f + 1) * maxy + e + 1
       v4 = f * maxy + e + 1
       Dim g As Byte, g1 As Byte
       g = rayCollision(vec3(X, Y, 0), vdir, Vert(vBuf(v1, v1)), Vert(vBuf(v2, v2)), Vert(vBuf(v3, v3)), t, U, V)
        g = rayCollision(vec3(X, Y, 0), vdir, Vert(vBuf(v4, v4)), Vert(vBuf(v5, v5)), Vert(vBuf(v6, v6)), t1, u1, v1)
        If (g = 1 And t < 1 And t >= 0) Or (g1 = 1 And t1 < 1 And t1 >= 0) Then
        Label1.Caption = Str(vBuf(v4, v4).Pos.z)
       
        End If
  End If
  tempv = VAdd(tempv, VScale(vdir, 4))
Next i

Это поиск полигона

Код: Выделить всё
Public Function GetMousePickDirection(X As Single, Y As Single) As D3DVECTOR
Dim Mtemp As D3DMATRIX
Dim Mtemp2 As D3DMATRIX
Dim view As D3DVIEWPORT8

d3dDevice.GetTransform D3DTS_WORLD, Mtemp
d3dDevice.GetViewport view
On Local Error Resume Next
Cursor.X = X
Cursor.Y = Y
Cursor.z = 0
d3dDevice.GetTransform D3DTS_VIEW, Mtemp2
D3DXVec3Unproject vNear, Cursor, view, pjm, Mtemp2, Mtemp
Cursor.z = 1
D3DXVec3Unproject vFar, Cursor, view, pjm, Mtemp2, Mtemp
D3DXVec3Subtract GetMousePickDirection, vFar, vNear

End Function

А это нахожение направления луча
#define ROFL 0xDDDD

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

Сообщение d3drm » 18.12.2005 (Вс) 10:53

Device.SetTexture Stage, texture, при чем тут вертексы вообще?
ХЎ

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 18.12.2005 (Вс) 11:10

Но текстура накладываеться на весь ланд!
#define ROFL 0xDDDD

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 18.12.2005 (Вс) 11:11

Очень прошу посмотрите что тут неправильно в кодах...ПЛИИЗЗЗЗЗЗ!
#define ROFL 0xDDDD

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

Сообщение d3drm » 18.12.2005 (Вс) 11:23

:lol:

надо просто прерываться, в момент, когда нужно сменить текстуру, а потом продолжать рисовать ланд дальше.

что-то типа:

device.setvertexbuffer vbuf
device.settexture 0, tex1
device.drawprimitive ...
device.settexture 0, tex2
device.drawprimitive...
ХЎ

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 18.12.2005 (Вс) 11:27

Ну ясненько!Спасибо!Но одна проблема... у меня помойму не правильно полигон нахожиться.Я прошу посмотрите d3drm ПОЖАЛУЙСТА!!!!
#define ROFL 0xDDDD

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

Сообщение d3drm » 18.12.2005 (Вс) 12:47

DirectXManiac писал(а):Я прошу посмотрите d3drm ПОЖАЛУЙСТА!!!!


не надо меня смотреть....
ХЎ

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 19.12.2005 (Пн) 5:37

Не я имею ввиду чтобы ты d3drm посмотрел код.
Сожет хотябы алгоритм напишешь.Я думаю вот так
Построение:
1.Vertex Buffer заполняеться из файла карты высот
2.IndexBuffer заполняеться индексами полигонов.

Прорисовка:
1.Ландшафт прорисовываеться с помощью DrawIndexedPrimitivesUP
Мультитекстурирование:
1.Находим мировые координаты мышки.
2.Проверяем пересечение с треугольниками, сканируя область близко гду был клилк.(Возле точки где был клик).
3.Если пересиклись добавляем в доп. индекс буффер и в рендеринге меняем:
Код: Выделить всё

SetTexture 0,Main
DrawIndexedPrimitivesUP       'Рендеринг ландшафта
If DrawMultitexture Then
SetTexture 0,Add
DrawIndexedPrimitivesUP      'Рендеринг тех полигонов, которые 'политекстурировыны
End if

d3drm ты мастер всяких фич типа этого - напиши пожалуйста алгоритм, как рисовал ландшафт с политекстурированием ты, по моему плану, очень прошу.Не могу понять что у меня не так.Или хотябы исправь тот, который я написал выше до правильного, если есть недочеты.А если он не правильный напиши свой.ПОЖАЛУЙСТА. :oops: :oops: :oops: ЗАПАРИЛСЯ!!!!
#define ROFL 0xDDDD

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 19.12.2005 (Пн) 5:38

d3drm писал(а):
DirectXManiac писал(а):Я прошу посмотрите d3drm ПОЖАЛУЙСТА!!!!


не надо меня смотреть....


Я имел ввиду то, что бы глянул на код :D
#define ROFL 0xDDDD

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

Сообщение d3drm » 19.12.2005 (Пн) 18:58

аогоритм прост.

смотри, у тебя весь ландшафт рендерится за один проход (один drawprimitives) потому, что у всех полигонов одна текстура (карту цвета в расчет не берем) и один материал. Если ты делаешь мультитекстурирование, то тебе надо разделить ландшафт на те куски, для каждого из которых у тебя будет своя текстура. Разделение происходит не в самом буффере, а вне его. То есть допустим есть ландшафт такой:

0000000000000000
0000000000000000
0000000000000000
0000000111000000
0000000110000000
0000000000000000
0000000000000000

Каждая цыферка - это один квадрат на ландшафте, то есть 2 треугольника. Значение циферки - ее текстура. Если ты разобрался с тем, как прорисовывается ландшафт, то понял, что прорисовка идет рядами с отсечением крайних квадратов, если они находятся вне поля видимости камеры. Но тем не менее, проиндексировав их все (то есть создав отдельный массив где находятся индексы текстур для каждого квадрата) у нас получается карта, которая показывает где какая текстура. Можно сделать проще - создать структуру, которая будет говорить ОТ и ДО места, которые рендерятся с одной текстурой, другой, третьей и т.д. Я делал именно так. Дальше при прорисовке ландшафта имея эти сведения мы знаем какой кусок рисовать с одной текстурой, а какой - с другой. А вот алгоритм деления ланда на части потом напишу, если поймешь, что я написал тебе здесь.
ХЎ

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 19.12.2005 (Пн) 19:56

Спасибо!Я понял.Это и есть тайлинг...как я понял...Так вот теперь напиши алгоритм деленения ланд.Я понял , что мы должны присваивать нужную циферку найденому полигону.Впринципе на примере майкла циферки содержаться в iBuf().Каким то образом можно и через него...Давай пожалуйста деление..
#define ROFL 0xDDDD

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

Сообщение d3drm » 19.12.2005 (Пн) 20:24

Короче так.

Есть конструкция, что-то вроде:

type LandPart
start as x
end as y
end type

далее делаем массив этих структур для кажого ряда ландшафта.

на примере одного ряда рассматриваем алгоритм дальше. итак, для ряда есть Parts() as LandPart. по началу размер массива равен 1ому элементу. То есть redim Parts(0).

При этом Parts(0).start = 0 а Parts(0).end = LandWidth (кол-во ячеек в ряде).

Человеческим языком это описывается примерно, как у нас есть одна часть ландшафта, которая начинается с началом ряда и заканчивается в его конце. Этой части ланда соответствует одна тектсура.

Далее чтобы задать участку в ряду другую текстуру, надо разделить часть. Будем делить часть на 2 части - если выделенный фрагмент является первым или последним квадратом (тайлом) на ланде, на 3 в противном случае.

То есть было:

000000000000

стало:

000000010000

где 1 - новый врагмент с другой текстурой.

Новым трем (двум) частям устанавливаем новые границы.

То есть, если выделен 5 фрагмент, то теперь три части выглядят так:

parts(0).start = 0
parts(0).end = 4
parts(1).start = 5
parts(1).end = 5
parts(2).start = 6
parts(2).end = landWidth

У первой и третей части прежняя туктсура, у второй - новая.

если выделен участок в самом начале или конце (первый или последний квадрат) то соответственно пропадают первая или последняя часть представленного выше кода.

Вот так надо действовать далее с каждой из частей ландшафта.
ХЎ

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 19.12.2005 (Пн) 22:44

d3drm:
Type landPart
start as Single или Long
end as Sinlge или Long
End Type
Ты имел ввиду что X и Y это оси по которым надо считать часть?
#define ROFL 0xDDDD

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

Сообщение d3drm » 20.12.2005 (Вт) 0:03

ой, печатал быстро, не смотрел что получилось. Long это, или Integer.
ХЎ

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

Сообщение Mikle » 20.12.2005 (Вт) 10:43

DirectXManiac
На счет "цыфиркм в iBuf" мысля правильная. Только для тайлинга придется TriangleStrip переделать на TriangleList.
RayTraysing пока делаю.

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

Сообщение d3drm » 20.12.2005 (Вт) 11:51

Mikle писал(а):DirectXManiac
Только для тайлинга придется TriangleStrip переделать на TriangleList.


зачем? у меня многотекстурирование работало на переделанном ландшавте, твоем, с trianglestrip...
ХЎ

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

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

d3drm
Так удобнее, а еще можно сделать так - одна RGBA текстура + до пяти обычных. Мультитекстурирование. Вторая текстура накладывается обычно, третья умножается на R из первой, вторая - на G и так далее. Получается, что первая текстура задает распределение остальных, и нет проблем с созданием переходных тайлов. Это легко сделать на шейдерах, но можно и на рег. выражениях, я как-то делал пример использования цветовых каналов в качестве альфы:
http://tuapse-mikle.narod.ru/ColorBlend.rar
47 кБ.
Клавишами "R", "G", "B" выбираем соответствующий канал вместо альфы, "A" - смена режима, "полный" блендинг или между стадиями текстурирования.
Шейдеров нет, должно работать даже на GF2MX.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 20.12.2005 (Вт) 17:32

Хорошо Mikle.Спасибо.Когда доделаешь кинь на форум!Может и не надо вовсе в твоём примере делить на куски ланд, а просто найти полигон и его индекс в iBuf и поменять текстуру?
#define ROFL 0xDDDD

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

Сообщение Mikle » 21.12.2005 (Ср) 14:34

Ландшафт с поиском пересечения с лучем. Если ф-ция RayInterSector возвращает True - в векторе vOut координаты пересечения. На этом месте рисуется Teapot для наглядности.

DirectXManiac
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1543
Зарегистрирован: 03.11.2005 (Чт) 13:32
Откуда: из DirectX SDK

Сообщение DirectXManiac » 22.12.2005 (Чт) 2:22

Спасибо!Разберусь!Так как там с iBuf.НАдо ли делить ланд на части?
#define ROFL 0xDDDD

Пред.След.

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

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

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

    TopList