日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenGL环境下的射线选择

發布時間:2025/3/19 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenGL环境下的射线选择 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

用過OpenGL的人,應該都知道,OpenGL是自帶拾取功能的,但用過的人應該也知道,這功能確實不好用。

?

OpenGL自帶的選擇功能主要有兩種,名字堆棧(拾取)和讀深度值判斷選擇,但這兩種方法在實際項目中,未必都好用。

?

方法一:名字堆棧的方法,需要切換渲染模式,操作命名堆棧,計算揀選矩陣,檢查選中記錄。當要渲染的數據量特別大或渲染的對象眾多時,顯然是不可取的。

?

方法二:glReadPixel方法,讀深度值的方法,這種方法比前面一種方法在某些時候稍微好用些,但有一個致命的限制,你鼠標選擇的時候,必須選擇到繪有實體的地方,否則就得不到正確的深度值。例如你渲染一個三維地形圖,地形以Tin的方式渲染,如果你想選擇某個頂點,但鼠標落在空白區,你就無法得到正確的深度值,得不到正確的深度值,自然沒法根據gluUnproject函數反算到真實的地形坐標點,而實際應用中應該是即使你沒完全落在該頂點上,也應該可以根據一個緩沖,在所有緩沖區內部的點集中選擇一個距離光標最近的點作為你選擇的點。

本文介紹一種方法——射線選擇,這種方法也是游戲界和三維地形編程普遍采用的選擇方法。

?

首先介紹一個二維三維坐標轉換函數:?gluUnProject()

此函數的具體用途是將一個OpenGL視區內的二維點轉換為與其對應的場景中的三維坐標。

轉換過程如下圖所示(由點P在窗口中的XY坐標得到其在三維空間中的世界坐標):

?這個函數在glu.h中的原型定義如下:

?

?

代碼 int?APIENTRY?gluUnProject?(

????GLdouble???????winx,?

????GLdouble???????winy,?

????GLdouble???????winz,?

????
const?GLdouble?modelMatrix[16],?

const?GLdouble?projMatrix[16],?

const?GLint????viewport[4],?

????GLdouble???????
*objx,?

????GLdouble???????
*objy,?

????GLdouble???????
*objz);

?

?

其中前三個值表示窗口坐標,中間三個分別為模型視圖矩陣(Model/View Matrix),投影矩陣(Projection Matrix)和視區(ViewPort),最后三個為輸出的世界坐標值。

第二步,首先獲得視圖矩陣,投影矩陣,視區三個數組值。

?

代碼 ?GLint????viewport[4];?
?GLdouble?modelview[
16];?
?GLdouble?projection[
16];?

?

?glGetIntegerv(GL_VIEWPORT,?viewport);?
//?得到的是最后一個設置視口的參數
?glGetDoublev(GL_MODELVIEW_MATRIX,?modelview);?
?glGetDoublev(GL_PROJECTION_MATRIX,?projection);?

?

獲取這三個變量的代碼,應該放在繪制發生前,三個矩陣定以后。否則glPopMatrix之類的函數,可能導致你無法得到真正的投影矩陣和視圖矩陣。

第三步,獲取射線。因為兩點確定一條線,所以,先通過計算視圖最近點和最遠點,得到該射線。

?

代碼 ?winX?=?point.x;?
?winY?
=?screenHeight?-?point.y;?

//獲取像素對應的前裁剪面的點坐標
?bool?bResult?=?gluUnProject(winX,?winY,?0.0,?modelview,?projection,?viewport,?&posX,?&posY,?&posZ);?
?FPoint3?nearPoint;
?nearPoint.x?
=?posX;?nearPoint.y?=?posY;?nearPoint.z?=?posZ;
?
//獲取像素對應的后裁剪面的點坐標
?bResult?=?gluUnProject(winX,?winY,?1.0,?modelview,?projection,?viewport,?&posX,?&posY,?&posZ);?
?FPoint3?farPoint;
?farPoint.x?
=?posX;?farPoint.y?=?posY;?farPoint.z?=?posZ;

