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

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

1

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

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

По вопросам рекламы [email protected]