Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[52.15.241.105] |
|
Сообщ.
#1
,
|
|
|
У меня аналогичная программа плохо работает:
Неправдоподобное отображение за счёт неправильных значений для проекций и камер левого и правого глаз. Ошибки в цифрах этого кода: GLdouble Xmin = -150.0; GLdouble Xmax = 150.0; GLfloat eyeOffset = GLfloat(Xmax-Xmin)*0.035f*2.0f; GLdouble FrustumAssymmetry = 0.01*eyeOffset/(Xmax-Xmin)*2.0f; GLfloat PULL_BACK = 0.0f; ///////////////////////////////// RENDER SCENE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\* ///// ///// This function renders the entire scene. ///// ///////////////////////////////// RENDER SCENE \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\* void RenderScene() { // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer //*/ glDrawBuffer(GL_BACK_LEFT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer // Setup the frustum for the left eye glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(Xmin - FrustumAssymmetry, Xmax - FrustumAssymmetry, -0.75, 0.75, 0.65, 4.0); glTranslatef(eyeOffset, 0.0f, 0.0f); //*/ glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Reset The matrix // Tell OpenGL where to point the camera g_Camera_left.Look(); //bool clear_current_sector = false; Draw3DFloor(back_left); Draw3DWalls(back_left); Draw3DRoof(back_left); glDrawBuffer(GL_BACK_RIGHT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer // Setup the frustum for the right eye. glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(Xmin + FrustumAssymmetry, Xmax + FrustumAssymmetry, -0.75, 0.75, 0.65, 4.0); glTranslatef(-eyeOffset, 0.0f, 0.0f); glTranslatef(0.0f, 0.0f, -PULL_BACK); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Reset The matrix // Tell OpenGL where to point the camera g_Camera_right.Look(); Draw3DFloor(back_right); Draw3DWalls(back_right); Draw3DRoof(back_right); //*/ // Swap the backbuffers to the foreground SwapBuffers(g_hDC); } Ошибки в константах в верхней части кода. На рисунке расстояние между стенами 4*25. Реально это порядка 25 метров. А из констант вроде бы выходит, что расстояние между глазами (камерами) примерно 150/4 метров. 150 ярдов - значение, при котором есть адекватная картинка. Расстояние между потолком и полом, которого не видно, 10 ярдов (2.5 метра). Прикреплённая картинка
|
Сообщ.
#3
,
|
|
|
Вот посмотри мою программу. ftp://ftp.stl-galaxy.by/Games.rar Проблема именно в квадро буфере. Управление: W - вперёд S - назад A - влево D - вправо Проект на студии 11 (2012 года выпуска) |
Сообщ.
#4
,
|
|
|
посмотрел...
вижу 4-5 разных функций рисования там просто надо отладить координаты,че хотел сделать этими розами и плоскостями? напутаны координаты,надо 25 раз отрегулиривать и перекомпилировать с самого начала идти ,закомменировать пару рисований и искать где эти 2 плоскости рисуются,и регулировать нормальное перемещение я не могу в таком составе перекомпилировать - ты архив дал без главного ярлыка,сам корень проекта не дал |
Сообщ.
#5
,
|
|
|
Вот главная функция рисования:
void RenderScene() { // glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer //*/ glDrawBuffer(GL_BACK_LEFT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer // Setup the frustum for the left eye glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(Xmin - FrustumAssymmetry, Xmax - FrustumAssymmetry, -0.75, 0.75, 0.65, 4.0); glTranslatef(eyeOffset, 0.0f, 0.0f); //*/ glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Reset The matrix // Tell OpenGL where to point the camera g_Camera_left.Look(); //bool clear_current_sector = false; Draw3DFloor(back_left); Draw3DWalls(back_left); Draw3DRoof(back_left); //if(!g_sector) //{ // g_sector_number = 1; // g_sector = (SECTOR**)malloc(maximum_sector_number*sizeof(SECTOR*)); // for(unsigned int sector_counter=0;sector_counter<maximum_sector_number;sector_counter++) // { // g_sector[sector_counter] = NULL; // } // if(g_sector_number<maximum_sector_number) // { // g_sector[g_sector_number] = Load3DSector("sector1.txt"); // } //} //if(g_sector) //{ // if(g_sector_number<maximum_sector_number) // { // if(g_sector[g_sector_number]) // { // Draw3DSector(g_sector[g_sector_number]); // } // } //} //if(g_sector && clear_current_sector) //{ // if(g_sector_number<maximum_sector_number) // { // if(g_sector[g_sector_number]->quads) // free(g_sector[g_sector_number]->quads); // free(g_sector[g_sector_number]); // g_sector[g_sector_number] = NULL; // } //} // Draw the pyramids that spiral in to the center //DrawSpiralTowers(); //*/ glDrawBuffer(GL_BACK_RIGHT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer // Setup the frustum for the right eye. glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(Xmin + FrustumAssymmetry, Xmax + FrustumAssymmetry, -0.75, 0.75, 0.65, 4.0); glTranslatef(-eyeOffset, 0.0f, 0.0f); glTranslatef(0.0f, 0.0f, -PULL_BACK); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Reset The matrix // Tell OpenGL where to point the camera g_Camera_right.Look(); Draw3DFloor(back_right); Draw3DWalls(back_right); Draw3DRoof(back_right); //*/ // Swap the backbuffers to the foreground SwapBuffers(g_hDC); } Проблема здесь в цифрах и переменных: // Setup the frustum for the left eye glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(Xmin - FrustumAssymmetry, Xmax - FrustumAssymmetry, -0.75, 0.75, 0.65, 4.0); glTranslatef(eyeOffset, 0.0f, 0.0f); // Setup the frustum for the right eye. glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(Xmin + FrustumAssymmetry, Xmax + FrustumAssymmetry, -0.75, 0.75, 0.65, 4.0); glTranslatef(-eyeOffset, 0.0f, 0.0f); glTranslatef(0.0f, 0.0f, -PULL_BACK); Добавлено Если закомментировать рисование для правого глаза, то нормально работает. Добавлено По этим плоскостям бегает камера. Как бы вид от первого лица. Там помещение из пола, стен и крыши. Розы - обои стен. Елочки - плитка пола и потолка. Добавлено И ещё есть 2 входа. Добавлено Вот так рисование в двойном буфера (без стерео 3D): void RenderScene() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer /*/ glDrawBuffer(GL_BACK_LEFT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer // Setup the frustum for the left eye glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(Xmin - FrustumAssymmetry, Xmax - FrustumAssymmetry, -0.75, 0.75, 0.65, 4.0); glTranslatef(eyeOffset, 0.0f, 0.0f); //*/ glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Reset The matrix // Tell OpenGL where to point the camera g_Camera_left.Look(); //bool clear_current_sector = false; Draw3DFloor(back_left); Draw3DWalls(back_left); Draw3DRoof(back_left); //if(!g_sector) //{ // g_sector_number = 1; // g_sector = (SECTOR**)malloc(maximum_sector_number*sizeof(SECTOR*)); // for(unsigned int sector_counter=0;sector_counter<maximum_sector_number;sector_counter++) // { // g_sector[sector_counter] = NULL; // } // if(g_sector_number<maximum_sector_number) // { // g_sector[g_sector_number] = Load3DSector("sector1.txt"); // } //} //if(g_sector) //{ // if(g_sector_number<maximum_sector_number) // { // if(g_sector[g_sector_number]) // { // Draw3DSector(g_sector[g_sector_number]); // } // } //} //if(g_sector && clear_current_sector) //{ // if(g_sector_number<maximum_sector_number) // { // if(g_sector[g_sector_number]->quads) // free(g_sector[g_sector_number]->quads); // free(g_sector[g_sector_number]); // g_sector[g_sector_number] = NULL; // } //} // Draw the pyramids that spiral in to the center //DrawSpiralTowers(); /*/ glDrawBuffer(GL_BACK_RIGHT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer // Setup the frustum for the right eye. glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(Xmin + FrustumAssymmetry, Xmax + FrustumAssymmetry, -0.75, 0.75, 0.65, 4.0); glTranslatef(-eyeOffset, 0.0f, 0.0f); glTranslatef(0.0f, 0.0f, -PULL_BACK); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); // Reset The matrix // Tell OpenGL where to point the camera g_Camera_right.Look(); Draw3DFloor(back_right); Draw3DWalls(back_right); Draw3DRoof(back_right); //*/ // Swap the backbuffers to the foreground SwapBuffers(g_hDC); } Добавлено И еще надо отключить | PFD_STEREO В bool bSetupPixelFormat(HDC hdc) pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER | PFD_STEREO; Добавлено Корневой каталог: Year. Вот проект без стерео (закомметированно стерео): ftp://ftp.stl-galaxy.by/Year_without_stereo_3d.rar |
Сообщ.
#6
,
|
|
|
Прикреплённая картинка
Добавлено Ты работал раньше с квадро буфером? Добавлено Куда-то делось руководство по программированию 3D Stereo. Искал по словам "NVIDIA 3D Vision Stereo OpenGL presentation". Безрезультатно. В общем что-то с цифрами при работе с матрицей проекций. Какие проблемы при построении проекта? Добавлено Хотел сделать программу, в которой можно ходить по моему городу по всем зданиям, заходить в каждое здание и смотреть, что там есть: "Виртуальная копия города". Например для экскурсий или для игр разных. Добавлено Это моя идея: "Все права защищены © STL Galaxy. 2004" |
Сообщ.
#7
,
|
|
|
XSB-M
Ты пробуешь мою программу с квадра буфером подправить? |