GameDev.ru
/ GameDev.ru / Пользователи / Andrey / Сообщения на форуме пользователя Andrey (163 стр.)

Сообщения на форуме пользователя Andrey (163 стр.)

Реакция на столкновение с произвольной областью(2D)16 окт. 200615:34#9
DEN 3D
>Вначале проверяешь на столкновение ограничивающие прямоугольники -
>если есть пересечение - залазишь в память этих образов и проверяешь
>попиксельно двойным циклом - если в обеих образах цвет пикселя не
>равен цвету фона(цветового ключа) - значит есть столкновение!
угу а чтобы шустрей еще в шейдере это?
>DirectX.Графика в проектах Delphi.
мдя... помню в перлах была циатата из этой книги :)
Модели *.x в OpenGL16 окт. 200615:12#1
beetle2001
1) Тема уже была
2) нцжно ручками парсить x файл и писать загрузчик и аниматор.
3) посvотри в irrlicht-1.1 классы CXFileReader, CXMeshFileLoader может поможет.
Реакция на столкновение с произвольной областью(2D)13 окт. 200610:26#5
KKH
>то почему не разбить объект заранее и не упростить себе
нет еще ни редактора, нb автоматизированного способа разбиения тестируемых на коллизии объектов сцены. Все что сейчас имеется это отружить тестируемую область точками и получить массив координат этих точек.
>Еще способ, создать дополнительное, неотображаемое пространство, нарисовать в нем контуры фигур, и смотреть попиксельно, >куда врежится твоя сфера.
у нас случай что в 3D игре нужно перейти к столкновениям 2D тут наверное писекльный способ будет тормозить. И требовать дополнительных данных и просчетов контуров фигур.
Нужен или ненужен __stdcall?12 окт. 200616:08#4
dDIMA: предупреждение за флейм в тематическом форуме

Правка: 12 окт. 2006 22:33

Как рендерить большое кол-во деревьев с квадротрии11 окт. 200611:25#7
stim24
Правильно сказали тебе. после построения QuadOctree пройдись по массиву деревьев и узнай в какие узлы они попадают и поставь на них указатели. Есл ипопадает в несколько узлов отновременно то помести в какой-то один и веди список уже занесенных что-бы не заносить дважды.
Вообще почитай про SceneGraph очень красиво все реализуеться.

Правка QuadTree вместо Octree

Правка: 11 окт. 2006 11:25

