Получения списка треугольников из D3DXMesh без IndexBuffer'а

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

Модератор: Mikle

StimorolD3DX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 293
Зарегистрирован: 03.04.2007 (Вт) 18:19
Откуда: Kiev city

Получения списка треугольников из D3DXMesh без IndexBuffer'а

Сообщение StimorolD3DX » 13.01.2008 (Вс) 18:53

Привет. Суть вопроса такова:
У меня есть D3DXMesh. Мне нужно получить список его треугольников.
Для этого я пишу следующее:

Код: Выделить всё
Set vBuf = MyModel.GetVertexBuffer
D3DVertexBuffer8GetData vBuf, 0&, vCount * vSize, D3DLOCK_DISCARD, Vert(0&)


Но, при попытке нарисовать содержимое массива Vert строкой
Код: Выделить всё
D3DDevice.DrawPrimitiveUP D3DPT_TRIANGLELIST, UBound(Vert) / 3, Vert(0), vSize
Получается совсем не то что нужно, может надо еще и получать IndexBuffer Из D3DXMesh? В результате мне нужен список треигольников (именно TriangleList) который я бы мог рисовать без IndexBuffer'а. Спасибо.
Последний раз редактировалось StimorolD3DX 13.01.2008 (Вс) 20:07, всего редактировалось 1 раз.

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

Сообщение Mikle » 13.01.2008 (Вс) 19:55

StimorolD3DX
Нужно брать IndexBuffer, по нему извлекать из VertexBuffer-а вертексы и загонять их в свой буфер, он получится почти втрое больше, чем в меше.

StimorolD3DX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 293
Зарегистрирован: 03.04.2007 (Вт) 18:19
Откуда: Kiev city

Сообщение StimorolD3DX » 13.01.2008 (Вс) 20:04

Попробовал получить буфер индексов следующим способом:
Код: Выделить всё
Dim Ind() As Long
ReDim Ind(vCount - 1)
Set iBuf = mModel.Model.GetIndexBuffer
D3DIndexBuffer8GetData iBuf, 0&, vCount, D3DLOCK_DISCARD, Ind(0&)

Но в полученном массиве Ind находятся приблизительно следующие елементы:
1203
254028
12336
и тд.

Вообщем большые числа явно не указывающие на елементы VertexBuffer'а. Может я в чем ошибся?

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

Сообщение Mikle » 14.01.2008 (Пн) 11:17

StimorolD3DX
Индексы, скорее всего, не Long, а Integer.

StimorolD3DX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 293
Зарегистрирован: 03.04.2007 (Вт) 18:19
Откуда: Kiev city

Сообщение StimorolD3DX » 14.01.2008 (Пн) 11:54

Спасибо, помогло. И еще в функции D3DIndexBuffer8GetData место vCount какой аргумент нужно подставлять, ведь количество индексов больше чем вертексов?

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

Сообщение Mikle » 14.01.2008 (Пн) 17:45

StimorolD3DX
Кол-во треугольников, умноженное на 3.

StimorolD3DX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 293
Зарегистрирован: 03.04.2007 (Вт) 18:19
Откуда: Kiev city

Сообщение StimorolD3DX » 14.01.2008 (Пн) 18:37

Видать гдето у меня ошибка.

Вот как мою модель показивает MeshView из DXSDK:
http://www.gamedev.ru/download/file.php?id=6621

А вот как он виглядит в моей сцене:
http://www.gamedev.ru/download/file.php?id=6622

Вот код:
Код: Выделить всё
    vCount = mModel.Model.GetNumVertices
   
    ReDim Vert(vCount - 1)
    vSize = Len(Vert(0))
   
    Set vBuf = mModel.Model.GetVertexBuffer
    D3DVertexBuffer8GetData vBuf, 0&, vCount * vSize, D3DLOCK_READONLY, Vert(0&)
   
    Dim Ind() As Integer
    ReDim Ind(vCount * 3)
    Set iBuf = mModel.Model.GetIndexBuffer
    D3DIndexBuffer8GetData iBuf, 0&, vCount * 3, D3DLOCK_READONLY, Ind(0&)
   
    ReDim V(vCount * 3)
    For i = 0 To UBound(V)
        V(i) = Vert(Ind(i))
    Next i

"V" - это окончательный массив с вершинами.
Я вот подумал а может в D3DXMesh находятся еще и TriangleStrip или TriangleFan и их прийдется конвертировать?

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

Сообщение Mikle » 14.01.2008 (Пн) 20:11

StimorolD3DX
ReDim V(vCount * 3 - 1)

StimorolD3DX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 293
Зарегистрирован: 03.04.2007 (Вт) 18:19
Откуда: Kiev city

Сообщение StimorolD3DX » 14.01.2008 (Пн) 20:54

Mikle
Не помогло

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

Сообщение Mikle » 15.01.2008 (Вт) 11:15

StimorolD3DX
Я писал:
Кол-во треугольников, умноженное на 3
А vCount, судя по названию - кол-во вертексов.

StimorolD3DX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 293
Зарегистрирован: 03.04.2007 (Вт) 18:19
Откуда: Kiev city

Сообщение StimorolD3DX » 15.01.2008 (Вт) 11:20

Извини ошибся, исправил но эфект тот же.

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

Сообщение Mikle » 18.01.2008 (Пт) 19:55

Странно, у меня получилось. :roll:
У вас нет доступа для просмотра вложений в этом сообщении.

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

Сообщение Mikle » 19.01.2008 (Сб) 18:35

StimorolD3DX
А зачем это? Ведь так медленнее и памяти больше расходуется.

StimorolD3DX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 293
Зарегистрирован: 03.04.2007 (Вт) 18:19
Откуда: Kiev city

Сообщение StimorolD3DX » 19.01.2008 (Сб) 19:06

Mikle
Спасибо за пример.
Хочу что бы PhysX обрабатывал мои модельки, а ему нужно подавать только списки треугольников.

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

Сообщение Mikle » 19.01.2008 (Сб) 19:25

StimorolD3DX
Тогда выкинь предварительно из вертекса все лишнее (CloneMesh), оставь только XYZ.

StimorolD3DX
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 293
Зарегистрирован: 03.04.2007 (Вт) 18:19
Откуда: Kiev city

Сообщение StimorolD3DX » 20.01.2008 (Вс) 20:39

А как использовать CloneMesh и чем он лучше?


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

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

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

    TopList  
cron