ПрограммированиеФорумГрафика

Подскажите что не так с преобразованиями.

#0
15:42, 11 июля 2015

собственно сабж.

const Matrix<4, 4, float>* Sprite::transform()
{
  Size* screen = getScreenSize();
  float width = screen->getWidth();
  float height = screen->getHeight();
  float imageWidth = ((Texture*)_image)->getWidth();
  float imageHeight = ((Texture*)_image)->getHeight();

  float scaleX = imageWidth / width;
  float scaleY = imageHeight / height;

  MatrixObject scale, rotate, translation;
  scale.initScaleTransform(
    scaleX + _scale.getX() - 1.0f,
    scaleY + _scale.getY() - 1.0f,
    _scale.getZ()
  );
  rotate.initRotateTransform(_rotate.getX(), _rotate.getY(), _rotate.getZ());  

  float x = (OFFSET_IN_ZERO_X + 2*_point.getX() / width);
  float y = (OFFSET_IN_ZERO_Y + 2*_point.getY() / height);

  translation.initTranslationTransform(
    x*(2.0f - scaleX),
    y*(2.0f - scaleY),
    _point.getZ()
  );

  _transformation = translation * rotate * scale;
  return &_transformation;
}

Получается вот что:
test | Подскажите что не так с преобразованиями.
А должен быть виден только зелёный..
П.С. Если

scaleX = 1;
scaleY = 1;

То всё норм.

#1
16:30, 11 июля 2015

Ничего не понятно. Откуда три цвета берутся? Это так текстура выглядит? Где должен быть зелёный?
Что эта функция должна делать? Это движок какой-то или всё твоё самописное?

#2
16:41, 11 июля 2015

Alprog
> Откуда три цвета берутся? Это так текстура выглядит?
да. Это текстура. Вот так она выглядит:
Изображение
Alprog
> Где должен быть зелёный?
Текстура рисуется в координатах [0,0] следовательно должна быть видна только зелёная часть текстуры.
Alprog
> Что эта функция должна делать?

_shader->setUniformLocationWithMatrix4fv(_shader->getUniformLocation(_shader->UNIFORM_NAME_MVP_MATRIX), (const GLfloat*)transform(), 1);

:)
Alprog
> Это движок какой-то или всё твоё самописное?
самописное

#3
21:25, 11 июля 2015

опять меня игнорят :(

#4
22:22, 11 июля 2015

Dzhekson6000
Так ведь ничего не ясно. Ну, проверь, что getScreenSize() возвращает размер реальной поверхности, а не всего окна.

#5
12:50, 12 июля 2015

Alprog
наверное вот так будет понятней.
https://github.com/Dzhekson6000/SiTEngine/blob/master/SiT/Graphic… 2d/Sprite.cpp

#6
15:37, 12 июля 2015
float x = (2 * (_point.getX() - width/2) / imageWidth);
float y = (2 * (_point.getY() - height/2) / imageHeight);

И всё должно работать :)

ПрограммированиеФорумГрафика

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