![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Подскажите как масштабировать модель (имеется ввиду X Mesh). [Delphi, X-файлы, Windows, DirectX (Direct3D)]
Колбасьев © (2004-07-15 22:13:00)Подскажите как масштабировать модель (имеется ввиду X Mesh). Пока я использую код:
var
...
XBuffer : IDIRECT3DVERTEXBUFFER8;
Vertices : ^TNormDiffTextVertex;
Desc : TD3DVertexBuffer_Desc;
begin
...
ptMesh.LockVertexBuffer(0, PByte(Vertices));
ptMesh.GetVertexBuffer(XBuffer);
XBuffer.GetDesc(Desc);
for i := 0 to (Desc.Size div SizeOf(TNormDiffTextVertex)) - 1 do
begin
Vertices.X := Vertices.X * ScaleX;
Vertices.Y := Vertices.Y * ScaleY;
Vertices.Z := Vertices.Z * ScaleZ;
Inc(Vertices);
end;
ptMesh.UnlockVertexBuffer;
...
end;
Но он масштабирует неправильно: каша какая-то получается.
Sapersky (2004-07-17 22:32:00) [1]Про Mesh.GetNumVertices написано "retrieves the number of vertices in the mesh" безо всяких комментариев, т.е., скорее всего, это самый простой вариант - размер вершинного буфера в элементах. Надо бы протестировать, конечно...
Относительно Desc.Size посмотрел - в байтах, так что в примере всё должно быть правильно... Может, формат (размер) вершины на самом деле не тот? Или значения Scale такие, что каша и должна получаться :)
Ещё, если делать с Desc.Size, то я бы сначала получал размер (ptMesh.GetVertexBuffer, XBuffer.GetDesc), а потом уже блокировал буфер. Блокировка - такая вещь, чем меньше в блокированном состоянии находишься, тем лучше. А тут ещё и обращения к заблокированному объекту идут. Хотя вроде бы оно допустимо (написано только что DrawPrimitive не будет работать), но лучше (ИМХО) так не делать.
Колбасьев (2004-07-16 17:12:00) [2]
> Если уж нужно заранее... можно попробовать взять количество
> вершин через Mesh.GetNumVertices - а то относительно Desc.Size
> не помню, в байтах он или в элементах.
Тогда вопрос: Mesh.GetNumVertices дает количество вершин в буффере IDirect3DVertexBuffer ? , или, что более вероятно - дает количество вершин, которые используются фасетами для построения треугольников (как в ASE например), тогда количество вершин в буффере не равно количеству вершин треугольников, так как в буффере будут повторяющиеся вершины?
Sapersky (2004-07-16 10:09:00) [3]А матрицей при выводе нельзя масштабировать? Всё равно же какая-то трансформация применяется, наверное.
Если уж нужно заранее... можно попробовать взять количество вершин через Mesh.GetNumVertices - а то относительно Desc.Size не помню, в байтах он или в элементах.