Здесь моя проблема. Я должен двигать тор по круговой траектории на бикубической поверхности.
Однако вертикальная ось тора должна быть выровнена с нормалью поверхности в данной точке. Кроме того, тор должен быть направлен по круговой траектории.
Чтобы справиться с этим, я взял вектор нормали и вектор 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.
Не думайте с точки зрения вращений. Просто подумайте с точки зрения осей.
Вы хотите, чтобы новая ось 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();
Других решений пока нет …