?

?

?

第四步,計算待選擇目標跟該的關系,將與射線距離最近的對象,作為選擇對象。

?

第五步,本文繪制了分布在不同三維空間的5個點,用鼠標右鍵,可以進行點的選擇,如果選中,點會變成黃色,鼠標左鍵可以隨意對這些點進行旋轉等。

程序源代碼


?

?

轉載于:https://www.cnblogs.com/yanhuiw/archive/2010/08/26/1809489.html

總結

以上是生活随笔為你收集整理的OpenGL环境下的射线选择的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: www.亚洲 | 国产人伦精品一区二区三区 | 国产福利小视频在线 | 九九九网站 | 麻豆视频网址 | 在线h网站 | 日本肉体xxxx裸体137大胆图 | 女人扒开屁股让男人捅 | 日本黄色不卡视频 | 在线观视频免费观看 | 亚洲精品99 | 91全免费| 日韩激情在线视频 | 欧洲一区在线 | 色吊丝av中文字幕 | 99久久久无码国产精品衣服 | 一级啪啪片| 国产午夜毛片 | 无码少妇精品一区二区免费动态 | 一区二区三区视频免费 | 911精品国产一区二区在线 | 免费看成人aa片无码视频羞羞网 | 波多野吉衣一区二区 | 国产精品久久久久影院 | 99热在线这里只有精品 | 国产精品视频区 | 亚洲精品字幕在线 | 欧美激情在线观看一区 | av在线亚洲天堂 | 久久7777 | 青娱乐自拍视频 | 91在线观看免费高清完整版在线观看 | 日本少妇色视频 | www国产视频 | 精品在线视频一区二区 | 国产无套内射普通话对白 | 日韩一区av在线 | 亚洲成人黄色在线观看 | 国产精品18久久久 | 国产成人精品无码免费看夜聊软件 | av首页在线 | 永久视频在线 | 午夜网 | 麻豆视频一区 | 性色AV无码久久一区二区三 | 精品国产va久久久久久久 | 国产精品91av | 国产一区在线不卡 | 最近免费中文字幕中文高清百度 | 嫩草在线播放 | 久久精品中文 | 亚洲av综合av一区二区三区 | 蜜臀在线视频 | 天天干,夜夜操 | 在线免费观看福利 | 国产寡妇亲子伦一区二区三区四区 | 91嫩草香蕉 | 美女扒开屁股让男人桶 | 国精产品一区一区三区mba下载 | 四季av在线一区二区三区 | av免费天堂 | 国产sm主人调教女m视频 | 少妇人禽zoz0伦视频 | 91丨porny丨露出 | 在线观看日本中文字幕 | 亚洲综合射 | 中文字幕丰满乱子伦无码专区 | 在线你懂的视频 | 一区二区三区四区高清视频 | 日韩欧美在线观看视频 | 狠狠v欧美v日韩v亚洲ⅴ | 日韩欧美极品 | 精品熟妇一区二区三区 | 国产日产亚洲精品 | 日韩喷潮 | 色哟哟一区二区 | 亚洲日本久久久 | 伊人黄色 | 亚洲成熟女性毛茸茸 | 69久久 | 天天干天天干天天干 | 免费日韩一区 | 久热国产视频 | 亚洲国产无线乱码在线观看 | 日本精品久久久久久久 | 麻豆短视频在线观看 | 最新极品jizzhd欧美 | 亚洲欧美视频二区 | 99艹| 免费看av网| 免费看的黄网站 | 午夜精品视频在线观看 | 欧美一区二区最爽乱淫视频免费看 | 国产1区 | 国产一卡在线 | 国产乱码精品一区二区三区忘忧草 | 国产成人无码精品久久久久 | 成人一级网站 | 日韩wwww|