Попытка сгенерировать рекурсивное дерево из линий. Моя текущая функция рисования не работает, как запланировано. Прежде чем я покажу проблему, вот код прорисовки:
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);
Это привлекает что-то вроде этого
/__
в то время как я пытаюсь заставить его нарисовать что-то вроде
__/
Любая помощь в достижении вышеизложенного?
Мы не знаем состояние матрицы вида модели в вызывающей точке, поэтому назовем ее 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
Также — если ваш реальный код на самом деле не нуждается в циклах рекурсии.
Других решений пока нет …