Распределение памяти10 окт. 200610:50#9
_ace_
>бустовские пулы памяти годятся только для изучения но никак не для полноценного использования
можно поподробнее????
wglMakeCurrent( 0, 0 ); и wglDeleteContext( m_hglrc ); - выдаёт ошибку10 окт. 200610:27#2
Pa3DBaKp9IK
Может ты залез куда то за пределы памяти попытался удалить не сущесмтвующую текстуру и т.д. и вообще мало информации...
что делаешь в коде? какие функции вызываешь? попробуй методом исключения убрать все вызовы и вызови деинициализацию.
Проверка валидности девайса4 окт. 200617:57#25
Костян
>MS как обычно отожгли.
нет мне кажеться тут они правильно сделали... системное исключение Windows это не есть исключение языка С++.
я сразу отказался от перехвата через try...cacth(...)
а в не Win32 системах вообще ОС не кидают исключения.
Проверка валидности девайса4 окт. 200617:54#24
antber
попробуй так
void Func()
{
#ifdef _WIN32
  //указатель для отлова системных исключений
  _EXCEPTION_POINTERS *ep = NULL;
  __try {
#endif
HRESULT hr=-1;
hr = D3DXCreateTextureFromFile( m_pd3dDevice, filename, &m_pBaseTexture );
#ifdef _WIN32
  }
  //перехват системных исключений
  __except (ep = GetExceptionInformation(), EXCEPTION_EXECUTE_HANDLER) {
    if (ep) { // ну в общем он всегда валидный но всетаки...
      //пишем в буфер информацию о коде исключения, а адрес указателя, адрес инсттрукции
      console.AddMessage(Console::ERROR_MESSAGE, "%s%x%s%s%x%s%x%s", 
        Console::StdMessage[Console::FATAL_ERROR], 
        ep->ExceptionRecord->ExceptionCode, 
        ep->ExceptionRecord->ExceptionInformation[0] ? ",write " : ",read ", 
      "data adress: 0x", ep->ExceptionRecord->ExceptionInformation[1], 
      ",instruction adress: 0x", 
      ep->ExceptionRecord->ExceptionAddress, "\n");
    } 
    else {
      console.AddMessage(Console::ERROR_MESSAGE, "%s%x%s", 
        Console::StdMessage[Console::FATAL_ERROR], 
        GetExceptionCode(), "\n");

    }
Помогите переделать рендер через OpenGL Cal3D моделей через GL_ARB_vertex_buffer_object4 окт. 200613:09#8
Lion007
>а засада - вот здесь:
>зы : подобная фигня - слегствие грязно написанного кода - уж извини за лекторский тон... ну нафига у тебя столько раз считаются всякие смещения? тем более, что то >единственное, которое было нужно - ты уже сосчитал...
да надо перемнную завести и 1 раз просчтать...
да... запутался в смещениях
Спасибо большое!!!!!!!!!!!!!!
получилось!!! тема закрыта!!!
Проверка валидности девайса4 окт. 200612:55#16
Костян
>Вообще-то try catch должен ловить AV, щас проверил - в VC++ 7.1 всё отлично работает, а в 8.0 не хочет - ОС ловит AV, а catch никак не хочет.
используй __try...__except в Visual C++ 2005 теперь системные исключения не перехватываюся констукцией cacth(...)
Помогите переделать рендер через OpenGL Cal3D моделей через GL_ARB_vertex_buffer_object4 окт. 200612:12#6
Lion007
точно ты прав это я забыл вставить... но это не помогло :(
// adjust the vertex and face counter
      if (m_vertexCount + pCalRenderer->getVertexCount()>=50000) {
        m_vertexCount = 0;
      }
      if (m_faceCount + pCalRenderer->getFaceCount()>=30000) {
        m_faceCount = 0;
      }
      struct VERTEX {
        float pos[3];
        float normal[3];
        float tv[2];
      };
      VERTEX *pVertices = NULL;
....
// дяльше как обычно...
Помогите переделать рендер через OpenGL Cal3D моделей через GL_ARB_vertex_buffer_object4 окт. 200611:15#4
Lion007
>glEnableClientState(GL_TEXTURE_COORD_ARRAY); у тебя здесь есть... а где то же самое для GL_VERTEX_ARRAY и GL_NORMAL_ARRAY? я допускаю, что ты их поэнейблил в самом >начале, но это ниоткуда не следует...
правильно допускаешь я это сделал вначале
 // we will use vertex arrays, so enable them
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);

    // get the number of meshes
    int meshCount = pCalRenderer->getMeshCount();
 // render all meshes of the model
    for(int meshId = 0; meshId < meshCount; meshId++)
.... 
// далее все без изменений
>еще - как выглядит резервирование памяти под вертексный-индексный буфер?
if (glewInit() != GLEW_OK) {
    fprintf(stderr, "%s", "Error init OpenGL extensions!!!\n");
    return false;
  }
  unsigned int bufferId = 0;
  //получить идентификатор буфера  
  glGenBuffersARB (1, &bufferId);  
  //выбрать его
  glBindBufferARB(GL_ARRAY_BUFFER_ARB, bufferId);
  std::vector<VERTEX> vertices(30000);
  //проинициализировать
  glBufferDataARB(GL_ARRAY_BUFFER_ARB, vertices.size() * sizeof(VERTEX), &vertices[0], 
    GL_DYNAMIC_DRAW_ARB);
  m_pVB.SetBufferId(bufferId);
  //получить идентификатор буфера  
  glGenBuffersARB (1, &bufferId);  
  //выбрать его
  glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, bufferId);
  std::vector<CalIndex> indexs(50000*3*sizeof(CalIndex));
  //проинициализировать
  glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, indexs.size(), 
    &indexs[0], GL_DYNAMIC_DRAW_ARB);
  m_pIB.SetIndexBuffer(bufferId);
  glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
  glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);
  return true;
