Многочисленные проблемы с вращением

Здесь моя проблема. Я должен двигать тор по круговой траектории на бикубической поверхности.

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

Чтобы справиться с этим, я взял вектор нормали и вектор Oy, сделал крест и точечное произведение, чтобы найти нужный мне угол и ось вращения вокруг, все работает.
Чтобы справиться со второй частью, я взял фактические координаты тора, следующие по круговой траектории, сделал вектор и сделал то же самое, как описано ранее, чтобы найти угол и ось, это работает.

Моя проблема в том, что я должен применить два поворота одновременно, и я не могу найти способ сделать это. Я пытался использовать Push / Pop Matrix всеми возможными способами, но я не могу найти выход из этого. Итак, я вернулся к этому …

    glPushMatrix();
glTranslatef(pp -> x, pp ->y , pp ->z);

glRotatef(*angledegree, vecortho -> x, vecortho -> y, vecortho -> z);
glRotatef(*angledegreetang, tang -> x, tang -> y, tang -> z);

tore(0.1, 0.3, 6, 4, 1);
repere(0.6);
glPopMatrix();

Есть идеи? Извините, что беспокою вас, это должно быть просто, я думаю, но я не вижу этого. Первый поворот всегда вызывает ошибку следующего, независимо от порядка.
vecortho — это вектор оси, вычисленный по нормали поверхности и Oy.
тан — это вектор, вычисленный с помощью моего вектора траектории и Ox.

0

Решение

Не думайте с точки зрения вращений. Просто подумайте с точки зрения осей.

Вы хотите, чтобы новая ось Y тора была переведена в определенное новое направление (вектор нормали), его новая ось Z была переведена в определенное новое направление (вектор вперед) и ось X, которая вас не интересует.

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

vector newY = normalVec;
vector newZ = forwardVec;
// We don't really care what X is, but it must be perpendicular to Y and Z. Swap Y and Z here if this ends up mirroring the object.
vector newX = normalize(cross(newY, newZ));

double matrix[16] = {
newX.x,  newX.y,  newX.z,  0,
newY.x,  newY.y,  newY.z,  0,
newZ.x,  newZ.y,  newZ.z,  0,
0,       0,       0,       1,
};
glPushMatrix();
glTranslatef(position of torus);
glMultMatrixd(matrix);
// draw torus
glPopMatrix();
0

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

Других решений пока нет …