Я думал, что это будет просто и просто, но это не так. У меня есть камера в приложении openGL, и я преобразую отображаемое изображение соответственно в «местоположение» камеры. Местоположение изменяется на До и Вниз. Камера может быть повернута с использованием Слева и Право. Когда камера поворачивается, движение вперед и назад должно быть разным. Это то, что я сделал до:Перемещение камеры соответственно к ее местоположению
//Somewhere in event handler switch
else if (key == GLUT_KEY_UP|| key == GLUT_KEY_DOWN) {
char direction = key==GLUT_KEY_UP?1:-1; //Whether it is forward or backward movement
std::cout<<"Moving camera in direction "<<(int)direction<<" with angle "<<rotate_y<<'\n';
std::cout<<" - this means X is multiplied by "<<((sin((rotate_y/180)*M_PI)+1)/2)<<'\n';
camera_x += 0.5*((sin((rotate_y/180)*M_PI)+1)/2)*direction;
camera_z += 0.5*((cos((rotate_y/180)*M_PI)+1)/2)*direction;
}
оригинальный поворот в градусах, но sin()
от math.h
принимает радиан. Я добавляю 1 к результату, чтобы получить результаты между 0-2. Затем я изменяю амплитуду или cos
от 2 до 1, когда я делю результат на 2.
Это означает, что когда камера смотрит на 0, 90, 180, 270 или 360 градусов, функции должны возвращать 0-1 значения. Я прав?
0.5 в начале - это просто скорость движения.
Благодарим вас за это. Кажется, что мир OpenGL немного искажен, поэтому мне нужно было сделать «sin (360-angle)», чтобы получить желаемый результат. –