Операции над вершинами и треугольниками в памяти Blitz3D
Для эффективной и максимально быстрой работы с вершинами и треугольниками, операции над ними можно производить непосредственно в памяти из внешних библиотек, не прибегая к встроенным командам блица.
В качестве примера напишем функцию для преобразования всех вершин выбранного сурфейса в глобальную систему координат произвольной Entity, в качастве среды разработки возьмём MSVC++ 6.0. Для начала нам нужно получить адрес сурфейса(сетки), где хранятся Vertex Buffer и Index Buffer(треугольники). SurfHandle = GetSurface(model, 1 ) ;хендл(адрес) сурфейса. (прим. Структуру сурфейса можно посмотреть здесь: http://blitz.pp.ru/forum/showthread.php?s=&threadid=203) Vertex Buffer лежит по смещению (SurfHandle + 28байт), Index Buffer - (SurfHandle + 44байта). Для простоты работы с вершинами можно создать специальную структуру, с помощью которой мы будем обращаться к параметрам вершины: Код:
typedef struct _BBVERTEX Точно также можно сделать и для треугольников: Код:
typedef struct _BBTRIANGE (прим. Треугольник - это последовательность 3-х индексов в IndexBuffer соответственно) Для получения положения Entity (поворот, размер, позиция), воспользуемся её матрицей трансформации. Глобальная матрица хранится по смещению (SurfHandle + 216байт), таже матрица, но с учётом Tween(если используется), хранится по адресу (SurfHandle + 516байт). (прим. В спецификации DirectX используются матрицы размерностью 4х4, но для пространственных преобразований достаточно матрицы 3х4, она и хранится в структуре Entity в блице) Получение матрицы: Код:
float EMatrix11= *(Entity+44); (прим. В С++ значение смещения для указателей учитывается в соответствии с их типом, например, если используется тип Float(4байта), то смещение на 40 байт будет указано как +10) Для преобразования координат вершины, нужно перемножить их на матрицу: Код:
//координаты исходной сетки. (Прим. Хочу предупредить, что в матрице значения углов будут инвертированными, это нужно учесть ;) ) Количество вершин можно получить так: int VertexCount = ( *(surfaceSrc+8) - *(surfaceSrc+7) )/64; (прим. 64 - количество байт на одну вершину) Цикл перебора вершин будет выглядеть так: Код:
for (int vertex = 0; vertex<VertexCount; vertex++) Таким образом Мы можем вертеть сетку в соответствии с позицией любой Entity :) (Прим. При изменении координат вершин мы изменяем размер всей сетки, но блиц проверяет её видимость по старому размеру, поэтому корректнее также изменять и параметры ограничивающего бокса(Bounding Box) - см. структуру меша) Полный код функции: Код:
BBDECL void TransformSurfaceToMatrix( unsigned int *surfaceSrc, unsigned int *surfaceDest, float *Entity ) Пример к статье можно найти здесь: http://andreyman.ucoz.ru/VertexSample.rar http://andreyman.ucoz.ru/publ/1-1-0-1 http://andreyman.ucoz.ru/blog/2006-11-04-2 |
Re: Операции над вершинами и треугольниками в памяти Blitz3D
интересная инфа ... :)
|
Часовой пояс GMT +4, время: 16:21. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot