聚合国内IT技术精华文章,分享IT技术精华,帮助IT从业人士成长

DNA的三维可视化:通过OpenGL实现一个DNA链

2014-05-20 19:45 浏览: 3658317 次 我要评论(0 条) 字号:

我最近在Coursera上开始了一门课程(数据库和算法,顺便提一句,这是普林斯顿大学开设的一门很牛的课程)。现在上了几次课,我发现这些编程课都相当困难,我的(自我缓解编程困难的)方法则是在OpenGL上编一些小东西来减压。

做三维模型编程最棒的一点就是你可以看到你代码的成果(这也是编程的一个动机)。3D编程是一个很强大的可视化工具,通过编码实现DNA的结构是一个有趣并且富有挑战性的任务。其具有挑战性主要是因为OpenGl代码所带来的局限性。我相信DNA结构在数学方面的实现是很简单的。

关于代码和DNA结构

1. DNA是双螺旋结构,有个带状结构从不同的角间距中连接着这两个螺旋。我用GL_QUADS来绘制两股螺旋和其中的带子。这些四边形的坐标可以通过以下方式来获得:

x1 = 40*cos(angle*GL_PI/180);
z1 = 40*sin(angle*GL_PI/180);
x2 = 40*cos((angle+10)*GL_PI/180);
z2 = 40*sin((angle+10)*GL_PI/180);

顶点的输入则是(10是双螺旋带的宽度)——

glVertex3f(x1 , yOld1 , z1);
glVertex3f(x1 , yOld1+10 , z1);
glVertex3f(x2 , yNew1+10 , z2);
glVertex3f(x2 , yNew1 , z2);

而b/w yOld1和yNew1之间的关系表达式如下:

yNew1 = yOld1+3;

2. 对于连接两个螺旋带的中间的带状,我用了C++中的结构体数组来存储x,y和z的值,它们相应的点都对应在两个螺旋带的连接点上,它们也是通过GL_QUADS来连接的。之后通过一个简单的”for“循环来连接它们。

struct strand
 {
 float x ;
 float y;
 float z;
 };

我已经分别采取了+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

 

DNA的三维可视化:通过OpenGL实现一个DNA链,首发于博客 - 伯乐在线



网友评论已有0条评论, 我也要评论

发表评论

*

* (保密)

Ctrl+Enter 快捷回复