forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Проекты C++ (http://forum.boolean.name/forumdisplay.php?f=56)
-   -   [TrueHorror] - разработка (http://forum.boolean.name/showthread.php?t=17293)

Samodelkin 11.06.2014 00:21

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от mr.DIMAS (Сообщение 282451)
Что будет быстрее - загрузить текстуру в jpg ( распаковка, все дела ) или несжатый tga?

Ты имеешь ввиду "из", а не "в"?
Быстрей всего загружаются форматы с RLE сжатием, даже быстрей чем без сжатия.
Вообще если что то разжимается быстрей чем читается с диска распакованный вариант, то значит загружаться будет быстрей.

Раз у тебя D3D9 то вообще используй DDS - он же на GPU распаковывается.

mr.DIMAS 11.06.2014 00:50

Ответ: [TrueHorror] - разработка
 
Цитата:

Ты имеешь ввиду "из", а не "в"?
Риальне "из". Опечатался.

Спасибо за то что напомнил про DDS. Пожалуй переведу в него текстуры.

Samodelkin 11.06.2014 00:54

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от mr.DIMAS (Сообщение 282457)
Риальне "из". Опечатался.

Спасибо за то что напомнил про DDS. Пожалуй переведу в него текстуры.

Судя по wiki opengl через расширение тоже держит dds. Еще я помню doom3 (у него opengl рендер) также использует dds. Так что я думаю это оптимальный вариант и ты ничего не теряешь.

Mr_F_ 11.06.2014 02:16

Ответ: [TrueHorror] - разработка
 
В релизе текстуры обязаны быть в DDS. DDS это контейнер нативных видюшных данных. Большинство текстур отлично сжимаются DXT, что позволяет экономить дохрена видеопамяти. Самому сжатию нечего делать в рантайме (это не реалтайм дело) - сжимать надо на препроцессе а не у игрока.

Samodelkin 11.06.2014 02:35

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от Mr_F_ (Сообщение 282463)
В релизе текстуры обязаны быть в DDS. DDS это контейнер нативных видюшных данных. Большинство текстур отлично сжимаются DXT, что позволяет экономить дохрена видеопамяти. Самому сжатию нечего делать в рантайме (это не реалтайм дело) - сжимать надо на препроцессе а не у игрока.

Ну в DXT всё равно извлечение данных во время выборки? Там конкретный пиксель вычисляется из общего шаблона.

Да важно отметить что в видеопамяти нужно хранить в DXT, больше по причине ограниченного размера vram, нежели скорости распаковки.
Актуально при таких больших локациях как в TrueHorror :)


В Watch Dogs заметил что текстуры прогружаются напрямую в видеопамять (видимо из-за наличия общей памяти в консолях), и если её не хватает то стримится с диска.
Разве нельзя кешировать текстуры в ram?

Mr_F_ 11.06.2014 12:05

Ответ: [TrueHorror] - разработка
 
Цитата:

Ну в DXT всё равно извлечение данных во время выборки?
Оно в железе. DXT читается даже быстрее, чем неDXT, потому что меньше работы с памятью.

mr.DIMAS 17.06.2014 01:41

Ответ: [TrueHorror] - разработка
 
Для катсцен понадобилась скелетная анимация. До этого был морфинг - но он слишком много жрет оперативки.

В качестве костей используются узлы сцены - точнее их global transform. И вот тут косяк. Если этой трансформацией преобразовать вершину - она улетает в ебеня.

Вроде как нужно получить transform в с.к. относительно [0,0,0] а не позиции кости.

Кароч я тут понаписал ататы. Научите меня скелетке. :)

Mr_F_ 17.06.2014 02:41

Ответ: [TrueHorror] - разработка
 
у тебя меш в Т-позе - т.е. в такой позе, при которой у костей есть определённые дефолт-ротации.
тебе нужно иметь инвертированные матрицы костей в Т-позе, чтобы мировые ротации костей анимационные преобразовывать в пространство относительно Т-позы. вот и все дела.

Samodelkin 17.06.2014 02:47

Ответ: [TrueHorror] - разработка
 
Есть книга Джима Адамса про скелетную анимацию.
Однако книга 2004 года и некоторые вещи связанные с directx в ней сильно устарели (даже для dx9), но теоретическая часть в ней подробно расписана.

Arton 17.06.2014 04:27

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от Samodelkin (Сообщение 282930)
Есть книга Джима Адамса про скелетную анимацию.
.

Прочитал как Адам Дженсен.

Mr_F_ 17.06.2014 11:18

Ответ: [TrueHorror] - разработка
 
Цитата:

книга Джима Адамса про скелетную анимацию
не знаю даже, я за ~1.5 дня её писал, чутка погуглив
можно конечно извращаться типа дуал кватернионов, но под них и арт надо готовить специально итп
для самого скелета юзал обычные ноды сцены с иерархией, как и mr.DIMAS

