OpenGl нарисовать цилиндр с 2 очками glRotated

Я хочу показать нарисуйте цилиндр, который начинается в точке а, и это указывает на то, что я думаю, что ключ находится в первом glRotated, но я впервые работаю с openGL
А и В являются btVector3

glPushMatrix();
glTranslatef(a.x(), a.y(), a.z());
glRotated(0, b.x(), b.y(), b.z());
glutSolidCylinder(.01, .10 ,20,20);
glPopMatrix();

Какие-либо предложения ??

-1

Решение

В соответствии с glutsolidcylinder (3) — справочная страница по Linux:

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

Следовательно, вы должны подготовить преобразования соответственно:

  • переместить центр цилиндра в начало координат (это ( + б) / 2)
  • повернуть эту ось цилиндра (это б) становится осью Z.

Использование glRotatef() кажется неправильно понятым, также:

  • 1-е значение — угол поворота, в градусах
  • 2-е, 3-е и 4-е значения — это x, y, z оси вращения.

Это приведет к:

// center of cylinder
const btVector3 c = 0.5 * (a + b);
// axis of cylinder
const btVector3 axis = b - a;
// determine angle between axis of cylinder and z-axis
const btVector3 zAxis(0.0, 0.0, 1.0);
const btScalar angle = zAxis.angle(axis);
// determine rotation axis to turn axis of cylinder to z-axis
const btVector3 axisT = zAxis.cross(axis).normalize();
// do transformations
glTranslatef(c.x(), c.y(), c.z());
if (axisT.norm() > 1E-6) { // skip this if axis and z-axis are parallel
const GLfloat radToDeg = 180.0f / 3.141593f;
glRotatef(angle * radToDeg, axisT.x(), axisT.y(), axisT.z());
}
glutSolidCylinder(0.1, axis.length(), 20, 20);

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

Поэтому, пожалуйста, имейте в виду следующее:

  1. Док. не упоминает ли btVector3::angle() возвращает угол в градусах или радианах — я принял радианы.

  2. При написании такого кода я часто случайно переворачиваю вещи (например, вращение в противоположном направлении). Такие вещи я обычно исправляю при отладке, и это, вероятно, необходимо для приведенного выше примера кода.

  3. Если (б) уже вдоль положительной или отрицательной оси Z, то (б) × (0, 0, 1) даст 0-вектор. К сожалению, док. из btVector3::normalize() не упоминается, что происходит при применении к 0-вектору. Если в этом случае выдается исключение, конечно, необходимо добавить дополнительные проверки.

0

Другие решения

Ваш поворот ничего не делает, так как вы поворачиваетесь на 0 градусов.

Вы хотите, чтобы ось z указывала в направлении b.
Для этого нужно вычислить угол между осью z (0,0,1) и нормой (b — a) (то есть arccos(z dot norm(b - a))) и вам нужно повернуть это количество вокруг перекрестного произведения между осью z и b — a. В вашей векторной библиотеке должны быть реализованы эти методы (точечные и перекрестные произведения).

norm (x) — нормализованная версия x, длина которой равна 1.

0

По вопросам рекламы [email protected]