2013-08-19 2 views
0

Привет, я работаю над проектом, и у меня возникла проблема Экран/земля дрожит, когда я переместил главный объект.Экран трясет, когда объект перемещается

Обычно, когда я переехал с кнопкой «w», я не получаю проблемы. Но если вы двигаетесь во время вращения камеры, у меня возникла проблема.

Чтобы увидеть: укажите степень 30 с помощью правой кнопки мыши. (Не отпустите кнопку) и держите кнопку w во время вращения объекта. вы увидите тряску на земле.

Я думаю, проблема в том, что мой расчет функции looat.

gluLookAt(sin(rot*PI/180)*(10-fabs(roty)/4) +movex ,3-(roty/2), cos(rot*PI/180)*(10-(fabs(roty)/4)) +movez , -sin(rot*PI/180)*6 + movex, roty, -cos(rot*PI/180)*6 +movez, 0, 1, 0); 

Вот моя функция вращения. Я рисую все после этой функции.

void System::rotater(){ 

if(mouseStates[2][0]==1 && mx!= savex && mx!=mouseStates[2][1]){ 
    rot += (mx-mouseStates[2][1]) * 90/glutGet(GLUT_WINDOW_WIDTH)/2; 
    if(rot>360)rot-=360; 
    if(rot<0)rot= 360+rot; 

} 


glRotatef(rot,0,1,0); 
} 

И последний мой вариант перемещения здесь:

if(a==87 || a==119){ 
movex -= sin(rot*PI/180)/3; 
movez -= cos(rot*PI/180)/3; 
} 
+5

Пожалуйста, не заставляйте людей загружать и выполнять неизвестные двоичные файлы. Поставьте полный исходный код через pastebin или репозиторий на gitourious, github и т. Д., Если нужно. ** НО БЕЗ БИНАРНЫХ ИСПОЛНЕНИЙ! ** – datenwolf

+0

Хорошо, я отредактировал и добавил полный источник. – nadirg

+0

Я думаю, что проблема касается функций sinus cosinus. Потому что я не могу видеть тряску без них gluLookAt (movex, 3- (roty/2), movez +5, movex, roty, movez, 0, 1, 0); , но мне нужно, чтобы они следовали за объектом сзади. – nadirg

ответ

0

Я нашел видел экран встряхивания вопросы, как правило, связаны с порядком, в котором обрабатывать события, объекты обновления и камеры до рисование сцены (или физический движок вызывает ее: P). С высокой частотой кадров вы можете не заметить небольшие недостатки. Возможно, вы захотите добавить Sleep/usleep, чтобы помочь выявить эти проблемы. Например, если ваше положение камеры основано на вращении камеры, но вы обновляете положение перед обработкой событий мыши, положение камеры/вращение может быть не синхронизированным.

Это хорошая причина для обработки входов, перемещения и рендеринга в очень разных стадиях.

Ваш внешний вид выглядит довольно сложным. lookAt очень полезно, когда вы хотите камеру, которая смотрит на что-то, но в этом случае вы находитесь за камерой, которая выглядит с позиции камеры. Это проще реализовать, вручную построив обратные преобразования, чтобы позиционировать объект камеры, прежде чем рисовать sceene. Например, если вы хотите переместить влево, переведите все остальное вправо (таким образом, обратное) ...

glLoadIdentity(); 
glRotatef(camera.rotX, 1.0f, 0.0f, 0.0f); 
glRotatef(camera.rotY, 0.0f, 1.0f, 0.0f); 
glRotatef(camera.rotZ, 0.0f, 0.0f, 1.0f); 
glTranslatef(-camera.posX, -camera.posY, -camera.posZ); 
+0

Я обновил игру перед тем, как нарисовать, но результат такой же. Я думал, что, когда я работаю со многими моделью/объектом, система камеры, которую вы указали, вызовет лаг ?. Программа переведет все объекты, когда я перейду. Потому что программа переводит землю. – nadirg

+0

Вот как реализованы камеры. Вызов gluLookAt применяет преобразование к матрице просмотра модели аналогичным образом - перемещение всех объектов в сцене. Это не так дорого, поскольку все эти операции объединены в единую матрицу моделей 4x4, которая используется для преобразования всего, что вы рисуете. Что касается тряски, я могу только предположить, что все еще есть проблема с порядком, в котором вещи обновляются и рисуются, не видя вашей основной структуры цикла. – jozxyqk

Смежные вопросы