Samodelkin 17.06.2014 16:01

Ответ: [TrueHorror] - разработка
 
Ну там не только скелетка, там еще рэгдолл, морфинг, лицевая анимация и еще всякие более общие штуки. Да после прочтения книги, нужно поискать более современные статьи, конкретно по реализации, т.к. то что в книге - устарело, но теория там ОК.

mr.DIMAS 18.06.2014 02:58

Ответ: [TrueHorror] - разработка
 
Бля. У меня бомбит пукан. Эта скелетка никак не получается. Вроде все правильно сделал - но нет блять - меш перекареживает просто пздц. В топку. Оставлю морфинг - рагдолл не нужен.

Второй день маюсь - ну просто пичаль, ненависть, ярость, агрессия, фрустрация, безысходность, депрессия.

mr.DIMAS 18.06.2014 14:46

Ответ: [TrueHorror] - разработка
 
Вложений: 1
Я упертый\упоротый - вот все мои исходники скелетки.

Расчет вершин по скелету
Код:

if ( node->skinned )
  {
    int i = 0;

    for( auto meshIter = node->meshes.begin(); meshIter != node->meshes.end(); ++meshIter )
    {
      Mesh * mesh = *meshIter;

      vector< Vertex > temp = mesh->vertices;

      for( int i = 0; i < mesh->vertices.size(); i++ )
      {
        Vertex & vertex = mesh->vertices[ i ];
        Weight & weight = mesh->weights[ i ];

        btVector3 lastPosition = btVector3( vertex.coords.x, vertex.coords.y, vertex.coords.z );
        btVector3 newPosition = btVector3( 0, 0, 0 );

        for( int j = 0; j < weight.boneCount; j++ )
        {
          SceneNode * bone = weight.bones[ j ].node;

          newPosition += newPosition += bone->invBoneBindTransform * bone->globalTransform * lastPosition * weight.bones[ j ].weight;
        }

        vertex.coords.x = newPosition.x();
        vertex.coords.y = newPosition.y();
        vertex.coords.z = newPosition.z();
      }

      UpdateBuffers( mesh );

      mesh->vertices = temp;
    }
  }

Поиск костей и расчет их инверсных матриц.
Код:

  for( int i = 0; i < numMeshes; i++ )
  {
    SceneNode * node = scene->childs[ i ];

    node->invBoneBindTransform = CalculateGlobalTransform( node ).inverse();

    for( int k = 0; k < node->meshes.size(); k++ )
    {
      Mesh * mesh = node->meshes[ k ] ;

      for( int j = 0; j < mesh->weights.size(); j++ )
      {
        Weight & w = mesh->weights[ j ];

        for( int q = 0; q < w.boneCount; q++ )
        {
          w.bones[ q ].node = reinterpret_cast< SceneNode* >( FindByName( w.bones[q].name.c_str() ));
        }
      }
    }
  }

Расчет глобальной трансформации
Код:

btTransform & CalculateGlobalTransform( SceneNode * n )
{
  if( n->body )
    n->body->activate( true );

  if( n->parent )
  {
    if( n->parent->frozen )
    {
      n->globalTransform = CalculateGlobalTransform( n->parent ) * n->localTransform;

      if( n->body )
      {
        n->body->setWorldTransform( n->globalTransform );
        n->body->setLinearVelocity( btVector3( 0, 0, 0 ));
      }
    }
    else
    {
      if( n->body )
        n->globalTransform = n->body->getWorldTransform();
      else
        n->globalTransform = CalculateGlobalTransform( n->parent ) * n->localTransform;
    }
  }
  else
  {
    if( n->body )
      n->globalTransform = n->body->getWorldTransform();
    else
      n->globalTransform = n->localTransform;
  }

  return n->globalTransform;
}

И в аттаче пример работы этой хуиты.

[E] - анимировать объект

ABTOMAT 18.06.2014 16:57

Ответ: [TrueHorror] - разработка
 
Цитата:

Сообщение от mr.DIMAS (Сообщение 282998)
Бля. У меня бомбит пукан. Эта скелетка никак не получается. Вроде все правильно сделал - но нет блять - меш перекареживает просто пздц. В топку. Оставлю морфинг - рагдолл не нужен.

Второй день маюсь - ну просто пичаль, ненависть, ярость, агрессия, фрустрация, безысходность, депрессия.

Да что там сложного? Берём позицию вершины в T-позе, умножаем её по очереди на инвертированные матрицы костей в порядке иерархии, умножаем на матрицу объекта (ЕМНИП). Вот, переводил как-то статью.


Часовой пояс GMT +4, время: 05:50.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot