DNA的三維視覺化:通過OpenGL實現一個DNA鏈

卷卷怪發表於2014-05-10

我最近在Coursera上開始了一門課程(資料庫和演算法,順便提一句,這是普林斯頓大學開設的一門很牛的課程)。現在上了幾次課,我發現這些程式設計課都相當困難,我的(自我緩解程式設計困難的)方法則是在OpenGL上編一些小東西來減壓。

做三維模型程式設計最棒的一點就是你可以看到你程式碼的成果(這也是程式設計的一個動機)。3D程式設計是一個很強大的視覺化工具,通過編碼實現DNA的結構是一個有趣並且富有挑戰性的任務。其具有挑戰性主要是因為OpenGl程式碼所帶來的侷限性。我相信DNA結構在數學方面的實現是很簡單的。

關於程式碼和DNA結構

1. DNA是雙螺旋結構,有個帶狀結構從不同的角間距中連線著這兩個螺旋。我用GL_QUADS來繪製兩股螺旋和其中的帶子。這些四邊形的座標可以通過以下方式來獲得:

頂點的輸入則是(10是雙螺旋帶的寬度)——

而b/w yOld1和yNew1之間的關係表示式如下:

2. 對於連線兩個螺旋帶的中間的帶狀,我用了C++中的結構體陣列來儲存x,y和z的值,它們相應的點都對應在兩個螺旋帶的連線點上,它們也是通過GL_QUADS來連線的。之後通過一個簡單的”for“迴圈來連線它們。

我已經分別採取了+60和-60,+120和-120度的連線角,因此無論何時,在第一個螺旋上的經過角都為60度或60+360n度,或者第二個角上的120+360n度。我已經將x,y和z的對應值加到結構陣列中去了。

之後一個簡單的for迴圈將連線x,y和z與GL_QUADS來完成工作。

如果你想了解關於DNA鏈的顏色或是照明的資訊,它是用(GL_DIFFUSE)分配給雙螺旋和帶子的一些材質。

下面是一些截圖:

(分別為縮小圖和特寫圖)

條帶數可以通過增加n的值,減小連線角來一直增加,其中的n代表的就是條帶的數目。

與此相關的也有許多很有趣,我想我將會嘗試在某天做一個由球面(表示實際分子)組成的相同的DNA。

完整的程式碼將很快傳到GitHub上!

更新——程式碼已經上傳了,連結是:

https://github.com/soumitrasaxena/DNA

 

相關文章