簡體   English   中英

關於如何在opengl中正確旋轉/平移對象的任何建議,試圖實現以下效果

[英]Any advice on how to rotate/translate object properly in opengl, trying to achieve the following effect

試圖生成由線組成的遞歸樹。 我當前的繪圖功能無法按計划工作。 在顯示問題之前,這里是繪制代碼:

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

那畫像這樣

 /__

而我試圖讓它畫像這樣的東西

__/

對實現上述目標有幫助嗎?

我們不知道調用點的Modelview矩陣的狀態,所以我們稱其為MV

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

T =用-x翻譯
R =旋轉r
變換= MV(R(T(v)))

第二次調用(矩陣運算順序)

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

另外-除非您的實際代碼實際上需要遞歸使用循環。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM