Потому, что 2D координаты нужно трансформировать матрицей 3*3, вот CameraSpacePosition - это уже 3D координаты, хоть даже ты и применяешь только две компоненты из трёх, тут действует обычная 4*4 матрица.
Mikle
> вот CameraSpacePosition
Погоди ка.... Я пока не использую CameraSpacePosition...
Я убрал все смешивание, поставил одну текстуру и хочу тупо вырезать из нее кусок, допустим rect(128,128,256,256).
Делаю так:
tex.SetTexture 0 'текстура g_dev.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 'стейты g_dev.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE g_dev.SetTextureStageState 0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 D3DXMatrixScaling s_mtrx, s_size.x / size.x, s_size.y / size.y, 1 'размер куска для вырезания D3DXMatrixTranslation s_mtrx1, 128, 128, 0 'сдвиг D3DXMatrixMultiply s_mtrx, s_mtrx, s_mtrx1 g_dev.SetTransform D3DTS_TEXTURE0, s_mtrx 'рендер....
max255
Все D3DXMatrix в D3DX - это матрицы 4*4
MatrixTranslation(x,y) размером 3*3 выглядит так:
1 0 0 0 1 0 x y 1
Но SetTransForm понимает только матрицы 4*4, поэтому нужно "впихнуть" туда матрицу 3*3 так:
1 0 0 0 0 1 0 0 x y 1 0 0 0 0 0
Mikle
> выглядит так:
значит нужно передавать вот так?
Mtrx.m11 = 1 Mtrx.m12 = 0 Mtrx.m13 = 0 Mtrx.m14 = 0 Mtrx.m21 = 0 Mtrx.m22 = 1 Mtrx.m23 = 0 Mtrx.m24 = 0 Mtrx.m31 = x Mtrx.m32 = y Mtrx.m33 = 1 Mtrx.m34 = 0 Mtrx.m41 = 0 Mtrx.m42 = 0 Mtrx.m43 = 0 Mtrx.m44 = 0
Пробовал получил то же самое...
Все скалируется, но не двигается.
А у меня работает:
Texture Scroll
Что я делаю не так? :)
Mikle
> Что я делаю не так? :)
Ничего! :) Это я тупанул дико.... В процессе метода "тыка " повключал лишние стейты и считал сдвиг в реальных координатах...
Все лишнее стер координаты пересчитал... Все заработало!!!!
Только текстурка стенки во время бампа не получает нужные координаты...
tex.SetTexture 2 'текстуры light.SetTexture 1 'для bump.SetTexture 0 'бампа g_dev.SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 g_dev.SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE g_dev.SetTextureStageState 1, D3DTSS_COLOROP, D3DTOP_DOTPRODUCT3 g_dev.SetTextureStageState 1, D3DTSS_COLORARG1, D3DTA_TEXTURE g_dev.SetTextureStageState 1, D3DTSS_COLORARG2, D3DTA_CURRENT g_dev.SetTextureStageState 1, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION g_dev.SetTextureStageState 1, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2 g_dev.SetTextureStageState 1, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP g_dev.SetTextureStageState 1, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP g_dev.SetTransform D3DTS_TEXTURE1, Mtrx 'трансформируем пятно g_dev.SetTextureStageState 2, D3DTSS_COLOROP, D3DTOP_MODULATE2X g_dev.SetTextureStageState 2, D3DTSS_COLORARG1, D3DTA_TEXTURE g_dev.SetTextureStageState 2, D3DTSS_COLORARG2, D3DTA_CURRENT g_dev.SetTextureStageState 2, D3DTSS_TEXCOORDINDEX, 0 'РОДНЫЕ КООРДИНАТЫ!!! (нужно трансформированные по ректу) spr.DrawRect GetRect(128, 128, 256, 256), mpos, vec2MulC(tex.GetSize, 1), vec2(0, 0), 0 'отрисовка (а тут я считаю сдвиг по ректу и двигаю слой 0)
Можно как то выйти из этой ситуации?
max255
Поставь на вторую стадию TEXTURETRANSFORMFLAGS = 2 и соответствующую матрицу в трансформацию Texture2.
И у матриц 3*3, кстати, можно не заполнять нулями четвёртые строку и столбец - всё равно они игнорируются.
Mikle
Ну я тоже так думал... Но матрица та находиться в классе спрайта (считается там), так что не вскрывая класс мне ее не получить...
Вот я думаю может оформить функцию отрисовки так:
Function DrawRect(RECT As RECT, position As D3DVECTOR2, size As D3DVECTOR2, center As D3DVECTOR2, rotation As Single,tex_flags as tf) 'где tf тип флагов текстур которые надо резать (tex1, tex2,...,tex7) - задавать их через or
А в классе выставлять матрицы тем текстурам которые были указаны...
Что думаеш по этому поводу?
>Мне кажется это извращенством...
>Если проблему по другому решить невозможно, может лучше перейти к lock/unlock + matrix?
Mikle
>И у матриц 3*3, кстати, можно не заполнять нулями четвёртые строку и столбец - всё равно они игнорируются.
Приму на вооружение! :)
Провел тесты результаты удивили :)))
1)Только трансформация мира и текстур (матрицы) - 700 fps
2)Трансформация мира + lock/unlock - 697 fps
3)Трансформация мира + DrawPrimitiveUp - 720 fps
Значит буду делать по третьему способу... :)
А есть готовые directx движки для VB6? Сам искал не нашёл.
СырМан
Был такой iRender, но сырой очень, и давно автором заброшен.
Есть еще один но он, зараза, платный... TrueVision3d
И еще минус что в бесплатной версии постоянно висит баннер на экране... Это жутко раздражает...
Кстати Mikle, а можно где то найти сорсы irender-а ? Очень пригодились бы...
max255
Автор iRender - ник "Орбит" или "d3drm", на VBStreets, вроде бы, выкладывал исходники, поискать нужно.
Майкл, ты мне говорил, что не следует использовать тип integer.
А тип byte можно?
Тема в архиве.