OpenGL麵片揀選解析

2022-09-23 09:06:08 字數 1482 閱讀 3657

opengl中,物件本身經過世界變換、觀察變換、投影變換、剪下變換,顯示到螢幕。通過滑鼠點選,獲取的是螢幕座標系的二維座標(x,y)。需要將螢幕座標反變換,計算世界座標系中揀選射線方程。

(1)建立螢幕ndc座標,即將整個螢幕進行對映,x方向範圍-1到1,中心為0,y方向範圍-1到1,中心為0。注意:x方向右正左負,y方向上正下負。

ndcx = (2.0f * x) / fwidth - 1.0f;

ndcy = 1.0f - (2.0f * y) / fheight;

ndcz = 1.0f;

(2)將投影變換的逆變換作用在該座標系上。若mxporj為投影矩陣,則:

mxinvproj=mxproj.inversed();

v4world=mxinvproj*qvector4d(ndcx,ndcy,ndcz,1.0);

這裡,我們將變換後的向量寫為v4world,是指該向量含義在世界座標系中意義非常清晰:可理解為將攝像機置於世界座標系原點,滑鼠在遠平面上的揀選點。so,揀選向量即為:v4world前三維座標單位化,記為n。

(3)假設模型在繪圖前使用了mxtrans=mxview*mxmodel進行了變換,將其放在我們能看到的地方,而實際上,模型真正的位置在其本身節點座標描述的位置。因此,我們需要將揀選射線進行變換,逆著mxtrans變換後,作用於揀選射線上。如,我們讓模型右上角對著攝像機,可以理解為將攝像機轉動到模型右上角。

視點:vcam,原點,重組為4維向量,w=1,變換為v4eye=mxtrans(-1)*vcam;

揀選方向:n,重組為4維向量,w=0(不參與平移變換),變換為v4to=mxtrans(-1)*n

(4)計算射線與麵片交點。變換後,用v4eye中的w值除前三個座標,重組為三維向量p,該項量為座標系中眼睛的位置;v4to區前三維座標整理為m,並單位化,該項量為眼睛觀察的方向。

(5)揀選麵片。使用模型本身節點資料,無需任何變換。若有面,過空間一點q,法線方向為k。則首先將直線方程寫為:

x=p1+m1*r

y=p2+m2*r

z=p3+m3*r

平面方程為:

k1*(q1-p1)+k2*(q2-p2)+k3*(q3-p3)=0

聯立上述方程得到 r=(q-p)*k/(m*k),均為向量運算,*為點乘。

理解r的幾何意義為:從p點想m方向行走的距離,因此,r應當為正值才和麵片有真正的交點(r為負時,表示射線反向與麵片相交,顯然不是我們想要的結果)

(5)判斷交點是否在麵片內。

如上圖,h1和h2有什麼不同?我們用向量與向量的叉乘解決問題。

內部點h1,向量h1p1p1p2、h1p2p2p3、h1p3p3p1 方向均指向 外面,而外部點h2,向量h2p1p1p2、h2p2p2p3、h2p3p3p1,總有乙個方向指向 裡面。

具體針對d點計算,可以計算dp1p1p2、dp2p2p3、dp3p3p1,單位化;記平面法線為方向為u,則每個向量與u做差後算長度,累加三個差向量的長度,判斷是否大於1,大於1則在外面,小於1在裡面。

over

unity3d麵片全屏

在使用中,為了是麵片保持寬高比和原始位置,全屏化選擇 獲取攝像機的寬高比 float camera aspect virturecamera.aspect 麵片的寬高比 float texture aspect float m width m height 根據影象的比率對進行縮放操作 backgr...

OpenGL的SetupRC 函式解析

最近在學習opengl,經常遇到setuprc 函式,查了下 opengl超級寶典 該函式名的全稱為 setuprenderingcontex 故名思議,該函式的作用主要是對glut的渲染環境進行設定,實際上,這個函式是乙個自定義的函式,對opengl沒有什麼影響。但是為書寫規範化,對於opengl...

框選三角麵片並改變顏色

cellrubberbandpick.cpp 定義控制台應用程式的入口點。include stdafx.h include vtkpolydatareader.h include vtksmoothpolydatafilter.h include vtkpolydatanormals.h inclu...