Я хочу показать нарисуйте цилиндр, который начинается в точке а, и это указывает на то, что я думаю, что ключ находится в первом 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();
Какие-либо предложения ??
В соответствии с glutsolidcylinder (3) — справочная страница по Linux:
glutSolidCylinder () рисует заштрихованный цилиндр, центр основания которого находится в начале координат, а ось которого находится вдоль положительной оси z.
Следовательно, вы должны подготовить преобразования соответственно:
Использование glRotatef()
кажется неправильно понятым, также:
Это приведет к:
// 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
который я никогда не использовал раньше). Таким образом, пожалуйста, возьмите это с зерном соли. (Отладка может быть необходима.)
Поэтому, пожалуйста, имейте в виду следующее:
Док. не упоминает ли btVector3::angle()
возвращает угол в градусах или радианах — я принял радианы.
При написании такого кода я часто случайно переворачиваю вещи (например, вращение в противоположном направлении). Такие вещи я обычно исправляю при отладке, и это, вероятно, необходимо для приведенного выше примера кода.
Если (б — ) уже вдоль положительной или отрицательной оси Z, то (б — ) × (0, 0, 1) даст 0-вектор. К сожалению, док. из btVector3::normalize()
не упоминается, что происходит при применении к 0-вектору. Если в этом случае выдается исключение, конечно, необходимо добавить дополнительные проверки.
Ваш поворот ничего не делает, так как вы поворачиваетесь на 0 градусов.
Вы хотите, чтобы ось z указывала в направлении b.
Для этого нужно вычислить угол между осью z (0,0,1) и нормой (b — a) (то есть arccos(z dot norm(b - a))
) и вам нужно повернуть это количество вокруг перекрестного произведения между осью z и b — a. В вашей векторной библиотеке должны быть реализованы эти методы (точечные и перекрестные произведения).
norm (x) — нормализованная версия x, длина которой равна 1.