我有以下聲明:使用OpenGL旋轉後,我可以獲得正方形的頂點嗎?
glBegin(GL_QUADS);
glColor3f(0.0f,0.7f,0.7f);
glVertex2f(x1,y1);
glVertex2f(x2,y2);
glVertex2f(x3,y3);
glVertex2f(x4,y4);
glEnd();
的問題是:如果我申請一個旋轉,比方說20度,我怎麼能知道這些頂點呢? 因爲後來我需要能夠點擊廣場並確定我點擊的地點是否在廣場內。
我有以下聲明:使用OpenGL旋轉後,我可以獲得正方形的頂點嗎?
glBegin(GL_QUADS);
glColor3f(0.0f,0.7f,0.7f);
glVertex2f(x1,y1);
glVertex2f(x2,y2);
glVertex2f(x3,y3);
glVertex2f(x4,y4);
glEnd();
的問題是:如果我申請一個旋轉,比方說20度,我怎麼能知道這些頂點呢? 因爲後來我需要能夠點擊廣場並確定我點擊的地點是否在廣場內。
儘管我希望沒有人在這個千年中使用過它,但實際上有一種機制可以在傳統的OpenGL中獲得變換的頂點。它被稱爲「反饋模式」。詳細解釋超出了答案的範圍。但是如果你想看看它是如何工作的,你可以在Red Book的免費在線版本上閱讀。
你在你的問題中談論的「點擊和識別」通常被稱爲「挑選」或「選擇」。有很多方法來實現它,而選擇的方法則取決於你的應用程序。簡要介紹一些常用方法:
選擇模式。這幾乎和反饋模式一樣已經過時了。它已經很老了,但我有一種感覺,至少它更常用,所以它可能會有更好的支持。不過,我不建議在新代碼中使用它。同樣,如果您想了解它,可以在Red Book中找到解釋。
現代OpenGL具有稱爲變換反饋的功能。雖然其主要目的不同,但它可用於回讀與傳統反饋模式類似的已轉換頂點。
將場景繪製到屏幕外緩衝區,每個對象都以不同的顏色呈現。然後在選擇位置回讀顏色,並將其映射到對象。這是一種相當優雅和高效的方法,如果它滿足您的要求,可以推薦使用。
在您自己的CPU代碼中執行計算。除了轉換所有對象之外,更有效的方法通常是將反轉變換應用於拾取點(實際上變成射線),並將其與幾何體相交。
最後的建議是一個很好的 –
我標記爲解決方案,因爲它實際上提供瞭解決問題的方法。但最終,我沒有實現這個功能。 – chopeds
難道你不能只對CPU的頂點進行相同的轉換嗎?一般來說,找出「被點擊的東西」是一個棘手的問題,在文獻中有不同的解決方案(光線三角交叉,使用不同顏色繪製所有東西,然後用於查找等)。獲得頂點/頂點/頂點變換的問題也很棘手;現代的OpenGL允許你通過[變換反饋](https://www.opengl.org/wiki/Transform_Feedback)來完成,但是你的代碼是OpenGL 1.x-ish,所以不要那麼做。 – peppe
你是什麼意思的「做你的頂點在CPU上相同的轉換」? @peppe – chopeds
這裏的問題是您使用的是非常舊的OpenGL(2或更早版本)。現代OpenGL已經改變了反饋和其他好東西。要做轉換CPU端,你可以使用像glm這樣的庫。 – Robinson