2013-03-31 4 views
0

Я думал, что это будет просто и просто, но это не так. У меня есть камера в приложении 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 в начале - это просто скорость движения.

ответ

0

Я не думаю, что вы хотите выход sin/cos быть в диапазоне 0 - 1.

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

 
Direction Angle Vector Your Vector Actual Direction 
N   0  0, 1 0.5, 1  ~NNE 
E   90  1, 0 1 , 0.5  ~ENE 
S   180  0, -1 0.5, 0  E 
W   270  -1, 0 0 , 0.5  N 

Обратите внимание, что вы можете генерировать только направления в одном квадранте (потому что ваш результат всегда положительный) и что ни один из них не является тем, чего вы хотели.

+0

Благодарим вас за это. Кажется, что мир OpenGL немного искажен, поэтому мне нужно было сделать «sin (360-angle)», чтобы получить желаемый результат. –