2014-10-20 3 views
0

Я делаю 3D-моделирование движения частиц, и я хочу нарисовать стрелки, представляющие электрическое поле в определенных положениях. Я сделал стрелочную сетку в Blender и экспортировал ее как .obj, поэтому я могу использовать ее в своем коде (я сделал загрузчик .obj), но я не могу повернуть его правильно, чтобы он указывал в правильном направлении , хотя я проверил, что вектор электрического поля был рассчитан правильно. Я получаю некоторые странные результаты. Например, если вектор должен быть направлен вверх, он указывает вниз, но когда я прокомментирую код, который вращается по оси x, стрелка указывает вниз, как и предполагалось. Затем, если он должен указывать на право, он указывает внутрь (в сторону отрицательной оси z), но когда я прокомментирую поворот в оси y, он указывает на право.Как нарисовать 3D-вектор в OpenGL?

Вот мой код для вращения и визуализации стрелок:

void Render(Vector3 cameraPos) 
{ 
    glScalef(field.length() * ArrowLength,1.0,1.0); 
    glTranslatef(0,0,_zdefault); 
    glRotatef(Entity::yangle,0,1,0); 
    glTranslatef(pos.getX() + cameraPos.getX(), pos.getY() + cameraPos.getY(), pos.getZ() + cameraPos.getZ() - _zdefault); 

    glRotatef(atan2(field.getZ(),field.getY()) * 180/M_PI, 1.0,0.0,0.0); 
    glRotatef(atan2(field.getX(),field.getZ()) * 180/M_PI, 0.0,1.0,0.0); 
    glRotatef(atan2(field.getY(),field.getX()) * 180/M_PI, 0.0,0.0,1.0); 

    glBindTexture(GL_TEXTURE_2D,arrowTexture); 

    glCallList(arrow); 
    glLoadIdentity(); 
}; 

поля является вектором, который представляет собой электрическое поле. Линии

glTranslatef(0,0,_zdefault); 
glRotatef(Entity::yangle,0,1,0); 

Есть так, что я могу повернуть всю сцену, вроде как на орбите вокруг него в Blender. Кроме того, Vector3 - это просто класс Vector, который я написал с очень простой функциональностью. Как я уже сказал, нет никаких проблем с векторными вычислениями, я проверил это, я просто не могу использовать векторы для правильного поворота.

У меня есть чувство, что мои углы немного прищурены для glRotatef, где я использую atan2, но я до сих пор не могу понять, как это повлияет на повороты, как описано выше.

Есть ли способ повернуть что-то, основанное только на векторных компонентах?

+0

Вместо того, чтобы иметь дело с углами поворота, проще построить матрицу вращения. См. Мой ответ здесь, который был для той же проблемы: http://stackoverflow.com/questions/24705225/opengl-rotation-from-velocity-vector/24709587#24709587. –

+0

В каком направлении указана ваша нетрансформированная стрелка? Ответ выше для исходного вектора, указывающего в положительном z-направлении. Это должно быть легко адаптировать к вашей оригинальной стрелке, например. точек в направлении x. Но при необходимости я могу написать новую версию ответа. –

ответ

1

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

Кроме того, что лучше использовать lookAt преобразование с использованием field как ваше направление направления и некоторые вверх как up вектор

Для поворота всей сцены вы просто определить центр и повернуть все векторы вокруг, что с тем же трансформация после их перевода

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