Любые советы о том, как правильно вращать / переводить объект в 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

Также - если ваш реальный код на самом деле не нуждается в циклах рекурсии.

Другие вопросы по тегам