簡體   English   中英

如何從2D屏幕鼠標單擊中獲取OpenGL中大型對象的准確3D深度?

[英]How to get accurate 3D depth from 2D screen mouse click for large scale object in OpenGL?

我正在通過2D屏幕鼠標單擊來計算3D坐標。 然后,在計算出的3D坐標處繪制點。 代碼沒什么不對,方法沒什么不對,一切正常。 但是有一個與深度有關的問題。

如果對象大小在(1000,1000,1000)左右,我將獲得完整深度,即對象表面的精確3D坐標。 但是,當我加載大小為(20000、20000、20000)的對象時,我沒有獲得確切的(深度)3D坐標。 我從表面有些偏移。 該點從表面偏移一些。 所以我的第一個問題是為什么會這樣? 第二個問題是如何獲得超大型物體的完整深度和准確的3D坐標?

我畫一個3D點

glDepthFunc(GL_LEQUAL);
glDepthRange(0.0, 0.999999);

和使用

glReadPixels(x, y, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &wz);
if(wz > 0.0000001f && wz < 0.999999f)
{
gluUnProject()....saving 3D coordinate
}

發生這種情況的原因是深度緩沖區的精度有限。 例如,一個8位深度的緩沖區只能存儲2 ^ 8 = 256個不同的深度值。

影響深度精度的第二個參數集是投影中近平面和遠平面的設置,因為這是必須映射到深度緩沖區中可用數據值的范圍。 如果使用8位深度緩沖區將此范圍設置為[0,100],則實際精度為100/256 =〜0.39,這意味着在眼睛空間中大約0.39單位將分配相同的深度值。

現在您要解決的問題:分配給深度緩沖區的位很可能太少了。 如上所述,由於不能存儲精確的深度值,因此引入了錯誤。 這就是為什么這些點靠近表面,但不完全位於表面上的原因。

我已經解決了由於深度范圍而引起的這個問題。 因為OpenGL是狀態機,所以我想我可能會在某個地方將深度范圍更改為0.0到1.0。 我認為在清除深度緩沖區后立即放置深度范圍總是更好的選擇,過去我在清除深度和顏色緩沖區后進行以下設置。

解:

{
    glClearColor(0.0,0.0,0.0,0.0);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);
    glDepthFunc(GL_LEQUAL);
    glDepthRange(0.0, 1.0);
    glDepthMask(GL_TRUE);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM