Создание фрактального дерева в opengl

Возникли небольшие проблемы при создании фрактала в opengl. Вот мой текущий код

void generateTree(){
Point3f startPoint({0.0f,0.0f,0.0f});
Point3f endPoint({1.0f,0.0f,0.0f});
float rotation = 90.0f;
glutWireSphere(0.05, 4, 4);
_generateTreeBranches(startPoint,1.0f,rotation,0);
}

void _generateTreeBranches(const Point3f& newPosition,
float length,
float rotation,
const int depth)
{
if(depth > MAX_DEPTH) return;
cout << "at depth = " << depth << endl;if(depth == 0){
glColor3f(1.0f,1.0f,1.0f);
}else if(depth == 1){
glColor3f(1.0f,0.0f,0.0f);
}else{
glColor3f(0.0f,1.0f,0.0f);
}

glTranslatef(newPosition.x,newPosition.y,newPosition.z);
glRotatef(rotation, 0.0f, 0.0f, 1.0f);
drawLine(length);
glRotatef(-rotation, 0.0f, 0.0f, 1.0f);
glTranslatef(-newPosition.x,-newPosition.y,-newPosition.z);const float newLength = length * BRANCH_LENGTH_DECREASE_FACTOR;
int nextDepth = depth + 1;
Point3f nextPosition = {newPosition.x+length, newPosition.y, newPosition.z};

float leftRotation = rotation + CHILD_BRANCH_ANGLE * nextDepth;
_generateTreeBranches(nextPosition,newLength,leftRotation,nextDepth);

float rightRotation = rotation - CHILD_BRANCH_ANGLE * nextDepth;
_generateTreeBranches(nextPosition,newLength,rightRotation,nextDepth);

}

Положение не является правильным, хотя вращение кажется правильным. Новые ветви не рисуются, начиная с конечной точки родительской ветви. Может кто-нибудь помочь мне решить эту проблему. Проверьте полный код Вот

1

Решение

Формула для nextPosition является неверной, поскольку она не учитывает направление, в котором находится текущая ветвь

 Point3f nextPosition = {newPosition.x+length, newPosition.y, newPosition.z};

Это должно быть что-то вроде этого (пожалуйста, проверьте точно):

Point3f nextPosition = {newPosition.x+length*cos(rotation), newPosition.y+length*sin(rotation), newPosition.z};

Также, пожалуйста, используйте glLoadIdentity () для немедленного сброса матрицы:

glTranslatef(newPosition.x,newPosition.y,newPosition.z);
glRotatef(rotation, 0.0f, 0.0f, 1.0f);
drawLine(length);
glLoadIdentity();

Это будет намного яснее, чем то, что вы пытаетесь сделать.

1

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

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

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