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

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

Модератор: Mikle

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

Сообщение Maxwell » 16.10.2003 (Чт) 19:28

И правда, при прибавлении символа, скорость падает на глазах.
Ладно с текстом потом разбурусь. Сейчас меня интересует одна вещь: как мне, так сказать копировать объекты.
Что бы рендерилось определённое их число я прописываю:

For i = 0 To NumMesh
Mesh.DrawSubset (i)
Next i

Где NumMesh - количество объектов, само разумеется.
Но мне бы каждому новому объектику свою позицию задать? Ато я что то запутался. Да кстате для перемещения объекта пользуюсь способом, предложеным d3drm.

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

Сообщение Mikle » 17.10.2003 (Пт) 14:21

For i = 0 To NumMesh
d3dDevice.SetTransform D3DTS_WORLD, Matrix(i)
Mesh.DrawSubset (i)
Next i

Чтобы переместить соответствующий Subset - меняй соответствующую матрицу. Например:
D3DXMatrixTranslation Matrix(N), DX, DY, DZ
установит новую позицию для N-ного Subset-а.

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

Сообщение Maxwell » 20.10.2003 (Пн) 17:41

Отбросим в сторону матрицы с ними всё ясно.
К примеру при нажатии на клавишу мне надо, то бы задавалось новое значение переменной >
N = N + 1
XPos (N) = PlayerXPos

XPos - нужная переменная
N - индекс переменной
---------------------------------------------
И тепепь, что бы каждому новому объекту принадлежало свое значение XPos

For i = 0 To N - 1

'Перемещает матрицу на свой XPos
D3DXMatrixTranslation MatWorld, XPos(N), 0, 0
d3dDevice.MultiplyTransform D3DTS_WORLD, MatWorld

'Прорисовываем Mesh
Mesh.DrawSubset (N)

'Премещает матрицу обратно
D3DXMatrixTranslation MatWorld, -XPos(N), 0, 0
d3dDevice.MultiplyTransform D3DTS_WORLD, MatWorld

Next N
---------------------------------------------
Как бы это так сделать, мне непонятно одно: как правильно всё прописать, при нажатии клавиши?

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

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

