Я пишу функцию для рисования цилиндра, центр каждой базы которого находится в определенной точке, используя конвейерные команды OpenGL и функцию gluCylinder()
.
В качестве первой попытки я просто попытался нарисовать цилиндр, и в результате получился цилиндр с нижним основанием в центре (0, 0, 0)
, а с другим основанием в центре (0, 0, height)
, где height
было передано в качестве аргумента функции.
Затем я попытался центрировать первую базу на первой выбранной точке, и все сработало как по маслу.
Теперь я изо всех сил пытаюсь получить правильное положение для второй точки: я вычислил расстояние между двумя точками и сохранил расстояние по каждой оси, чтобы получить разность векторов, поэтому все, что мне нужно сделать, это выполнить вращения так, что в любой системе отсчета ось цилиндра лежит на разности векторов двух точек.
Все-таки мне нужно найти координаты оси цилиндра и повернуть его, а как это сделать я не знаю.
Вот мой код, надеюсь, он будет полезен:
void drawCylinder(float pHeight, std::vector<float> center1, std::vector<float> center2) {
const GLfloat* projection = glm::value_ptr(glm::perspective(glm::radians(fov), (float)WIN_WIDTH / (float)WIN_HEIGHT, 0.1f, 100.0f));
const GLfloat* view = glm::value_ptr(camera.GetViewMatrix());
glm::vec3 diff = glm::vec3(center2[0] - center1[0], center2[1] - center1[1], center2[2] - center1[2]);
float distance = sqrt(pow(center2[0] - center1[0], 2) + pow(center2[1] - center1[1], 2) + pow(center2[2] - center1[2], 2));
glUseProgram(0);
glPushMatrix();
glMatrixMode(GL_PROJECTION);
glLoadMatrixf(projection);
glPushMatrix();
glMatrixMode(GL_MODELVIEW);
glLoadMatrixf(view);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glColor3f(1.0f, 1.0f, 0.0f);
glTranslated(center1[0] - 12.25f, (center1[1]) + 0.0f, (center1[2]) - 12.25f);
// Here I should perform the rotation in order to draw the cylinder in the right position
gluCylinder(quadric, 0.1f, 0.1f, pHeight, 32, 32);
glPopMatrix();
glMatrixMode(GL_PROJECTION);
glPopMatrix();
}
Я думал об обоих углах Эйлера и методах кватернионов, но я не могу понять, как использовать любой из них. Возможно, учитывая, что я использую метод конвейерных команд OpenGL, углы Эйлера были бы лучше. Тем не менее, если у вас есть лучший способ сделать все это, я буду рад узнать что-то новое.
Как я могу определить это вращение?
glRotate
послеglTranslate
. Или вы хотите вращаться вокруг определенного вектора? Кроме того, ваш вектор направления не нормализован. - person Constantinos Glynos   schedule 26.09.2019center1
иcenter2
. - person F. Màlato   schedule 26.09.2019glutInitContextProfile(GLUT_COMPATIBILITY_PROFILE)
передglutInitDisplayMode
), после чего вы сможете использовать Legacy OpenGL (glBegin
/glEnd
,glLoadMatrixf
,gluCylinder
, ...) - person Rabbid76   schedule 26.09.2019