Войти
airplayФорум

ЧаВо (FAQ) (комментарии) (4 стр)

Страницы: 1 2 3 4 5 6 Следующая »
#45
13:57, 18 мая 2011

kalach
и будет скейлиться...
напиши конкретно что ты пытаешься сделать, какой результат хочешь получить, если ты установил разрешение 320х480, то и рисуй как бы в этом разрешении, на любом экране должно отмасштабироваться правильно

#46
14:36, 18 мая 2011

Я сразу скажу что с 2D подсистемой не работаю. Делаю всё то-же только через IwGxSetVertStreamScreenSpace (или как-то так). По этому к сожалению помочь не могу.

Интуиция подсказывает что кроме Iw2DDrawImage(image, position); должна быть

void  Iw2DDrawImageRegion (CIw2DImage *image, CIwSVec2 topLeft, CIwSVec2 size, CIwSVec2 regionOffset, CIwSVec2 regionSize);

Которая позволяет скейлить, выводить часть изображения и т.д :)


image  the image to draw 
topLeft  the top left position of the image on the screen 
size  the size of the image on the screen 
regionOffset  the top left of the region within the image 
regionSize  the size of the region within the image

#47
15:37, 18 мая 2011

да действительно это вариант. спасибо!

теперь только вопрос в том как повернуть спрайт на произвольный угол. походу без матриц не обойтись.

#48
15:49, 18 мая 2011

похоже да:


Iw2D supports a 2D matrix transformation. This can be used as a simple offset, a rotation, a scale or a combination of all three. For example, to draw all subsequent objects rotated 45 degrees around (20, 20) you would first create a CIwMat2D that contains this transformation, and set the global context to use that matrix:

CIwMat2D rot;
rot.SetRot(IW_GEOM_ONE/8, CIwVec2(20, 20));
Iw2DSetTransformMatrix(rot); 

Только непонятно вокруг чего он вращает? Вокруг точки (0,0) на экране?

#49
16:12, 18 мая 2011

Он вращает вокруг точки которую задаешь, к примеру CIwVec2(20, 20).

что происходит у меня. предположим есть девай с экраном WxH пикселей, мне удобнее работать с одним разрешением 320x480 и началом координат слева-внизу. что бы это сделать, я считаю матрицу и применяю ее.

  DEFS.matrix.SetIdentity();
  
  DEFS.globalScale = (scaleW < scaleH) ? (scaleW) : (scaleH);
  DEFS.matrix.Scale(IW_FIXED(DEFS.globalScale));
  
  DEFS.matrix.t[0] = 0;
  DEFS.matrix.t[1] = DEFS.realHeight;
  
  DEFS.matrix.t[0] += (DEFS.realWidth  - DEFS.screenWidth  * DEFS.globalScale) / 2;
  DEFS.matrix.t[1] -= (DEFS.realHeight - DEFS.screenHeight * DEFS.globalScale) / 2;
  
  DEFS.matrix.m[1][1] *= -1;

  Iw2DSetTransformMatrix(DEFS.matrix);

с этого момента у меня нормальная система координат, как мне надо. но чтобы осуществить поворот спрайта, нужно юзать матрицу. вот я и не могу понять как их комбинировать. в голове уже каша...

upd: кажись я понял :D  не нужно дополнительной матрицы. нужно повернуть всю систему координат на -угол, нарисовать спрайт, повернуть обратно(все относительно центра спрайта).

#50
16:20, 18 мая 2011

kalach
> кажись я понял :D  не нужно дополнительной матрицы. нужно повернуть всю систему
> координат на -угол, нарисовать спрайт, повернуть обратно(все относительно
> центра спрайта).
Ага

kalach
> не могу понять как их комбинировать
Перемножать же!

#51
9:42, 19 мая 2011

leonardo98
> при вызове Iw2DTerminate() получаю Message: Bucket 0(System) is still in use (first allocation ID=571); deleting it is dangerous
проблема решилась переписыванием главного цикла к виду типа

