forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   DirectX 9 доступ к вершинам объекта (http://forum.boolean.name/showthread.php?t=16065)

Mind 20.12.2011 17:17

DirectX 9 доступ к вершинам объекта
 
Столь долгое время прошло после моего перерыва в программировании игр да и вообще программирования.

Вот решил взяться. И опять нашел, в принципе как всегда, для себя проблему, банальную. Как получить доступ к вершинам сетки объекта что бы с ними можно было производить расчеты?

PS В основном это нужно для определения столкновения игрока с миром.

Если кто-то знает еще сам алгоритм определения столкновения, то расскажите мне про него по подробнее.

pozitiffcat 20.12.2011 17:49

Ответ: DirectX 9 доступ к вершинам объекта
 
храни отдельно, чтобы быстро достучаться, а так lock unlock, так же как и создание.

Mind 20.12.2011 18:22

Ответ: DirectX 9 доступ к вершинам объекта
 
Ниче не понял :dontknow:


Суть в том что когда я загружаю x-mesh мне надо каким-то образом поместить информацию(x,y,z,n - к примеру) о вершинах, треугольниках в массив, чтобы в дальнейшем эту информацию использовать для определения столкновений.
Приведите пример команды или определенного алгоритма через который можно загрузить инф. о верш. в массив.

Добавлено:
Как я могу работать с вершинами объекта(перемещение и др.)?

pozitiffcat 20.12.2011 21:38

Ответ: 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 книга супер, сам читал

Mind 20.12.2011 22:42

Ответ: DirectX 9 доступ к вершинам объекта
 
Матрицы я знаю. Мне надо тупо знать координаты каждой вершины. Это возможно.
Если я хочу к примеру сравнить:
if (vertex1<vertex2){collision=1;};
мне надо знать значение/координаты этих вершин.
1)Как скажем мне в переменную занести информацию о вершине?
2)Как изменить координаты одной любой вершины. Напишите пример если не трудно.

Пока не хочу использовать сторонние библиотеки такие как bullet,wrapper etc. Хочу написать свою физику примитивную.Глядишь и получится

pozitiffcat 20.12.2011 22:46

Ответ: 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();                            // разблокировать буфер, когда
                                          // мы закончили работать с ним


Mind 22.12.2011 15:26

Ответ: DirectX 9 доступ к вершинам объекта
 
Я так понял ты работаешь, в данном примере, с временным буфером вершин(vb) и изменяешь его значения, а как потом их применить буферу моей модели?

pozitiffcat 22.12.2011 15:35

Ответ: DirectX 9 доступ к вершинам объекта
 
Это не временный буфер, а фактически буфер из видео карты, изменяя его изменится и изображение.

Mind 23.12.2011 13:12

Ответ: 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) Как я заметил каждая вершина имеет свою сист. координат. Почему. Как это исправить?

HolyDel 23.12.2011 15:31

Ответ: DirectX 9 доступ к вершинам объекта
 
Код:

struct Vertex
{
        float x,y,z;
Vertex(float x_,float y_, float z_):x(x_),y(y_),z(z_){}
};

а так?

Mind 23.12.2011 17:28

Ответ: DirectX 9 доступ к вершинам объекта
 
Так получилось. А что ты конкретно сделал, а то я уже подзабыл что это значит?

ЗЫ:
1) Как можно считать информацию о вершинах?
2) Как я заметил каждая вершина имеет свою сист. координат. Почему. Как это исправить?

pozitiffcat 23.12.2011 18:32

Ответ: DirectX 9 доступ к вершинам объекта
 
Цитата:

Сообщение от Mind (Сообщение 215034)
Так получилось. А что ты конкретно сделал, а то я уже подзабыл что это значит?

ЗЫ:
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.

pozitiffcat 23.12.2011 18:42

Ответ: 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
код не проверял но идея такова

Mind 23.12.2011 23:42

Ответ: DirectX 9 доступ к вершинам объекта
 
Цитата:

Причем тут система координат, каждая вершина имеет x,y,z в пространстве.
Хорошо, допустим я считал координаты вершины и вывел на экран при позиции объекта(0,0,0), а потом при позиции - 10,10,10; и коорд. вершины остались теми же. Получается (не каждая вершина как я говорил) объект имеет свои лок. коорд. в которых находятся вершины. ДА?

pozitiffcat 23.12.2011 23:57

Ответ: DirectX 9 доступ к вершинам объекта
 
Объясняю. Вершины не меняются, если ты просто хочешь передвигать, вращать, масштабировать объект. Меняется мировая матрица.
Например куб, имеет 8 вершин, описаны позиции в диапазонах от -1, до 1 по xyz. Я хочу вывести 3 куба в разных положениях. Я не меняю вершины этого куба, я перед отрисовкой каждого поставляю матрицу. У первого у меня будет d3dxmatrixtranslate одно , у второго другое у третьего третье. Заметь к вершинам я и не прикасался


Часовой пояс GMT +4, время: 15:10.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot