DNA的三维可视化:通过OpenGL实现一个DNA链
英文原文: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)分配给双螺旋和带子的一些材质。
下面是一些截图:
(分别为缩小图和特写图)
条带数可以通过增加n的值,减小连接角来一直增加,其中的n代表的就是条带的数目。
与此相关的也有许多很有趣,我想我将会尝试在某天做一个由球面(表示实际分子)组成的相同的 DNA。
完整的代码将很快传到 GitHub 上!
更新——代码已经上传了,链接是:https://github.com/soumitrasaxena/DNA