2012-10-30 49 views
1

嘗試生成由線組成的遞歸樹。我目前的抽獎功能沒有按計劃進行。我演出之前這裏的問題是抽獎代碼:任何有關如何在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

你有沒有嘗試顛倒你的轉換順序?我發現,由於OpenGL處理​​它們的方式,我經常會讓它們倒退,而我往往會想到它們。 – user1118321

+0

是的,我認爲我擁有它的方式是在這種情況下opengl的正確順序。如果我繪製了drawLine在原點附近繪製的位置,那麼順序將會顛倒。 – dchhetri

+1

用手做數學運算並使用座標系將其繪製在紙上。 – molbdnilo

回答

1

我們不知道在調用點的模型視圖矩陣的狀態,讓我們把它叫做MV

首先調用(矩陣的運算順序)

T = -x通過翻譯
R =由R
變換旋轉= MV(R(T(v)))
DRAW

第二呼叫(矩陣運算的順序)

T =翻譯由-x2
R =旋轉由R2

START FROM第一呼叫
器Rm1 =旋轉通過-r
TM1 =翻譯通過x-
TM2 =由-x
器Rm2翻譯=旋轉用r
END FROM第一呼叫

變換= MV(器Rm2(TM2(TM1器(RM1(R(T(v)))))))
DRAW

正如你所看到的,你正在旋轉翻譯和旋轉的值。之後,你正試圖撤銷一些不能撤銷的東西。

因此,根據MV和r的價值,可能會發生所有類型的事情。

如果要撤消矩陣運算,請使用glPush/PopMatrix而不是在最佳情況下會產生浮點錯誤的操作的逆轉以及您在遞歸情況下看到的結果。

對於你正在嘗試做的第一旋轉應該是0,你必須確保在模型視圖矩陣是一種身份,並使用glPush/PopMatrix

而且 - 除非你真正的代碼實際上需要遞歸使用循環。

相關問題