Координаты объектов (DX8)

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

Модератор: Mikle

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Координаты объектов (DX8)

Сообщение Maxwell » 09.10.2003 (Чт) 18:07

Вот начал переходить на DX8 и сразу вопросики поевляться начали.
Момогите пожалуйста разобраться:
Как изменять положение и вращение объекта (по X,Y,Z)?
Как изменять размеры (в DX7 это было ScaleMesh)?

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

Сообщение Yurich » 09.10.2003 (Чт) 21:05

Перемещать объекты не пробовал (еще занят семеркой), но на примере камеры можно:

Sub MoveCamera()
Dim Camera As D3DMATRIX
Dim DirectionLookX As Single, DirectionLookY As Single, DirectionLookZ As Single

' Все Direction могут быть заданы на входе в процедуру
' CameraX, CameraY, CameraZ - новое местоположение
' HorLookDegree, VertLookDegree - горизонтальный (0-360) шаг=1 и
' вертикальный (0-180) углы ориентации в ГРАДУСАХ
' Для Sinus и Cosin предварительно посчитать массивы или
' использовать стандартные функции в радианах

' вычислить 3D-вектор взгляда (коэффициенты подобраны экпериментально)
DirectionLookX = CameraX + Sinus(HorLookDegree) * 100
DirectionLookY = CameraY + Cosin(VertLookDegree) * 500
DirectionLookZ = CameraZ + Cosin(HorLookDegree) * 100
' вычислить новую (левостроннюю!) матрицу для камеры
D3DXMatrixLookAtLH Camera, _
vec3(CameraX, CameraY, CameraZ), _
vec3(DirectionLookX, DirectionLookY, DirectionLookZ), _
vec3(0, 1, 0)

' трансформировать ViewPort
' Разница для модели скорее всего будет - D3DTS_VIEW заменить
' на D3DTS_WORLD

D3DDevice.SetTransform D3DTS_VIEW, Camera
End Sub

Function vec3(x As Single, Y As Single, z As Single) As D3DVECTOR
vec3.x = x
vec3.Y = Y
vec3.z = z
End Function

В SDK по поводу Scale написано много.
Надеюсь, Майкл меня подправит и дополнит!

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 10.10.2003 (Пт) 16:19

С камерой все понятно.
А на счёт World, он касается всех объектов в целом, а мне бы каждый по отдельности.
Где же Майкл, он ведь на DX8 пишет.

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

Сообщение Mikle » 10.10.2003 (Пт) 16:32

World, так же как и Projection, так же как и View относится ко всем объектам. Для трансформаций умножается на нужную матрицу, для восстановления предварительно сохраняется с помощью GetTransform, а потом восстанавливается через SetTransform.
Один из вариантов:
1. Рассчитываем World и отображаем все статичные объекты.
2. Сохраняем World.
3. Для каждого динамичного объекта восстанавливаем World и умножаем на матрицу ДЛЯ ДАННОГО ОБЪЕКТА.

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 10.10.2003 (Пт) 17:01

Ужас то какой! Да, на DX7 было и правда легче, просто пишишь X,Y,Z для объекта и готово. Ну да ладно.
Майкл ты не мог бы примерчик показать?
А то я только недавно начал DX8 юзать, сложновато однако.

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

Сообщение Mikle » 10.10.2003 (Пт) 17:08

В примерах от AntiLoop, которые я уже слал, есть пример с матрицами. Свой пример пришлю к понедельнику.

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 10.10.2003 (Пт) 17:35

Примеры от AntiLoop читал не все, посмотрю.
Буду ждать твой пример...

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

Сообщение Yurich » 10.10.2003 (Пт) 17:43

Mikle писал(а):World, так же как и Projection, так же как и View относится ко всем объектам.

Тут, думаю так: речь о преобразовании из двух матриц - одна касается объекта, вторая - базовой системы к-т. После преобразования первую матрицу заменяем результатом. По идее это не дожно влиять на положение иных объектов (ведь камера у нас двигается сама по себе). Хоп?!

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 10.10.2003 (Пт) 18:09

Урич твоя мысль может и верна, но как бы её воплолтить в жизнь.
Просто если делать игру, без перемещения отдельных объектов не обойтись.

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

Сообщение Mikle » 10.10.2003 (Пт) 18:16

Перемещение камеры и и объекта - это одно и то же с точностью до наоборот. Просто View удобнее использовать для перемещения камеры, а World для объектов. Но того же эффекта можно добиться и обратными действиями (камеру перемещать через World, а объекты через View).

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

Сообщение Yurich » 10.10.2003 (Пт) 19:50

Maxwell писал(а):Урич твоя мысль может и верна, но как бы её воплолтить в жизнь.

Тут еще Сам ни бум-бум, только теоретически, но буду стараться уделять этому время.

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

Сообщение Yurich » 10.10.2003 (Пт) 22:41

Макс! Ну, неохота мне пока ковыряться. Вот пример дельфина от мелкософта. Тут абсолютно все, что надо, только разбирайся. Если будут проблемы с запуском звони сюда
aula@ghost.dn.ua

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 11.10.2003 (Сб) 10:43

Спасибо, попробую разобраться.
Уж не могли разработчики DX8 упростить на жизнь. Разобрались бы сами со своими матрицами и сделали набор стандартных команд для всего этого, как в DX7.

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 11.10.2003 (Сб) 10:52

ОФИГИТЕЛЬНЫЙ пример!
Ты не мог бы ссылочку дать, где примерчики DX от мелкософта валяются.

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 11.10.2003 (Сб) 17:08

Я понял! :D
Перемещение объектов можно осуществлять и без матриц (как в DX7RM было), при помощи перемещения вершин объекта.
Просто создаём свою функцию:

Function Translate(Mesh As D3DXMesh, xPos As Single, yPos As Single, zPos As Single)

Dim count As Long
Dim size As Long
Dim i As Long

Dim verts() As D3DVERTEX

Dim vb As Direct3DVertexBuffer8
Set vb = Mesh.GetVertexBuffer()

size = d3dx.GetFVFVertexSize(Mesh.GetFVF())
count = Mesh.GetNumVertices()

If Mesh.GetFVF() = D3DFVF_VERTEX Then
ReDim verts(count)

D3DVertexBuffer8GetData vb, 0, size * count, 0, verts(0)

For i = 0 To count - 1
verts(i).x = verts(i).x + xPos
verts(i).y = verts(i).y + yPos
verts(i).z = verts(i).z + zPos
Next

D3DVertexBuffer8SetData vb, 0, size * count, 0, verts(0)

End If
End Function

Опа! И всё работает.

И ещё хотел спросить, как бы мне эту функцию в модуль поместить, а то не выходит. Она не может d3dx найти, как мне ссылочку на него сделать. Или мне его и в модуле прописать?

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

Сообщение Yurich » 11.10.2003 (Сб) 19:32

Maxwell писал(а):ОФИГИТЕЛЬНЫЙ пример!
Ты не мог бы ссылочку дать, где примерчики DX от мелкософта валяются.

В SDK!!!
Maxwell писал(а):Или мне его и в модуле прописать?

УГУ! И обязательно PUBLIC.

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 12.10.2003 (Вс) 12:30

Всё равно без матриц не обойтись. Всякое вращение и тому подобное с ними делать надо.
Я тут читал, что DX8, DirectDraw нету. И если я хочу делать игру с применением 2D, то эту 2D графику надо симулировать при помощи 3D. Ну вроде всё понятно. Делаем полигончик на него натягиваем текстуру и все работает. Но, когда два объекта пересекаются, то у них полигоны глючат.

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 12.10.2003 (Вс) 13:17

Да ещё какой мне поставить D3DXMatrixPerspectiveFovLH, что бы никаких искажений в перспективе не было.

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

Сообщение d3drm » 12.10.2003 (Вс) 13:40

Maxwell, где вас учили программировать? Вы представляете КАКАЯ будет потеря в скорости, если вы ее повертексно переносить будете? А поворот? А изменение размеров? Это невозможно же? С матрицами все же просто? Простейший пример:

With Device

D3DXMatrixTranslation Mat, Info.Position.X, Info.Position.Y, Info.Position.Z
.MultiplyTransform D3DTS_WORLD, Mat

D3DXMatrixRotationX Mat, -Info.Rotation.X
.MultiplyTransform D3DTS_WORLD, Mat
D3DXMatrixRotationZ Mat, -Info.Rotation.Z
.MultiplyTransform D3DTS_WORLD, Mat
D3DXMatrixRotationY Mat, -Info.Rotation.Y
.MultiplyTransform D3DTS_WORLD, Mat

UpdateModel