Мах, подробнее, что задумал? Для игроков я бы сразу в модуле создал описание, например:
Public Type GamePlayer
GamerName As String
GamerCurrentXPos As Long
GamerXSpeed As Long
GamerTransMatrix As D3DMATRIX
.... и тому подобное
End Type
Public Const GamersCount= ‘число игроков
Public Player(1 to GamersCount) As GamePlayer
Массив структур легче обрабатывать чем каждый элемент.
Нет смысла в одном проходе рендера транслировать матрицу туда и обратно, просто за один кадр этих перемещений не увидишь. D3DXMatrixTranslation
надо вынести за пределы цикла прорисовки и вызывать по нажатию (и/или отпусканию) клавы.
Sub Form_KeyDown(...
If KeyCode=VbKeyRight
With GamePlayer(N)
.GamerCurrentXPos=.GamerCurrentXPos + .GamerXSpeed
D3DXMatrixTranslation .GamerTransMatrix, .GamerCurrentXPos, 0, 0
End With
End If
End Sub

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

Сообщение Maxwell » 20.10.2003 (Пн) 20:36

Моя твоя не понимать. Ну да ладно.

А теперь поподробнее, как и просил.
Мне надо что бы игрок стрелял и каждая новая пуля получала свою позиции. На счёт перемещения не беспокойся, мне главное пока позиция.

По матрицам: перемещение матриц туда, обратно - все работает. И ты прав, что за один кадр этого перемещения невидно. Это и нужно. Матрица перемещается куда надо, прорисовывает нужный объект и возвращается обратно. Получается, движение объекта. Я пихаю этот код в модуль и потом в рендере хватает одной строчки.

Что я хотел сказать в прошлом сообщении? > Как мне правильно прописать, что бы каждой новой переменной (XPos) значение PlayerXPos устанавливалось?

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

Сообщение Yurich » 21.10.2003 (Вт) 0:08

Соломы пока хватило предположить, что XPos - дин.массив и нельзя удалить (изменить) предыдущие значения, если так, то
N=N+1
ReDim Preserve XPos(N)
XPos(N) = PlayerXPos

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

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

Если использовать постоянно ReDim - будет тормозить. Нужен статический массив. При каждом выстреле двигаем по массиву указатель iP на последнюю пулю:
Код: Выделить всё
  iP=iP+1: If iP>=MaxP then iP=0

потом
Код: Выделить всё
  XPos(iP)=PlayerXPos

а в цикле рендера:
Код: Выделить всё
  For n=0 to MaxP-1
    If pEnable(n) then DrawP(n)
  next n

то есть если пуля существует, pEnable=True, как попала в стену - False. pEnable - булевский массив по максимальному кол-ву пуль. DrawP - рисование пули.
И еще, World лучше восстанавливать не умножением на MatrixTranslation с отрицательным XPos, а один раз сохранить в матрицу через GetTransform, а потом восстанавливать через SetTransform. GetTransform не перед каждой пулей, а ОДИН раз перед первой пулей.

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

Сообщение Maxwell » 21.10.2003 (Вт) 18:08

Спасибо Yurich!
Всё работает, у меня была ошибка в том, что я писал просто: ReDim XPos(N)
И ещё, скажи пожалуйста:
В чём разница между ReDim и ReDim Preserve?

Mikle, на счёт матрицы ты прав, меньше лишних движений.
Я пробую сделать простую 2D игру, так что пока с ReDim. Если будет лагать, сделаю как ты говоришь.

И ещё насчёт 2D. Какое мне поставить отдаление камеры от центра так, что бы на экране было 1024x768 пикселей?
Может не ясно объяснился, если не поймёте, постараюсь перефразировать.

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

Сообщение Yurich » 21.10.2003 (Вт) 23:11

Maxwell писал(а):разница между ReDim и ReDim Preserve?

Первый уничтожает весь ранее созданый массив, второй изменяет размерность массива не затрагивая уже существующие значения.

Maxwell писал(а):Какое мне поставить отдаление камеры от центра так, что бы на экране было 1024x768 пикселей?


Задача не из простых (ведь 2D через 3D)! Если чисто по математике
(a и b - катеты треугольника, A - угол противолежащий катету а)

b=a/tgA.

Решение можно упростить, предположив, что в стандартных видережимах соотношение сторон 1.333:1, отсюда (a - длина поверхности, b - высота, Z - координата камеры, tg45=1):

а=1024
b=768
Z=-a/2 или Z=-b*1.333/2

Это только при условии,что поверхность лежит в начале 3D координат и директ держит углы растрирования по вертикали и горизонтали по 90 град (они програмно меняются, это точно, но какие реально не знаю).
Для начала я бы попробовал методом тыка, начиная от Z=-512. Его лучше изменять динамически в программе и для каждого режима подобрать отимальное значение.

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

Сообщение Mikle » 22.10.2003 (Ср) 14:41

Для 2D и изометрии существует D3DFVF_XYZRHW. Тогда расстояние от камеры не имеет значения.

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

Сообщение Maxwell » 22.10.2003 (Ср) 19:59

Что то неувязица.
После того, как Z становиться больше определённого числа объекты пропадоют!?

Mikle, где прописывать D3DFVF_XYZRHW?

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

Сообщение Mikle » 23.10.2003 (Чт) 8:53

Код: Выделить всё
 
  Public Const FVF_World = (D3DFVF_XYZRHW Or D3DFVF_DIFFUSE Or D3DFVF_TEX1)
.....
  d3dDevice.SetVertexShader FVF_World

После того, как Z становиться больше определённого числа объекты пропадоют!?

Вероятно они уходят за границы, заданные в MatrixProjection.

Cremator
Начинающий
Начинающий
 
Сообщения: 20
Зарегистрирован: 03.02.2003 (Пн) 12:14

Сообщение Cremator » 24.10.2003 (Пт) 14:09

Писать 2d через полигоны и текстуры - гиблое дело. Лучше покрути интерфейс D3DXSprite - там есть всё, что нужно. Заодно рекомендую почитать про этот интерфейс на Gamedev.net, если с C++ всё хорошо.
Там описаны некоторые глюки этого интерфейса, с которыми обязательно столкнёшся при использовании, и способы борьбы с ними.

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

Сообщение Maxwell » 24.10.2003 (Пт) 17:34

Cremator, 2d делать через полигоны и тектуры не так то и сложно. Потому что, не надо ведь создавать свой полигон для гаждого объекта. Просто рендерим тот же полигон со своей текстурой и размерами. Темболее, во многих документациях утверждают, что при этом, выигрываешь в скорости.

Yurich, что то катеты, не "катят". -1024 / 2 не подходит, ставить надо на много больше. Не исключаю тот факт, что у мня в матрице малость не те параметры стоят. И даже когда более менее подбиваешь, получается не правильное соотношение ширины и высоты.
Какие значения в D3DXMatrixPerspectiveFovLH выставлять нужно? А то если ставить, как написано в примерах от AntiLoop, объекты приплюснутые получаются. Так, что Aspect я методом тыка подобрал.

Mikle, что вобше должно получиться при выставлении D3DFVF_XYZRHW?

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

Сообщение Mikle » 25.10.2003 (Сб) 11:14

Получится изометрическая проекция, когда предметы, отдаляясь, не уменьшаются, а координаты X и Y соответствуют экранным координатам в пикселях. Z продолжает работать - определяет какой объект какой перекрывает, если включен Zbuffer. Вот, вставь в код пустой формы и посмотри:
Код: Выделить всё
Option Explicit

Dim dx As New DirectX8
Dim d3d As Direct3D8
Dim d3dDevice As Direct3DDevice8
Dim pVB As Direct3DVertexBuffer8

Dim Running As Boolean

Private Type CUSTOMVERTEX
  X As Single
  Y As Single
  Z As Single
  RHW As Single
  Color As Long
End Type

Private Const D3DFVF_CUSTOMVERTEX = (D3DFVF_XYZRHW Or D3DFVF_DIFFUSE)

Private Sub Form_Activate()
InitD3D
Running = True
Do While Running
Render
Loop
End
End Sub

Private Sub Form_KeyPress(KeyAscii As Integer)
Running = False
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Set pVB = Nothing
Set d3dDevice = Nothing
Set d3d = Nothing
End Sub

Private Sub InitVB1()
Dim Vertices(3) As CUSTOMVERTEX

With Vertices(0): .X = 50: .Y = 50: .Z = 0.5: .RHW = 1: .Color = &HFFFF0000: End With
With Vertices(1): .X = 150: .Y = 150: .Z = 0.5: .RHW = 1: .Color = &HFF00FF00: End With
With Vertices(2): .X = 50: .Y = 150: .Z = 0.5: .RHW = 1: .Color = &HFF00FFFF: End With

Set pVB = d3dDevice.CreateVertexBuffer(3 * Len(Vertices(0)), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT)
Call D3DVertexBuffer8SetData(pVB, 0, Len(Vertices(0)) * 3, 0, Vertices(0))

End Sub

Private Sub Render()
Dim v As CUSTOMVERTEX
Dim sizeOfVertex As Long

DoEvents

sizeOfVertex = Len(v)

Call d3dDevice.Clear(0, ByVal 0, D3DCLEAR_TARGET, &H7F007F, 1, 0)
Call d3dDevice.BeginScene

InitVB1

Call d3dDevice.SetStreamSource(0, pVB, sizeOfVertex)
Call d3dDevice.SetVertexShader(D3DFVF_CUSTOMVERTEX)
Call d3dDevice.DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1)

