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

jopen 10年前

        英文原文:DNA Visualisation in 3D  Coding a DNA strand using OpenGL.

        我最近在 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)分配给双螺旋和带子的一些材质。

        下面是一些截图:

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

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

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

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

        (分别为缩小图和特写图)

        条带数可以通过增加n的值,减小连接角来一直增加,其中的n代表的就是条带的数目。

        与此相关的也有许多很有趣,我想我将会尝试在某天做一个由球面(表示实际分子)组成的相同的 DNA。

        完整的代码将很快传到 GitHub 上!

        更新——代码已经上传了,链接是:https://github.com/soumitrasaxena/DNA

        翻译: 伯乐在线 - 卷卷怪

        译文链接: http://blog.jobbole.com/67260/