>и наконец - ты уверен, что у тебя Cal3D использует именно 32-битные индексы?
уверен вот сейчас в отладке проверил
sizeof(CalIndex) == 4
Помогите переделать рендер через OpenGL Cal3D моделей через GL_ARB_vertex_buffer_object4 окт. 200610:11#2
Lion007
>есть подозрение, что засада во втором glBindBufferARB(...) - в том который перед анмапом... то есть то, что он лишний - это стопудово, буфер биндится раз и навсегда, до >тех пор, пока ты не отменишь этот биндинг с помошью glBindBufferARB(..., 0)
1) я попробывал выбирать буфер 1 раз, это не помогло :(
2) так сделано к примеру в проекте OGRE:
//---------------------------------------------------------------------
  void GLHardwareVertexBuffer::unlockImpl(void)
    {
        glBindBufferARB(GL_ARRAY_BUFFER_ARB, mBufferId); // вот про это я имею ввиду

        if(!glUnmapBufferARB( GL_ARRAY_BUFFER_ARB ))
        {
            OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, 
                "Buffer data corrupted, please reload", 
                "GLHardwareVertexBuffer::unlock");
        }

        mIsLocked = false;
    }
//---------------------------------------------------------------------
  void GLHardwareIndexBuffer::unlockImpl(void)
    {
        glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, mBufferId );

        if(!glUnmapBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB ))
        {
            OGRE_EXCEPT(Exception::ERR_INTERNAL_ERROR, 
                "Buffer data corrupted, please reload", 
                "GLHardwareIndexBuffer::unlock");
        }

        mIsLocked = false;
    }
тоже самое я сделал у себя:
// разблокировка
void OpenGLVertexBuffer::UnLock()
{
  if (!isLocked) // если был не заблокирован
    return;
  if (!glMapBufferARB || !glBindBufferARB)
    return;
  glBindBufferARB( GL_ARRAY_BUFFER_ARB, bufferId);
  glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
  isLocked = false;
}
// разблокировка
void OpenGLIndexBuffer::UnLock()
{
  if (!isLocked) // если был не заблокирован
    return;
  if (!glMapBufferARB || !glBindBufferARB)
    return;
  glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, bufferId);
  glUnmapBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB);
  isLocked = false;
}
>кстати, не очень понятно, нафига в такой постановке тебе нужны смещения для разных субмешей...
так сделано в бибилиотеке. Вообще вот аналонгичный код для Direct3D с такими -же  операциями(названия переменных другие)
 if(m_VBCursor+ pCalRenderer->getVertexCount()>=30000)
      {
          m_VBCursor=0;
        dwVBLockFlags=D3DLOCK_DISCARD;
      }
      
      if(m_IBCursor + pCalRenderer->getFaceCount()>=50000)
      {
          m_IBCursor=0;
        dwIBLockFlags=D3DLOCK_DISCARD;

      }
      

      // Get vertexbuffer from the model            
      VERTEX *pVertices;

      m_pVB->Lock(m_VBCursor*sizeof(VERTEX), pCalRenderer->getVertexCount()*sizeof(VERTEX), (void**)&pVertices, dwVBLockFlags);

      int vertexCount = pCalRenderer->getVerticesNormalsAndTexCoords(&pVertices->pos.x);
      m_pVB->Unlock();
      
      CalIndex *meshFaces;

          int faceCount;

      m_pIB->Lock(m_IBCursor* 3*sizeof(CalIndex), pCalRenderer->getFaceCount()*3* sizeof(CalIndex), (void**)&meshFaces,dwIBLockFlags);

      faceCount = pCalRenderer->getFaces(meshFaces);
      m_pIB->Unlock();

Следующие темы >>

2001—2012 © GameDev.ru — Разработка игр