Хотел написать движок на OpenGL, а примитивная ходьба работает криво, как исправить?

Ссылка скопирована
1 ответ
void camera() {     if (GetKeyState(VK_UP) < 0)         rotateX = ++rotateX > 180 ? 180 : rotateX;     if (GetKeyState(VK_DOWN) < 0)         rotateX = --rotateX < 0 ? 0 : rotateX;     if (GetKeyState(VK_LEFT) < 0)         rotateZ++;     if (GetKeyState(VK_RIGHT) < 0)         rotateZ--;      float sinugol = sin(rotateZ * M_PI / 180);     float cosugol = cos(rotateZ * M_PI / 180);     float speed = 0;     if (GetKeyState('W') < 0)         speed = 0.1;     if (GetKeyState('S') < 0)         speed = -0.1;     if (sinugol < 0.5f && cosugol > 0.5f) {         sinugol = -sinugol;         cosugol = -cosugol;     }     if (sinugol < 0.5f && cosugol < 0.5f) {         sinugol = -sinugol;         cosugol = -cosugol;     }     if (sinugol > 0.5f && cosugol > 0.5f) {         sinugol = abs(sinugol);         cosugol = abs(cosugol);     }     if (sinugol > 0.5f && cosugol < 0.5f) {         sinugol = abs(sinugol);         cosugol = abs(cosugol);     }     if (speed != 0)      {         x += sinugol * speed;         y += cosugol * speed;     }      glRotatef(-rotateX, 1, 0, 0);     glRotatef(-rotateZ, 0, 0, 1);     glTranslatef(x, y, -3);     std::cout << sinugol << " " << cosugol << std::endl; }

void camera() { if (GetKeyState(VK_UP) < 0) rotateX = ++rotateX > 180 ? 180 : rotateX; if (GetKeyState(VK_DOWN) < 0) rotateX = --rotateX < 0 ? 0 : rotateX; if (GetKeyState(VK_LEFT) < 0) rotateZ++; if (GetKeyState(VK_RIGHT) < 0) rotateZ--; float sinugol = sin(rotateZ * M_PI / 180); float cosugol = cos(rotateZ * M_PI / 180); float speed = 0; if (GetKeyState('W') < 0) speed = 0.1; if (GetKeyState('S') < 0) speed = -0.1; if (sinugol < 0.5f && cosugol > 0.5f) { sinugol = -sinugol; cosugol = -cosugol; } if (sinugol < 0.5f && cosugol < 0.5f) { sinugol = -sinugol; cosugol = -cosugol; } if (sinugol > 0.5f && cosugol > 0.5f) { sinugol = abs(sinugol); cosugol = abs(cosugol); } if (sinugol > 0.5f && cosugol < 0.5f) { sinugol = abs(sinugol); cosugol = abs(cosugol); } if (speed != 0) { x += sinugol * speed; y += cosugol * speed; } glRotatef(-rotateX, 1, 0, 0); glRotatef(-rotateZ, 0, 0, 1); glTranslatef(x, y, -3); std::cout << sinugol << " " << cosugol << std::endl; }

что здесь не так?

Дополнительно:

А нам гадать, что криво работает? Скиньте код, который можно скомпилировать и посмотреть, что вообще происходит

Дебажить, конечно же. Взять бумажку и ручку/планшет и стилус или что там есть под рукой, расписать по шагам весь алгоритм, сделать вывод результатов каждого шага алгоритма в коде и сравнить как должно быть и что получилось.

  • да я уж всё вышеперечисленное перепробовал.
  • Значит недостаточно пробовали. Продолжайте дальше. Что-то где-то упускаете или еще что-то.
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Ольга Сеть Ответ

Для того чтобы улучшить примитивную ходьбу в своем движке на OpenGL, вам нужно применить правильные математические вычисления для перемещения объектов на экране. Вот несколько шагов, которые могут помочь вам исправить проблему:

1. Убедитесь, что вы правильно рассчитываете новые координаты объекта при каждом кадре. Для этого используйте формулу: новая_позиция = текущая_позиция + скорость * время_прошедшее_с_последнего_кадра.

2. Проверьте, что вы правильно обновляете матрицу проекции и видовой матрицы для корректного отображения объектов на экране. Убедитесь, что они корректно передаются в шейдерную программу.

3. Проверьте, что вы правильно настраиваете параметры камеры, такие как положение, направление взгляда и угол обзора. Это также может повлиять на качество ходьбы объектов на экране.

4. Используйте отладочные инструменты, такие как отладчик OpenGL или вывод логов, чтобы выявить возможные ошибки в вашем коде.

Приведенные выше шаги помогут вам улучшить примитивную ходьбу в вашем движке на OpenGL и создать более плавное и реалистичное движение объектов на экране. Если у вас есть конкретный код, с которым у вас возникают проблемы, пожалуйста, предоставьте его для более детального анализа и помощи.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно