Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Кубическая панорама


Автор: Snake174 23.1.2014, 08:11
Всем привет.
Имеется кубическая панорама (развёртка куба), построенная из 6 изображений.
Как можно из этой развёртки получить обратно 6 изображений (стороны куба)?

Автор: tzirechnoy 23.1.2014, 08:42
Сначала жэлательно распечатать эту панораму, взять ножницы, и получить эти 6 изображэний.

Потом взять [gimp, photoshop, etc], и проделать то жэ самое -- только без распечатывания, с ножницами компьютэрного редактора.

Если потом останутся конкретные вопросы -- обращайтесь.

Автор: Snake174 23.1.2014, 13:50
Вы немного не поняли.
Мне нужна какая-нибудь формула для перевода этой панорамы в стороны куба.
И жЭлательно без ножниц и компьютЭрного редактора для получения этих шести изображЭний  smile 
http://fastpic.ru/view/60/2014/0123/573d14d27da529dbf96fa307757a6251.jpeg.html http://fastpic.ru/view/60/2014/0123/ba6ddb6b73b63e232e9711ecb172654f.jpeg.html http://fastpic.ru/view/60/2014/0123/866a35484d13f064043e74c4349e92f0.jpeg.html http://fastpic.ru/view/60/2014/0123/6879737bf62b30075d98440806269f04.jpeg.html http://fastpic.ru/view/60/2014/0123/823382c55f9c062d564020ace4d723bb.jpeg.html http://fastpic.ru/view/60/2014/0123/25737f47dceee7c18e52be8ee489c7cb.jpeg.html http://fastpic.ru/view/60/2014/0123/e38def226b77c325bbedee8b8f6c936d.jpeg.html

Автор: Bitter 23.1.2014, 16:19
Цитата(Snake174 @  23.1.2014,  13:50 Найти цитируемый пост)
жЭлательно без ножниц и компьютЭрного редактора для получения этих шести изображЭний

Наверное его зовут жЭня  smile 

Цитата(Snake174 @  23.1.2014,  13:50 Найти цитируемый пост)
какая-нибудь формула

Думаете для этого существует формула? Как вы куб загружаете в программу? Если импортируете из редактора, то предварительно в редакторе накладывате на каждую сторону нужную текстуру. Если вы создаете куб вручную, то и вручную для каждой стороны указываете материал с соответствующей текстурой.

Хотя я скорее всего не понял вопрос, может вы имеете в виду что у вас есть панорама как справа, а вы хотите ее переделать в 6 текстур? Тогда вместо этого попробуйте просто использовать не куб, а сферу, так как это текстура сферы (растянутые низ и верх говорят о том что эти места сходятся в точку, то есть полюса сферы)

Автор: Snake174 24.1.2014, 04:53
C построением куба и накладыванием на него текстур проблем нет. Первые 6 изображений - это исходные изображения, по которым строится последнее изображение:
Код

QImage *LocationEditor::getEquirect()
{
  int i, j, f, w, h, k, l;
  float az, el, x, y;
  QImage *faces[6];
  w = 360;
  h = 180;

  QStringList cubeMapImages = getCubeMapImages();

  for (i = 0; i < cubeMapImages.count(); ++i)
  {
    QImage image;
    QString s = QString("%1/%2").arg( locationName ).arg( cubeMapImages.at(i) );

    if (!image.load( s, PathUtils::getExt(s).toUpper().toAscii().constData() ))
    {
      qDebug("Can't load image");
      return 0;
    }

    faces[i] = new QImage( image.convertToFormat( QImage::Format_RGB888 ) );
  }

  QImage *equirect = new QImage( w, h, QImage::Format_RGB888 );

  for (i = 0; i < w; ++i)
  {
    for (j = 0; j < h; ++j)
    {
      az = (i + 0.5f) / w * 2 * (float)M_PI;
      el = ((-0.5f - j) / h + 0.5f) * (float)M_PI;
      f = 0;

      while (az > M_PI / 4)
      {
        az -= M_PI / 2;
        f++;
      }

      if (f == 4)
        f = 0;

      x = tanf( az );
      y = -sqrtf( 1 + x * x ) * tanf( el );

      if (y < -1)
      {
        f = 4;
        az = (i + 0.5f) / w * 360 * (float)M_PI / 180;
        x = sinf( az ) / tanf( el );
        y = cosf( az ) / tanf( el );
      }
      else if (y > 1)
      {
        f = 5;
        az = (i + 0.5f) / w * 360 * (float)M_PI / 180;
        x = -sinf( az ) / tanf( el );
        y = cosf( az ) / tanf( el );
      }

      k = (int)floorf( (faces[f]->width() - 1) * (x + 1) / 2 + 0.5f );
      l = (int)floorf( (faces[f]->height() - 1) * (y + 1) / 2 + 0.5f );

      ((unsigned char *)(equirect->bits()))[ j * equirect->bytesPerLine() + 3 * i + 0 ] = ((unsigned char *)(faces[f]->bits()))[ l * faces[f]->bytesPerLine() + 3 * k + 0 ];
      ((unsigned char *)(equirect->bits()))[ j * equirect->bytesPerLine() + 3 * i + 1 ] = ((unsigned char *)(faces[f]->bits()))[ l * faces[f]->bytesPerLine() + 3 * k + 1 ];
      ((unsigned char *)(equirect->bits()))[ j * equirect->bytesPerLine() + 3 * i + 2 ] = ((unsigned char *)(faces[f]->bits()))[ l * faces[f]->bytesPerLine() + 3 * k + 2 ];
    }
  }

  for (int i = 0; i < cubeMapImages.count(); ++i)
  {
    delete faces[i];
    faces[i] = 0;
  }

  return equirect;
}

На выходе получается нужный QImage (последнее изображение).
Теперь вот надо из этого изображения получить исходные (первые 6 изображений).
Всё никак алгоритм не найду.

Автор: Bitter 24.1.2014, 11:09
как на счет этого?
http://www.youtube.com/watch?v=qqMmjBSWByw

Еще вот тут есть инверсные формулы для преобразования вручную
http://mathworld.wolfram.com/CylindricalEquidistantProjection.html

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)