Call d3dDevice.EndScene

Call d3dDevice.Present(ByVal 0, ByVal 0, 0, ByVal 0)
End Sub

Private Sub InitD3D()
Dim DispMode As D3DDISPLAYMODE
Dim d3dpp As D3DPRESENT_PARAMETERS

Set d3d = dx.Direct3DCreate
Call d3d.GetAdapterDisplayMode(D3DADAPTER_DEFAULT, DispMode)

d3dpp.Windowed = True
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD
d3dpp.BackBufferFormat = DispMode.Format
Set d3dDevice = d3d.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Me.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp)

End Sub

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

Сообщение Maxwell » 25.10.2003 (Сб) 11:37

С примитивами всё работает. В DX8 ещё не совсем бум-бум:
Как бы это привязать к объектам (*.X)?
И будут ли работать матрицы относительно координат экрана? Ведь я объекты при помощи их предвигаю.

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

Сообщение Mikle » 25.10.2003 (Сб) 17:23

Должно работать все, изменяется только режим работы камеры. Хотя я X-файлы, честно говоря, не пробовал в этом режиме.

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

Сообщение Mikle » 26.10.2003 (Вс) 16:03

Специально попробовал - просто так не выходит. Дело в том, что МЕШ сам устанавливает формат вертекса, и в строке:
Код: Выделить всё
d3dDevice.SetVertexShader FVF_World

