1

尝试生成由线条组成的递归树。我当前的绘图功能没有按计划工作。在我在这里展示问题之前是绘制代码:

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);

画出这样的东西

 /__

而我试图让它画出这样的东西

__/

对实现上述目标有任何帮助吗?

4

1 回答 1

1

我们不知道调用点的模型视图矩阵的状态,所以我们称它为 MV

第一次调用(矩阵运算的顺序)

T = 平移 -x
R = 旋转 r
TRANSFORMATION = MV(R(T(v)))
DRAW

第二次调用(矩阵运算的顺序)

T = 平移 -x2
R = 旋转 r2

从第一个调用开始
Rm1 = 旋转 -r
Tm1 = 平移 x
Tm2 = 平移 -x
Rm2 = 旋转 r从第
一个调用结束

变换 = MV(Rm2(Tm2(Tm1(Rm1(R(T(v)))))))
绘制

如您所见,您正在旋转平移和旋转的值。之后,您试图撤消无法再撤消的事情。

因此,根据 MV 和 r 的值,可能会发生各种事情。

如果要撤消矩阵操作,请使用 glPush/PopMatrix 而不是操作的逆操作,这只会在最好的情况下产生浮点错误,而在递归情况下会产生什么。

对于你想要做的第一次旋转应该是 0,你必须确保模型视图矩阵是 Identity,并使用 glPush/PopMatrix

另外-除非您的真实代码实际上需要递归使用循环。

于 2012-10-30T10:25:20.477 回答