2010-11-08 240 views
1

我最近在繪畫應用程序中實現了縮放功能時出現了一些問題。請讓我開始給你一些背景資料。在OpenGL中放大/縮小和繪畫

首先,我開始修改Apple的glPaint演示程序。我認爲這是一個很好的來源,因爲它告訴你如何設置EAGLView,等等......

現在,我接下來想要做的是實現縮放功能。在做了一些研究之後,我嘗試了兩種不同的方法。

1)使用glOrthof

2)改變我EAGLView的幀大小。

雖然這兩種方式讓我完全放大/縮小,我遇到不同的問題,而在放大時,它實際上涉及到繪畫。

當我使用(1),我要呈現這樣的觀點:

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrthof(left, right, bottom, top, -1.0f, 1.0f); //those values have been previously calculated 
glDisable(GL_BLEND); 
//I'm using Apple's Texture2D class here to render an image 
[_textures[kTexture_MyImage] drawInRect:[self bounds]]; 
glEnable(GL_BLEND); 
[self swapBuffers]; 

現在,讓我們假設我放大一點,然後我畫,然後我想再次縮小。爲了得到這個工作,我需要確保「kTexture_MyImage」總是包含最新的變化。爲了做到這一點,我需要在更改完成後捕獲屏幕內容並將它們與原始圖像合併。這裏的問題是,當我放大時,我的屏幕只顯示圖像的一部分(放大),我還沒有找到正確的方法來處理這個問題。

我試圖計算屏幕的哪個部分被放大,然後進行捕獲。之後,我會將此部分調整爲原始大小,並使用另一種方法將其粘貼到原始圖像的正確位置。

現在,我可以更詳細地瞭解我是如何實現這一目標的,但它非常複雜,我想,必須有一個更簡單的方法。已經有幾個應用程序,完全可以做,我試圖實現,所以它一定是可能的。

就方法(2)而言,我可以避免大部分上述情況,因爲我只更改了EAGLView窗口的大小。但是,在繪畫時,筆畫遠離他們預期的位置。我可能需要在繪畫時考慮縮放級別,並以不同的方式重新計算CGPoint。但是,如果你在過去做過類似的事情,或者可以給我一個提示,我如何實現放大到我的繪畫應用程序,我真的很感激它。

在此先感謝。

回答

1

是的,這絕對有可能。

當談到繪畫程序時,您應該保留一個鏈接列表或對象樹繪製以便於插入/刪除。當用戶停止繪畫時(即touchesEnded),可以將對象添加到包含場景的數據結構中。

當用戶縮放時,您需要調整您正在繪製的對象相對於當前視口,投影和模型視圖變換的座標。在你的情況下,你沒有改變視口或模型視圖變換,所以你只需要考慮投影變換。您還可以在模型視圖矩陣上使用平移和縮放來實現縮放,但爲簡單起見,我將忽略該情況,因爲它涉及反轉變換。

好消息是您正在使用正投影,因此世界座標對應於沒有縮放效果的窗口座標。你的情況中的「世界」是一個簡單的畫布,可能與窗口座標中設備的大小相對應。

在向場景數據結構中添加對象之前,請使用當前投影變換(即參數調用glOrthof()調用)將所有座標轉換爲世界座標(即全畫布座標)。只有在模型中的所有東西放在同一個座標空間中時,你纔會保持理智。

要轉換座標,假設您永遠無法在glOrtho()調用中縮小完整設備尺寸,則必須縮放它們,使其比例與放大的原始尺寸與未放大的原始尺寸的比例成比例,然後偏差他們由你的縮放鄰接底部,左值和原始未縮放正交值之間的差異。