D3DXMatrixRotationY Mat, Info.Rotation.Y
.MultiplyTransform D3DTS_WORLD, Mat
D3DXMatrixRotationZ Mat, Info.Rotation.Z
.MultiplyTransform D3DTS_WORLD, Mat
D3DXMatrixRotationX Mat, Info.Rotation.X
.MultiplyTransform D3DTS_WORLD, Mat

D3DXMatrixTranslation Mat, -Info.Position.X, -Info.Position.Y, -Info.Position.Z
.MultiplyTransform D3DTS_WORLD, Mat

End With

Это тоже не совсем правильно, но это быстрее, чем работать с каждым вертексом! Смотри: переносим весь мир, затем поворачиваем его, затем прорисовываем все вертексы, потом разворачиваем его обратно и переносим на прежнее место. Update Model - всего навсего рендерит полигоны. Все просто!

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

Сообщение Yurich » 13.10.2003 (Пн) 2:35

Maxwell: "Я тут читал, что DX8, DirectDraw нету..."

Там еще много чего нету. Зато он держит штук пять мышей, десяток жопстиков, и еще кучу всякго Г...

Maxwell: когда два объекта пересекаются, то у них полигоны глючат

Только не торопи, трудно все сообразить. Я было пробовал загнать в VB одновременно DX7 и DX8 - он меня послал... значит отпадает. Первым напрашивется вывод, что полигончики во всех случаях должны быть параллельными экрану, а лучше, если для 2Д такой полигон будет один.

Maxwell: ещё какой мне поставить D3DXMatrixPerspectiveFovLH, что бы никаких искажений в перспективе не было.

Тут я точно не понял, о каких искажениях идет речь, но подозреваю, что о тех же, что я писал в теме "Глюконат в DX ..". Как бы это пояснить? А, вот, "Глубина резкости". Зависит от количества плавающих разрядов. Напр., пересечение (сочленение) 2-х плоскостей размерами 1000х1000 отображается с искажениями. Но, если уменьшить размеры на порядок (100х100), то искажения почти не заметны. В то же время 3ДМакс не любит маленьких размеров. Обидно!

d3drm: где вас учили программировать?

Спокойно, только без эмоций. Конкретно меня никто не учил.

d3drm: Вы представляете КАКАЯ будет потеря в скорости, если вы ее повертексно переносить будете?

Считаю, все зависит от конкретной задачи. В некоторой степени ты прав, вращение объекта можно задавать изменением всего лишь двух векторов и решать это матрично. Но ведь не зря мсофт оставил за нами вопросы перемещения и т.п.

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

Сообщение Mikle » 13.10.2003 (Пн) 8:44

http://www.tuapse-mikle.narod.ru/matrix.zip

это обещанный пример, демонстрирует как разными способами добиваться одной и той же трансформации.

Не пойму, почему всем кажется, что матрицы - это усложнение. Нужно поверныть - MatrixRotation, переместить - MatrixTranslation, отразить... много чего. А потом SetTransform или MultiplyTransform, и все! Ведь нас никто не заставляет заполнять матрицу по ячейкам вручную.

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 13.10.2003 (Пн) 18:38

Так ладно, все по порядку.

И так, d3drm, как я понял UpdateModel - это то же, что и .DrawSubset. Если пихать в рендер. Или нет?
По крайней мере всё работает. Но такой способ не совсем подходит если вращаются несколько объектов (каждый куда ему надо).

Yurich: а лучше, если для 2Д такой полигон будет один.
Не совсем понял, что ты имел ввиду. Каким образом он может быть один если у меня несколько спрайтов (каждому свой).

Yurich: Считаю, все зависит от конкретной задачи.
Полностью с тобой согласен. Ведь если мне надо в начальной менюшке к игре, всё раставить по местам. То я могу просто передвинуть вертексты куда мне надо.

Mikle, на пример толком взглянуть не успел. Но каждому обекту надо свою матрицу?

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

Сообщение Yurich » 14.10.2003 (Вт) 3:07

