Любые советы о том, как правильно вращать / переводить объект в opengl, пытаясь добиться следующего эффекта
Попытка сгенерировать рекурсивное дерево из линий. Моя текущая функция рисования не работает, как запланировано. Прежде чем я покажу проблему, вот код прорисовки:
void _generateTreeBranches(const Point3f& startPoint,
const Point3f& endPoint,
float rotation,
const int depth)
{
if(depth > MAX_DEPTH) return;
cout << "at depth = " << depth << endl;
if(depth == 0)glColor3f(0.0f,1.0f,0.0f);
else glColor3f(1.0f,1.0f,1.0f);
float distanceOfPoint = pointDistance(startPoint, endPoint);
glRotatef(rotation, 0.0f, 0.0f, 1.0f);
glTranslatef(-startPoint.x, 0.0f, 0.0f);
drawLine(startPoint, endPoint);
glTranslatef(startPoint.x, 0.0f, 0.0f);
glRotatef(-rotation, 0.0f, 0.0f, 1.0f);
const float nextLength = distanceOfPoint;
Point3f nextBranchStart = endPoint;
Point3f nextBranchEnd = {endPoint.x + nextLength,endPoint.y,endPoint.z};
_generateTreeBranches(nextBranchStart, nextBranchEnd,45.0f,depth+1);
Это привлекает что-то вроде этого
/__
в то время как я пытаюсь заставить его нарисовать что-то вроде
__/
Любая помощь в достижении вышеизложенного?
1 ответ
Мы не знаем состояние матрицы вида модели в вызывающей точке, поэтому назовем ее MV
Первый вызов (порядок матричных операций)
T = Перевести на -x
R = повернуть на r
ТРАНСФОРМАЦИЯ = MV(R(T(v)))
РИСОВАТЬ
Второй вызов (порядок матричных операций)
T = Перевести на -x2
R = повернуть на r2
НАЧНИТЕ С ПЕРВОГО ВЫЗОВА
Rm1 = повернуть на -r
Tm1 = Перевести на х
Tm2 = Перевести на -x
Rm2 = повернуть на r
КОНЕЦ ОТ ПЕРВОГО ВЫЗОВА
ТРАНСФОРМАЦИЯ = MV(Rm2(Tm2(Tm1(Rm1(R(T(v))))))))
РИСОВАТЬ
Как видите, вы вращаете переведенные и повернутые значения. после этого вы пытаетесь отменить то, что больше не может быть отменено.
Таким образом, в зависимости от значения MV и r может произойти все что угодно.
Если вы хотите отменить матричные операции, используйте glPush/PopMatrix, а не обратную операцию, которая просто выдаст ошибки с плавающей запятой в лучшем случае и то, что вы видите в рекурсивном случае.
Для того, что вы пытаетесь сделать, первое вращение должно быть 0, и вы должны убедиться, что матрица просмотра модели является Identity, и использовать glPush/PopMatrix
Также - если ваш реальный код на самом деле не нуждается в циклах рекурсии.