//-----------------------------------------------------------------------------
// Main global function
//-----------------------------------------------------------------------------
int main() {  

  Iw2DInit();
  {
    Core core;
                    ..тут всё крутится..
  }
  Iw2DTerminate();
  return 0;
}

т.е. всё гарантировано создаётся и убивается только между Iw2DInit(); и Iw2DTerminate();
попутно было выявлено множество мелких багов с неосвобождаемой памятью

#52
12:03, 19 мая 2011

GLoom
разобрался я что к чему.

  localMatrix.SetIdentity();

  localMatrix.SetRot(IW_ANGLE_FROM_DEGREES(-angle), false);
  localMatrix.Scale(IW_FIXED(scale));
  localMatrix.t = position + centre - localMatrix.RotateVec(centre);

  Iw2DSetTransformMatrix(localMatrix * DEFS.matrix);

  Iw2DSetImageTransform(IW_2D_IMAGE_TRANSFORM_FLIP_Y); 
  Iw2DSetColour(r + (g << 8) + (b << 16) + (alpha << 24));
  Iw2DDrawImage(image, CIwSVec2(0,0));

  Iw2DSetTransformMatrix(DEFS.matrix);

теперь все скейлится, поворачивается. НО при вращении спрайт дрожит как "осиновый лист". откуда ноги у этого эффекта растут интересно?

upd: вот видео http://rghost.net/7007591 сори за вотермарки.

#53
12:16, 19 мая 2011

Для видео можно использовать wegame - там нет вотремарков и т.п. Я им писал свои видео с игр. http://www.wegame.com/download/

Дрожжит наверное потому что снапится к пикселам. Вся же фишка 2D подсистемы что попиксельная точность, а не субпиксельная. Кстати в Iw2DLite (который отдельный софтовый) поворотов вообще нет.

#54
12:22, 19 мая 2011

wegame только под винду, я под маком. почитал я форум airplay, походу нужно забить на этот  Iw2D и писать свою обертку над IwGx, думал обойтись малой кровью...

#55
13:00, 19 мая 2011

GLoom
> Дрожжит наверное потому что снапится к пикселам. Вся же фишка 2D подсистемы что
> попиксельная точность, а не субпиксельная.
черт, это плохо, кажется я тоже зря за Iw2D взялся), кстати сейчас посмотрел IwGxDrawPrims - тоже на входе берет целочисленные координаты - я пока всё рисую через него, получается он тоже не даст нужную плавность при движении?
собственно, а что остается? IwGL?

#56
13:39, 19 мая 2011

IwGxDrawPrims берёт потоки вершин на вход. Там есть методы:
IwGxSetVertStream
IwGxSetVertStreamModelSpace
IwGxSetVertStreamScreenSpace
IwGxSetVertStreamScreenSpaceSubPixel
IwGxSetVertStreamViewSpace
и т.п.

Выбирая нужные методы можно добиваться разных результатов.

#57
14:41, 19 мая 2011

хотя на их форуме "in 4.3.0 they finally added sub-pixel rendering support to Iw2D"

Iw2DSetSubPixelCoords(true); - не помогает

#58
8:59, 20 мая 2011

kalach
попробуй рисовать через
IwGxSetVertStreamScreenSpaceSubPixel & IwGxDrawPrims
и вращать без матриц, а ручками считая координаты

GLoom

Linking...
c:/airplay sdk/update/s3e/gcc/bin/../lib/gcc/arm-none-eabi/4.4.1/../../../../arm-none-eabi/bin/ld.exe: cannot find -liw2d_d.lib
collect2: ld returned 1 exit status
Project : error PRJ0002 : Error result 1 returned from 'C:\Airplay SDK\update\s3e\bin\link.exe'.

что такое может быть при сборке ARM Release? файла liw2d_d.lib естественно в SDK нет
ARM Dedug вообще выдаёт кучу unused variable 'check' in IwGeomQuat.h line 31 и т.п.

#59
10:35, 20 мая 2011

leonardo98
> ARM Release
GCC?

Страницы: 1 2 3 4 5 6 Следующая »
airplayФорум

Тема в архиве.