|
20.12.2011, 17:17
|
#1
|
ПроЭктировщик
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений (для 18 пользователей)
|
DirectX 9 доступ к вершинам объекта
Столь долгое время прошло после моего перерыва в программировании игр да и вообще программирования.
Вот решил взяться. И опять нашел, в принципе как всегда, для себя проблему, банальную. Как получить доступ к вершинам сетки объекта что бы с ними можно было производить расчеты?
PS В основном это нужно для определения столкновения игрока с миром.
Если кто-то знает еще сам алгоритм определения столкновения, то расскажите мне про него по подробнее.
|
(Offline)
|
|
20.12.2011, 17:49
|
#2
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: DirectX 9 доступ к вершинам объекта
храни отдельно, чтобы быстро достучаться, а так lock unlock, так же как и создание.
|
(Offline)
|
|
20.12.2011, 18:22
|
#3
|
ПроЭктировщик
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений (для 18 пользователей)
|
Ответ: DirectX 9 доступ к вершинам объекта
Ниче не понял
Суть в том что когда я загружаю x-mesh мне надо каким-то образом поместить информацию(x,y,z,n - к примеру) о вершинах, треугольниках в массив, чтобы в дальнейшем эту информацию использовать для определения столкновений.
Приведите пример команды или определенного алгоритма через который можно загрузить инф. о верш. в массив.
Добавлено:
Как я могу работать с вершинами объекта(перемещение и др.)?
Последний раз редактировалось Mind, 20.12.2011 в 20:25.
|
(Offline)
|
|
20.12.2011, 21:38
|
#4
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: DirectX 9 доступ к вершинам объекта
перемещается мировая матрица а не вершины объекта! Думаю стоит не сэмплы смотреть, а почитать умную книжку, и все встанет на свои места.
IDirect3DVertexBuffer9* vb = 0;
Mesh->GetVertexBuffer(&vb);
потом делать буферу lock, тебе нужно будет вытаскивать в структуру FVF, ее тоже из D3DXMESH можно получить
IDirect3DIndexBuffer9* ib = 0;
Mesh->GetIndexBuffer(&ib);
по перемещениям
D3DXMATRIX cObject::GetTransformMatrix()
{
D3DXMATRIX pos,rx,ry,rz,scal;
D3DXMatrixScaling(&scal,scale[0],scale[1],scale[2]);
//D3DXMatrixRotationYawPitchRoll(&pos,rotation[1],rotation[0],rotation[2]);
D3DXMatrixRotationX(&rx,utils::RadToDeg(rotation[0]));
D3DXMatrixRotationY(&ry,utils::RadToDeg(rotation[1]));
D3DXMatrixRotationZ(&rz, utils::RadToDeg(rotation[2]));
D3DXMatrixTranslation(&pos,position[0],position[1],position[2]);
return scal * rx * ry * rz * pos;
}
void cObject::SetWorldMatrix()
{
D3DXMATRIX mat = GetTransformMatrix();//получаем матрицу тек объекта
pDevice->SetTransform(D3DTS_WORLD, &mat); //делаем текущей
}
Для колизий используй bullet кпримеру.
а вообще почитай http://www.netlib.narod.ru/library/book0032/ch10_01.htm книга супер, сам читал
|
(Offline)
|
|
20.12.2011, 22:42
|
#5
|
ПроЭктировщик
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений (для 18 пользователей)
|
Ответ: DirectX 9 доступ к вершинам объекта
Матрицы я знаю. Мне надо тупо знать координаты каждой вершины. Это возможно.
Если я хочу к примеру сравнить:
if (vertex1<vertex2){collision=1;};
мне надо знать значение/координаты этих вершин.
1)Как скажем мне в переменную занести информацию о вершине?
2)Как изменить координаты одной любой вершины. Напишите пример если не трудно.
Пока не хочу использовать сторонние библиотеки такие как bullet,wrapper etc. Хочу написать свою физику примитивную.Глядишь и получится
|
(Offline)
|
|
20.12.2011, 22:46
|
#6
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: DirectX 9 доступ к вершинам объекта
IDirect3DVertexBuffer9* vb = 0;
Mesh->GetVertexBuffer(&vb);
потом делать буферу lock, тебе нужно будет вытаскивать в структуру FVF, ее тоже из D3DXMESH можно получить
IDirect3DIndexBuffer9* ib = 0;
Mesh->GetIndexBuffer(&ib);
и изменяй вершины и получай данные
пример
Vertex* vertices;
_vb->Lock(0, 0, (void**)&vertices, 0); // заблокировать весь буфер
vertices[0] = Vertex(-1.0f, 0.0f, 2.0f); // записать данные вершин
vertices[1] = Vertex( 0.0f, 1.0f, 2.0f); // в буфер
vertices[2] = Vertex( 1.0f, 0.0f, 2.0f);
_vb->Unlock(); // разблокировать буфер, когда
// мы закончили работать с ним
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
22.12.2011, 15:26
|
#7
|
ПроЭктировщик
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений (для 18 пользователей)
|
Ответ: DirectX 9 доступ к вершинам объекта
Я так понял ты работаешь, в данном примере, с временным буфером вершин(vb) и изменяешь его значения, а как потом их применить буферу моей модели?
|
(Offline)
|
|
22.12.2011, 15:35
|
#8
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: DirectX 9 доступ к вершинам объекта
Это не временный буфер, а фактически буфер из видео карты, изменяя его изменится и изображение.
|
(Offline)
|
|
23.12.2011, 13:12
|
#9
|
ПроЭктировщик
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений (для 18 пользователей)
|
Ответ: DirectX 9 доступ к вершинам объекта
struct Vertex
{
float x,y,z;
};
IDirect3DVertexBuffer9* vb1 = 0;
Mesh->GetVertexBuffer(&vb1);
Vertex* vertices;
vb1->Lock(0, 0,(void**)&vertices, 0); // заблокировать весь буфер
vertices[0] = Vertex(-1.0f, 0.0f, 2.0f); пишет что не может преобразовать из float в Vertex.
vertices[1] = Vertex( 0.0f, 1.0f, 2.0f); --//--
vertices[2] = Vertex( 1.0f, 0.0f, 2.0f); --//--
vb1->Unlock(); //разблокировать буфер
Сделал как ты говорил. Не получается. Возможно я где-то со структурой вершин намудрил. Не пойму.
Нашел другой способ изменения координат вершин:
vb1->Lock(0, 0,(void**)&vertices, 0); // заблокировать весь буфер
vertices[0].x=10;vertices[0].y=20;vertices[0].z=-5;
vertices[1].x=15;vertices[1].y=30;vertices[1].z=-10;
vertices[2].x=20;vertices[2].y=40;vertices[2].z=-15;
vb1->Unlock(); //разблокировать буфер
Но есть пару замечаний:
1) Как можно считать информацию о вершинах?
2) Как я заметил каждая вершина имеет свою сист. координат. Почему. Как это исправить?
|
(Offline)
|
|
23.12.2011, 15:31
|
#10
|
☭
Регистрация: 26.09.2006
Сообщений: 6,035
Написано 1,474 полезных сообщений (для 2,707 пользователей)
|
Ответ: DirectX 9 доступ к вершинам объекта
struct Vertex
{
float x,y,z;
Vertex(float x_,float y_, float z_):x(x_),y(y_),z(z_){}
};
а так?
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
23.12.2011, 17:28
|
#11
|
ПроЭктировщик
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений (для 18 пользователей)
|
Ответ: DirectX 9 доступ к вершинам объекта
Так получилось. А что ты конкретно сделал, а то я уже подзабыл что это значит?
ЗЫ:
1) Как можно считать информацию о вершинах?
2) Как я заметил каждая вершина имеет свою сист. координат. Почему. Как это исправить?
|
(Offline)
|
|
23.12.2011, 18:32
|
#12
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: DirectX 9 доступ к вершинам объекта
Сообщение от Mind
Так получилось. А что ты конкретно сделал, а то я уже подзабыл что это значит?
ЗЫ:
1) Как можно считать информацию о вершинах?
2) Как я заметил каждая вершина имеет свою сист. координат. Почему. Как это исправить?
|
Причем тут система координат, каждая вершина имеет x,y,z в пространстве. Что бы считать инфу из d3dxmesh нужно иметь примерно такую структуру
struct Vertex
{
float pos[3];
float normals[3];
float texcoord1[2];
Vertex(float x, float y, float z, float nx, float ny, float nz, float u, float v){
pos[0] = x; pos[1] = y; pos[2] = z;
normals[0] = nx; normals[1] = ny; normals[2] = nz;
texcoord1[0] = u; texcoord1[1] = v;
}
};
это не факт, в зависимости от того какой там FVF.
|
(Offline)
|
|
23.12.2011, 18:42
|
#13
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: DirectX 9 доступ к вершинам объекта
попробуй так
LPD3DXMESH MeshTemp ;
oldMesh->CloneMeshFVF( D3DXMESH_WRITEONLY |
D3DXMESH_NPATCHES |
(oldMesh->GetOptions() & D3DXMESH_32BIT),
D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1, d3d_Device, &MeshTemp );
там может быть D3DFVF_TEX0 , не помню
и работай уже с MeshTemp
код не проверял но идея такова
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
23.12.2011, 23:42
|
#14
|
ПроЭктировщик
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений (для 18 пользователей)
|
Ответ: DirectX 9 доступ к вершинам объекта
Причем тут система координат, каждая вершина имеет x,y,z в пространстве.
|
Хорошо, допустим я считал координаты вершины и вывел на экран при позиции объекта(0,0,0), а потом при позиции - 10,10,10; и коорд. вершины остались теми же. Получается (не каждая вершина как я говорил) объект имеет свои лок. коорд. в которых находятся вершины. ДА?
|
(Offline)
|
|
23.12.2011, 23:57
|
#15
|
Мастер
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений (для 533 пользователей)
|
Ответ: DirectX 9 доступ к вершинам объекта
Объясняю. Вершины не меняются, если ты просто хочешь передвигать, вращать, масштабировать объект. Меняется мировая матрица.
Например куб, имеет 8 вершин, описаны позиции в диапазонах от -1, до 1 по xyz. Я хочу вывести 3 куба в разных положениях. Я не меняю вершины этого куба, я перед отрисовкой каждого поставляю матрицу. У первого у меня будет d3dxmatrixtranslate одно , у второго другое у третьего третье. Заметь к вершинам я и не прикасался
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 20:04.
|