Сообщения на форуме пользователя Andrey (163 стр.)
Реакция на столкновение с произвольной областью(2D) | 16 окт. 2006 | 15:34 | #9 |
---|
DEN 3D
>Вначале проверяешь на столкновение ограничивающие прямоугольники -
>если есть пересечение - залазишь в память этих образов и проверяешь
>попиксельно двойным циклом - если в обеих образах цвет пикселя не
>равен цвету фона(цветового ключа) - значит есть столкновение!
угу а чтобы шустрей еще в шейдере это?
>DirectX.Графика в проектах Delphi.
мдя... помню в перлах была циатата из этой книги :)
>Вначале проверяешь на столкновение ограничивающие прямоугольники -
>если есть пересечение - залазишь в память этих образов и проверяешь
>попиксельно двойным циклом - если в обеих образах цвет пикселя не
>равен цвету фона(цветового ключа) - значит есть столкновение!
угу а чтобы шустрей еще в шейдере это?
>DirectX.Графика в проектах Delphi.
мдя... помню в перлах была циатата из этой книги :)
Модели *.x в OpenGL | 16 окт. 2006 | 15:12 | #1 |
---|
beetle2001
1) Тема уже была
2) нцжно ручками парсить x файл и писать загрузчик и аниматор.
3) посvотри в irrlicht-1.1 классы CXFileReader, CXMeshFileLoader может поможет.
1) Тема уже была
2) нцжно ручками парсить x файл и писать загрузчик и аниматор.
3) посvотри в irrlicht-1.1 классы CXFileReader, CXMeshFileLoader может поможет.
Реакция на столкновение с произвольной областью(2D) | 13 окт. 2006 | 10:26 | #5 |
---|
KKH
>то почему не разбить объект заранее и не упростить себе
нет еще ни редактора, нb автоматизированного способа разбиения тестируемых на коллизии объектов сцены. Все что сейчас имеется это отружить тестируемую область точками и получить массив координат этих точек.
>Еще способ, создать дополнительное, неотображаемое пространство, нарисовать в нем контуры фигур, и смотреть попиксельно, >куда врежится твоя сфера.
у нас случай что в 3D игре нужно перейти к столкновениям 2D тут наверное писекльный способ будет тормозить. И требовать дополнительных данных и просчетов контуров фигур.
>то почему не разбить объект заранее и не упростить себе
нет еще ни редактора, нb автоматизированного способа разбиения тестируемых на коллизии объектов сцены. Все что сейчас имеется это отружить тестируемую область точками и получить массив координат этих точек.
>Еще способ, создать дополнительное, неотображаемое пространство, нарисовать в нем контуры фигур, и смотреть попиксельно, >куда врежится твоя сфера.
у нас случай что в 3D игре нужно перейти к столкновениям 2D тут наверное писекльный способ будет тормозить. И требовать дополнительных данных и просчетов контуров фигур.
Нужен или ненужен __stdcall? | 12 окт. 2006 | 16:08 | #4 |
---|
dDIMA: предупреждение за флейм в тематическом форуме
Правка: 12 окт. 2006 22:33
Delphi, OpenGL и Видео! | 12 окт. 2006 | 13:49 | #1 |
---|
Как рендерить большое кол-во деревьев с квадротрии | 11 окт. 2006 | 11:25 | #7 |
---|
stim24
Правильно сказали тебе. после построения QuadOctree пройдись по массиву деревьев и узнай в какие узлы они попадают и поставь на них указатели. Есл ипопадает в несколько узлов отновременно то помести в какой-то один и веди список уже занесенных что-бы не заносить дважды.
Вообще почитай про SceneGraph очень красиво все реализуеться.
Правильно сказали тебе. после построения QuadOctree пройдись по массиву деревьев и узнай в какие узлы они попадают и поставь на них указатели. Есл ипопадает в несколько узлов отновременно то помести в какой-то один и веди список уже занесенных что-бы не заносить дважды.
Вообще почитай про SceneGraph очень красиво все реализуеться.
Правка QuadTree вместо Octree
Правка: 11 окт. 2006 11:25
Распределение памяти | 10 окт. 2006 | 10:50 | #9 |
---|
_ace_
>бустовские пулы памяти годятся только для изучения но никак не для полноценного использования
можно поподробнее????
>бустовские пулы памяти годятся только для изучения но никак не для полноценного использования
можно поподробнее????
wglMakeCurrent( 0, 0 ); и wglDeleteContext( m_hglrc ); - выдаёт ошибку | 10 окт. 2006 | 10:27 | #2 |
---|
Pa3DBaKp9IK
Может ты залез куда то за пределы памяти попытался удалить не сущесмтвующую текстуру и т.д. и вообще мало информации...
что делаешь в коде? какие функции вызываешь? попробуй методом исключения убрать все вызовы и вызови деинициализацию.
Может ты залез куда то за пределы памяти попытался удалить не сущесмтвующую текстуру и т.д. и вообще мало информации...
что делаешь в коде? какие функции вызываешь? попробуй методом исключения убрать все вызовы и вызови деинициализацию.
Проверка валидности девайса | 4 окт. 2006 | 17:57 | #25 |
---|
Костян
>MS как обычно отожгли.
нет мне кажеться тут они правильно сделали... системное исключение Windows это не есть исключение языка С++.
я сразу отказался от перехвата через try...cacth(...)
а в не Win32 системах вообще ОС не кидают исключения.
>MS как обычно отожгли.
нет мне кажеться тут они правильно сделали... системное исключение Windows это не есть исключение языка С++.
я сразу отказался от перехвата через try...cacth(...)
а в не Win32 системах вообще ОС не кидают исключения.
Проверка валидности девайса | 4 окт. 2006 | 17: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_object | 4 окт. 2006 | 13:09 | #8 |
---|
Lion007
>а засада - вот здесь:
>зы : подобная фигня - слегствие грязно написанного кода - уж извини за лекторский тон... ну нафига у тебя столько раз считаются всякие смещения? тем более, что то >единственное, которое было нужно - ты уже сосчитал...
да надо перемнную завести и 1 раз просчтать...
да... запутался в смещениях
Спасибо большое!!!!!!!!!!!!!!
получилось!!! тема закрыта!!!
>а засада - вот здесь:
>зы : подобная фигня - слегствие грязно написанного кода - уж извини за лекторский тон... ну нафига у тебя столько раз считаются всякие смещения? тем более, что то >единственное, которое было нужно - ты уже сосчитал...
да надо перемнную завести и 1 раз просчтать...
да... запутался в смещениях
Спасибо большое!!!!!!!!!!!!!!
получилось!!! тема закрыта!!!
Проверка валидности девайса | 4 окт. 2006 | 12:55 | #16 |
---|
Костян
>Вообще-то try catch должен ловить AV, щас проверил - в VC++ 7.1 всё отлично работает, а в 8.0 не хочет - ОС ловит AV, а catch никак не хочет.
используй __try...__except в Visual C++ 2005 теперь системные исключения не перехватываюся констукцией cacth(...)
>Вообще-то try catch должен ловить AV, щас проверил - в VC++ 7.1 всё отлично работает, а в 8.0 не хочет - ОС ловит AV, а catch никак не хочет.
используй __try...__except в Visual C++ 2005 теперь системные исключения не перехватываюся констукцией cacth(...)
Помогите переделать рендер через OpenGL Cal3D моделей через GL_ARB_vertex_buffer_object | 4 окт. 2006 | 12: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_object | 4 окт. 2006 | 11:15 | #4 |
---|
Lion007
>glEnableClientState(GL_TEXTURE_COORD_ARRAY); у тебя здесь есть... а где то же самое для GL_VERTEX_ARRAY и GL_NORMAL_ARRAY? я допускаю, что ты их поэнейблил в самом >начале, но это ниоткуда не следует...
правильно допускаешь я это сделал вначале
>еще - как выглядит резервирование памяти под вертексный-индексный буфер?
>и наконец - ты уверен, что у тебя Cal3D использует именно 32-битные индексы?
уверен вот сейчас в отладке проверил
sizeof(CalIndex) == 4
>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; |
уверен вот сейчас в отладке проверил
sizeof(CalIndex) == 4
Помогите переделать рендер через OpenGL Cal3D моделей через GL_ARB_vertex_buffer_object | 4 окт. 2006 | 10:11 | #2 |
---|
Lion007
>есть подозрение, что засада во втором glBindBufferARB(...) - в том который перед анмапом... то есть то, что он лишний - это стопудово, буфер биндится раз и навсегда, до >тех пор, пока ты не отменишь этот биндинг с помошью glBindBufferARB(..., 0)
1) я попробывал выбирать буфер 1 раз, это не помогло :(
2) так сделано к примеру в проекте OGRE:
тоже самое я сделал у себя:
>кстати, не очень понятно, нафига в такой постановке тебе нужны смещения для разных субмешей...
так сделано в бибилиотеке. Вообще вот аналонгичный код для Direct3D с такими -же операциями(названия переменных другие)
>есть подозрение, что засада во втором 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(); |