Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > C++

Ответ
 
Опции темы
Старый 20.12.2011, 17:17   #1
Mind
ПроЭктировщик
 
Аватар для Mind
 
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений
(для 18 пользователей)
DirectX 9 доступ к вершинам объекта

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

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

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

Если кто-то знает еще сам алгоритм определения столкновения, то расскажите мне про него по подробнее.
(Offline)
 
Ответить с цитированием
Старый 20.12.2011, 17:49   #2
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: DirectX 9 доступ к вершинам объекта

храни отдельно, чтобы быстро достучаться, а так lock unlock, так же как и создание.
(Offline)
 
Ответить с цитированием
Старый 20.12.2011, 18:22   #3
Mind
ПроЭктировщик
 
Аватар для Mind
 
Регистрация: 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
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 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
Mind
ПроЭктировщик
 
Аватар для Mind
 
Регистрация: 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
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Mind (20.12.2011)
Старый 22.12.2011, 15:26   #7
Mind
ПроЭктировщик
 
Аватар для Mind
 
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений
(для 18 пользователей)
Ответ: DirectX 9 доступ к вершинам объекта

Я так понял ты работаешь, в данном примере, с временным буфером вершин(vb) и изменяешь его значения, а как потом их применить буферу моей модели?
(Offline)
 
Ответить с цитированием
Старый 22.12.2011, 15:35   #8
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: DirectX 9 доступ к вершинам объекта

Это не временный буфер, а фактически буфер из видео карты, изменяя его изменится и изображение.
(Offline)
 
Ответить с цитированием
Старый 23.12.2011, 13:12   #9
Mind
ПроЭктировщик
 
Аватар для Mind
 
Регистрация: 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
HolyDel
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Mind (23.12.2011)
Старый 23.12.2011, 17:28   #11
Mind
ПроЭктировщик
 
Аватар для Mind
 
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений
(для 18 пользователей)
Ответ: DirectX 9 доступ к вершинам объекта

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

ЗЫ:
1) Как можно считать информацию о вершинах?
2) Как я заметил каждая вершина имеет свою сист. координат. Почему. Как это исправить?
(Offline)
 
Ответить с цитированием
Старый 23.12.2011, 18:32   #12
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 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
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 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)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Mind (23.12.2011)
Старый 23.12.2011, 23:42   #14
Mind
ПроЭктировщик
 
Аватар для Mind
 
Регистрация: 24.02.2011
Сообщений: 188
Написано 13 полезных сообщений
(для 18 пользователей)
Ответ: DirectX 9 доступ к вершинам объекта

Причем тут система координат, каждая вершина имеет x,y,z в пространстве.
Хорошо, допустим я считал координаты вершины и вывел на экран при позиции объекта(0,0,0), а потом при позиции - 10,10,10; и коорд. вершины остались теми же. Получается (не каждая вершина как я говорил) объект имеет свои лок. коорд. в которых находятся вершины. ДА?
(Offline)
 
Ответить с цитированием
Старый 23.12.2011, 23:57   #15
pozitiffcat
Мастер
 
Аватар для pozitiffcat
 
Регистрация: 09.05.2010
Адрес: Самара
Сообщений: 1,083
Написано 254 полезных сообщений
(для 533 пользователей)
Ответ: DirectX 9 доступ к вершинам объекта

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


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


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


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com