我最近在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条评论, 我也要评论