Вопросов много, ответ стоит не одной выкуреной сигаретки!
1. Не существует UpdateModel, это путаница.
2. Я с Майклом не полностью согласен. Способы трансформации моделей в 7 проще. Для вращения достаточно SetRotation или AddRotation, для перемещения SetPosition или SetTransform. Это тоже через матрицы, но их не надо у себя хранить. Если из модели надо отбразить только часть - DeleteChild. Работает быстро. В 8 все решается через DrawSubjet. И чем больше сабжей...никуда не деться от СИ...или, что лучше, делить сцену на части.
3. Оценить скорость DX8VB правильно не могу, т.к. видел только один живой EXE от Майкла, где все, кроме камеры, статично. В мелкософте примеры мелкие.
4. По поводу одного полигона ты сам уже ответил. Еще одна деталь - все примеры DX8 для 2D от мелкософта решены на DX7. Нонсенс!?
5. Каждому - "по матрице" - это точно!
6. Семерка - дело уже гиблое, завершу начатый проект и навсегда забуду.

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 14.10.2003 (Вт) 16:27

Майкл, в твоем примере используется одна матрица, и двигается весь мир. Само разумеется это понятно. А как на счёт нескольких объектов?

Урич, DX7 и правда пора забросить куда подальше.

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

Сообщение Mikle » 14.10.2003 (Вт) 16:42

Сразу скажу - DX7 не знаю, сужу по названиям. Разве
SetTransform не есть то же, что SetRotation (или SetPosition), а MultiplyTransform - то же, что AddRotation (или AddPosition).

Да, для каждого НЕЗАВИСИМО ДВИЖУЩЕГОСЯ объекта нужна своя матрица, но например, озображая машину, загоняем в World позицию кузова (пусть камера у нас в View). Дальше, чтобы отобразить колесо, достаточно домножить World на матрицу вращения колеса ОТНОСИТЕЛЬНО МАШИНЫ, что проще, чем задавать матрицу колеса с нуля.

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

Сообщение d3drm » 14.10.2003 (Вт) 20:48

MAXWELL:
И так, d3drm, как я понял UpdateModel - это то же, что и .DrawSubset. Если пихать в рендер. Или нет?
По крайней мере всё работает. Но такой способ не совсем подходит если вращаются несколько объектов (каждый куда ему надо).

Да, updatemodel - процедура, в которой как раз и содержится верь рендеринг. А если че не работает с вращающимися объеектами - то это вина моего кривого когда, который я впихнул впопыхах. Дело в том, что выдран он из старого примера загрузки MD2, а там модель загружалась повернутой как-то по кривому. След. была особенная процедура рендеринга, но я думал, что ее правильно исправил. Попробуй расставить прокрутки матриц по X Y Z в алфавитном порядке, а не как в примере.

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 15.10.2003 (Ср) 8:48

d3drm
Твой пример очень удобный просто когда я вставлял код, обрезал его, вставлял другие штуки, как Scale.
Я допустил ошибку:
У меня сначало стоял Rotate, а потом уже Translation. И получалось что первым вращался мир, а не сам объект вогруг своей оси.

Maxwell
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 182
Зарегистрирован: 01.10.2003 (Ср) 15:48
Откуда: Russia

Сообщение Maxwell » 15.10.2003 (Ср) 17:35

Я хочу на экране написать текс. В D3DX есть такая штука. Но у меня, что то невыходит, как она работает?

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

Сообщение d3drm » 15.10.2003 (Ср) 21:54

В декларации:
Public MainD3DFont As D3DXFont

Затем инициализация:

Sub InitSystemFont()
Dim TempFont As New StdFont
Dim FontDesc As IFont
TempFont.Name = "MS Sans Serif"
TempFont.Size = 8
Set FontDesc = TempFont
Set MainD3DFont = D3DX.CreateFont(Device, FontDesc.hFont)
Set TempFont = Nothing
Set FontDesc = Nothing
End Sub


Я использую это для вывода FPS:

Public Sub Flip()

If DisplayFPS Then
Dim TextRect As RECT
TextRect.Top = 10
TextRect.Left = 10
D3DX.DrawText MainD3DFont, -244, "FPS: " & ComputeFPS, TextRect, DT_TOP Or DT_LEFT
End If
Device.Present ByVal 0, ByVal 0, 0, ByVal 0
End Sub

процедура переноса изображения на передний буффер. Если отображать FPS, то... сам думаю поймешь...

Все просто!

З.Ы. ComputeFPS - отдельная процедура и к делу отношения не имеет.

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

Сообщение Mikle » 16.10.2003 (Чт) 8:21

Вот рабочий пример:
http://www.tuapse-mikle.narod.ru/dxfont.zip
но dxfont - штука тормозная, лучше готовить текстуру со своим шрифтом, или использовать dxfont не в BackBuffer, а в текстуру.

След.

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

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

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

    TopList