не нуждается, а если есть - игнорирует. Видимо нужно сразу создавать МЕШ с соответствующим вертекс-форматом.

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

Сообщение Maxwell » 26.10.2003 (Вс) 16:24

Понятно.

Где же Урич, хочу узнать, что он про мое сообщенние думает(о катетах и соотношение ширины и высоты).

Mikle, какие у тебя мысли насчёт этого? Какие значения в D3DXMatrixPerspectiveFovLH выставлять нужно? Что бы объекты не приплюснутые были.

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

Сообщение Mikle » 26.10.2003 (Вс) 16:33

Камера как можно дальше - угол, соответственно, меньше. Задай небольшой угол, скажем 0.1 (в радианах), а регулируй размеры, изменяя расстояние от камеры да сцены.

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

Сообщение Maxwell » 26.10.2003 (Вс) 17:22

У меня теперь другой баг.
Я пихаю в модуль функцию которая будет перемещать объекты.
Пчему когда стоит d3dDevice.MultiplyTransform D3DTS_WORLD, MatWorld - всё нормально.
А когда я ставлю d3dDevice.SetTransform - всё вылетает?

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

Сообщение Yurich » 26.10.2003 (Вс) 18:39

Провайдер, блин, задолбал! Три дня не мог войти. В понед. пойду жаловаться: "Пожалуйста, помед..ле..ннее, я запис..с..сываю". Только немного осмотрюсь.

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

Сообщение Maxwell » 30.10.2003 (Чт) 8:26

Урич, ты так и не осматрелся, жду ответа?

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

Сообщение Yurich » 31.10.2003 (Пт) 21:32

Maxwell писал(а):Урич, ты так и не осматрелся, жду ответа?

Фух... трудно что-нить конкретное посоветить. До середины февраля должен закончить семерошный проект. К тому же ВЫ так далеко убежали!
Для углов растрирования в 7 две функции:
ViewPort.SetPlane
ViewPort.SetUniformScaling
В 8 то же "нечто" подобное (не уверен!)
D3DXMatrixScaling(MOut As D3DMATRIX, x As Single, y As Single, z As Single).
Макс, не мешало бы взглянуть на твою работу. На усмотрение (в пределах 2 Мв) aula@ghost.dn.ua

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

Сообщение Maxwell » 02.11.2003 (Вс) 20:57

Если "ВЫ" - это обращение ко мне то давай будем на ты, так проще.
На счёт моей работы, так она даже не работа, я просто пока осваиваю азы DX8. Уже довольно неплохо в нём разбираюсь. Но возникают всё новые вопросы, с которыми пытаюсь бороться.
А о чём собственно твой проект? Поделись если не секрет.

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

Сообщение Yurich » 03.11.2003 (Пн) 18:06

Maxwell писал(а):Если "ВЫ" - это обращение ко мне то давай будем на ты, так проще.
На счёт моей работы, так она даже не работа, я просто пока осваиваю азы DX8. Уже довольно неплохо в нём разбираюсь. Но возникают всё новые вопросы, с которыми пытаюсь бороться.
А о чём собственно твой проект? Поделись если не секрет.

ВЫ-это обо всех! Моя профессия - преподаватель, потому и проект учебного характера, точнее тренажер. Передыдущий уже пустил в продажу.

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

Сообщение Maxwell » 03.11.2003 (Пн) 19:07

Могу только поздравить :D

Пред.

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

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

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

    TopList