標籤:關注 截取 怎麼辦 依賴 dev 初始化 img 思路 自己
那麼我首先要說一些技術之外的事情。。
那就是我拿了筆記本但是卻沒有拿滑鼠。。以前形學實驗也犯過這個錯誤。。離開了滑鼠。。
我工作效率基本要降一大半。。
然後就是上機。。
那麼由於沒有滑鼠。。我總是在猶豫使用觸摸板。。
而且也沒有開啟老師授課的PPT。。。
忘記說題目了。。題目很簡單。。照著書上畫一個Bezier曲線
那麼書上是有代碼的。。但是書上是opengl+DOS,而題目要求是opengl+MFC
那麼兩者是怎麼轉化的呢。。
我的理解是利用wgl系列函數綁定當前pdc然後在onDraw裡用畫筆pdc畫就好了。。
但是此處並不是顯式調用pdc而是隱式地綁定了device context pointer
那麼你最後要記得釋放pdc..,然後呢。。如果有一些onSize訊息需要我們進行
重繪的話。。那我們也可以進行這個訊息的處理。。但是一個邏輯是。。。。
如果不發生該事件則。。該訊息就不會發送。。不發送我們就不需要處理
但是我在出錯的過程中。。老想著改它。。這樣肯定是蠢的
那麼有了我以前做工程上述的經驗以後。。
我分析了一下書上程式的結構,將專門繪圖的一段代碼copy到onDraw
但是呢。。此時我用的是之前做過的一個MFC 3D的工程去改。。。
所以前面的初始化我都沒管。。事實上呢。。從這一步開始就崩了。。
那麼你的代碼能正常顯示的話。。要依賴於你的投影模式。。在顯示屏上
就需要投影,並且我們知道有一個很重要的概念叫做視區。。就是使用者要看的地區大小?
當時其實還是有考慮的?
我看到了這個函數。。以為穩了。。誰知道它不能執行我們想要的功能。。
那麼實際上是少了這個函數
那麼原來那個3D的工程是說。。。
用了這樣的投影方式和投影參數。。那麼。。這裡並沒有2D,3D的關鍵詞。。。
我在做的時候並沒有意識到2D到3D工程到底在哪些地方敏感。。。
我沒有抓到關鍵的地方。。實際上當時的情況是這樣。。如果使用了3D的投影方式和參數
那麼你的所有繪圖語句不會報錯。。但是呢。。結果是。。啥都不顯示。。
那麼當時我看到這個結果第一反應是懵逼。。覺得自己哪裡寫錯了。。。
奧對。。中間還有一個錯誤。。和書上一模一樣的函數。。書上沒事。。我的出事了。。
然後我很慌。。然後clean rebuild確認不是工程問題後。。發現。。我抄錯了。。
各種刪。。各種改。。onSize都改了。。太蠢。。
不過到後來都沒有顯示。。完全沒有想法該怎麼解決。。
那麼當時發生了這個問題。。即使我們的姿勢水平不夠。。但我們依然能夠得到一些結論
首先。。這個工程成功運行起來了。。
那麼說明我的繪圖語句應該都沒有太大的問題。。
那麼很明顯的一個矛盾是。。執行了繪圖語句卻看不到繪圖。。
那麼我的一個想法是。。繪圖太細。。顏色和背景色一樣。。
但是我的後續操作排除了這個可能性
那我們怎麼辦。。後來我就gg了。。。
那麼我們再次關注這個主要矛盾。。已繪和看不到。。可能由哪些原因造成
首先我們要有一個前提。。保證已繪。。
那麼有兩個問題我們並沒有關心。。那就是繪到哪裡。。結果顯示到哪裡
那麼這裡有一個非常顯然的邏輯。。我繪圖到A地區。。沒有擦除操作。。
我再次觀察A地區。。A地區必定有繪圖痕迹(假設顏色和大小正常)
那麼我們現在觀察到的地區並沒有痕迹。。那麼說明。。要麼我們觀察的並不是A地區
要麼我們的繪圖操作確實不正確。。
但是呢。。按照這個邏輯。。我們需要調整一下地區?在哪裡調整?ViewPort?還是雪崩
那麼還是不行。。
那麼後面這個問題我們考慮了之後先放著。。
我們來關心一下更為基礎的問題。。MFC可能的大概工作流程。。。
繪製-顯示
那麼這個繪製操作到底意味著什麼呢。。我們肯定把它想成了一個拿著筆直接在螢幕上
畫的操作。。但是如果說能畫的話為什麼不顯示?仍然可以懷疑地區不對。。
但是我們要知道。。opengl用到了投影矩陣。。這意味著什麼。。它有一個已經處理好的矩陣
然後將這個處理好的矩陣再投影到螢幕上的視窗地區
那麼繪製的過程就是不斷地處理這個矩陣。。顯示的過程就是投影。。
那麼繪製的過程是書上給的。。但是呢書也不能保證一定對。。
但是如果一旦我們的繪製過程沒錯。。我們就應該懷疑我們的顯示過程
顯示過程顯然在前面是設定了狀態。。由於還是缺乏這方面的知識。。我們可以選擇搜尋
每個函數都是什麼意思,那麼考試之後我來類比一下這個過程
---glViewport():
glOrtho函數只是負責使用什麼樣的視景體來截取映像,並不負責使用某種規則把映像呈現在螢幕上。
glViewport主要完成這樣的功能。它負責把視景體截取的映像按照怎樣的高和寬顯示到螢幕上。
那麼最後這個函數是一個透視函數。。
然而前面的orth函數我們並沒有。。有關投影的函數。。
那麼我們想到。。PPT上是怎麼處理MFC二維工程的呢。。
那麼其實我們可以一下子找到不同點。。但是當時我滑鼠不好使。。
那麼其實不開啟PPT我們把glOrtho複製進去就可以發現
只顯示了一部分。。那麼我們一個很自然的想法是這個視區?開小了。。
改大了之後
那是因為這裡少了一個符號。。
改成上面這樣的話。。
就會出現結果。。大功告成。。
分析會對結果有影響的因素。。帶著對這個因素的思考去
查每一個函數都是什麼意思。。是否都執行了你所期望的功能。。
如果說。。你不先分析。。縮小我們關注的範圍。。我們很難直接找到投影函數。。並且關於視窗的知識也是很重要的
那麼如果問題還沒有解決。。一方面還可以縮小問題規模。。縮小到1之後。。我們再去考慮擴大我們考慮的因素
那麼這個是分析工程問題的一個常見的思路吧。。
關於電腦圖形學上機考試雪崩的反思。。