Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.06.2020, 12:14   #1
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию неадекватная камера OpenGL

Здравствуйте.
Делаю камеру в новом OpenGL (тот который с шейдерами и матрицами). Написал структуру камеры:
Код:
struct CAMERA
{
    glm::vec3 position = glm::vec3(0.0f, 0.0f, 0.0f);
    glm::vec3 rotation = glm::vec3(0.0f, 0.0f, 0.0f);
    glm::vec3 front = glm::vec3(cos(glm::radians(rotation.x - 90.0f)) * cos(glm::radians(rotation.y)),
                                sin(glm::radians(rotation.y)),
                                sin(glm::radians(rotation.x - 90.0f)) * cos(glm::radians(rotation.y)));
    glm::vec3 direction = glm::normalize(position - front);
    glm::vec3 upVector = glm::vec3(0.0f, 1.0f, 0.0f);
    glm::vec3 right = glm::normalize(glm::cross(upVector, direction));
    glm::vec3 cameraUp = glm::cross(direction, right);
};
CAMERA camera;
Если поле rotation установлено в [0,0,0], то всё нормально работает.
А если начать изменять rotation, например сделать его [0,-89,0], чтобы камера изначально смотрела вниз, то при движении мыши камеру начинает жёстко колбасить. Как наркомэна после дозы.
Такое ощущение, что неправильно вычисляются upVector / right / cameraUp. Как их правильно вычислить в зависимости от rotation?
BLACK_RAIN вне форума Ответить с цитированием
Старый 23.06.2020, 15:19   #2
BLACK_RAIN
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 867
По умолчанию

Вот как всегда. Тему создал и через два часа сам разобрался.
В функцию LookAt надо передавать upVector, который выглядит вот так:
Код:
  glm::vec3 upVector(0.0f, 1.0f, 0.0f);
а я передавал туда, как написано на хаброхабре. Там они вводят "ОБЯЗАТЕЛЬНУЮ" переменную:
Код:
glm::vec3 cameraUp = glm::cross(cameraDirection, cameraRight);
а потом меняют ее на
Код:
  glm::vec3 up(0.0f, 1.0f, 0.0f);
это меня и запутало. Написано вроде грамотно, но без тыка хрен разберёшься.
Зачем тогда они вводят переменную cameraUp, если потом нигде ее не используют?
И еще переменная cameraRight. Они ее тоже вводят и не используют. Для чего нужны эти переменные?

Последний раз редактировалось BLACK_RAIN; 23.06.2020 в 15:33.
BLACK_RAIN вне форума Ответить с цитированием
Старый 23.06.2020, 18:00   #3
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

http://blog.wolfire.com/2010/07/Line...elopers-part-4

Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 23.06.2020 в 18:09.
Pavia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Камера в OpenGL SerEngine Помощь студентам 0 28.10.2017 17:23
Нужна камера для 3d игры (Delphi+OpenGL) от 1-го лица. vovken1997 Gamedev - cоздание игр: Unity, OpenGL, DirectX 4 18.04.2012 20:30
Камера opengl 2d gufon Мультимедиа в Delphi 1 09.03.2012 16:42
Неадекватная работа TextWidth finder_sl Помощь студентам 4 22.06.2010 21:08
Камера в OpenGL. Подскажите. spamer Общие вопросы Delphi 0 06.05.2009 23:45