2011-02-11 15 views
2

可能な重複与える:、は、2D構造の3D深度に


How to give a 2D structure 3D depth

こんにちは皆を私は昨日、この同じ質問を投稿しました。私は自分のプログラムの出力を示す画像をアップロードしたいと思いますが、スパム防止のために私は10の評判 "ポイント"が必要だと知らされています。私は、異なる投影行列の下で私の出力の画像を誰でも喜んで送ることができました。

私は分子モデリングプロジェクトの一部としてOpenGLを学び始めています。現在は、空間的に互いに近接して配置され、ある特定の場所で移動、傾斜、回転、相互作用する7つのヘリックスをレンダリングしようとしています。方法。

私の質問は、幾何学的構造が3次元で真のヘリックスのように見えるように、2Dシーンの3次元の深さを与える方法です。

glDepthRange関数だけでなく、投影行列(gluPerspective、glFrustum)を使って遊んでみました。私が教科書/ウェブサイトの参考文献から理解しているように、3Dシーンをレンダリングする場合、2D面上に3次元の錯覚を作成するために消失点(gluPerspectiveまたはglFrustum)を持つ(透視投影)行列を使用することが適切です)

私はヘリックスを描画するためのコードを含みますが、簡単にするために、1つのヘリックスをレンダリングするコードを挿入します(他の6つのヘリックスは、その変換マトリックスとカラー関数のパラメータを除いて全く同じです)ハンドラ。

これは出力です![ここに画像の説明を入力してください] [1]私は正射影投影(glOrtho)でプログラムを実行すると、ヘリの2D投影(3次元で描かれた曲線)になります。これは私の出力です(![画像の説明を入力] [2])私は透視投影(私の場合はglFrustum)を使用します。あたかも私の螺旋を3Dで見ているかのようには見えません!!

おそらくglFrustumパラメータが間違っていますか?

//GLOBALS 
    GLfloat x, y, z; 
    GLfloat c = 1.5f; //helical pitch 
    GLfloat theta;  //constant angle between tangent and x-axis 
    thetarad = theta/(Pi/180.0); //angle converted from degrees to radians 
    GLfloat r = 7.0f; //radius 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_DEPTH_TEST); /* enable depth testing */ 
    glDepthFunc(GL_LESS);  /* make sure the right depth function is used */ 


/*CALLED TO DRAW HELICES*/ 

void RenderHelix() { 

    /**** WHITE HELIX ****/ 
    glColor3f(1.0,1.0,1.0); 
    glLoadIdentity(); 
    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 
    glTranslatef(-30.f, 100.f, 0.f); //Move Position 
    glRotatef(90.0, 0.0, 0.0, 0.0); 
    glBegin(GL_LINE_STRIP); 

    for(theta = 0; theta <= 360; ++theta) {  /* Also can use: for(theta = 0; theta <=  2*Pi; ++rad) */ 
     x = r*(cosf(theta)); 
     y = r*(sinf(theta)); 
     z = c*theta; 
     glVertex3f(x,y,z); 
    } 

    glEnd(); 
    glScalef(1.0,1.0,12.0); //Stretch or contract the helix 
    glPopMatrix(); 

    /* Code for Other 6 Helices */ 

    ............. 
     glutSwapBuffers(); 

} 


void Reshape(GLint w, GLint h) { 

if(h==0) 
    h=1; 

glViewport(0,0,w,h); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
GLfloat aspectratio = (GLfloat)w/(GLfloat)h; 

if(w<=h) 
    //glOrtho(-100,100,-100/aspectratio,100/aspectratio, -50.0,310.0); 
    //glOrtho(-100,100,-100/aspectratio,100/aspectratio, 0.0001,1000000.0); //CLIPPING FAILSAFE TEST 
    //gluPerspective(122.0,(GLfloat)w/(GLfloat)h,10.0,50.0); 
    glFrustum(-10.f,10.f, -100.f/aspectratio, 100.f/aspectratio, 1.0f, 15.0f); 
else 
    //glOrtho(-100*aspectratio,100*aspectratio,-100,100,-50.0,310.0); 
    //glOrtho(-100*aspectratio,100*aspectratio,-100,100,0.0001,1000000.0); //CLIPPING FAILSAFE TEST 
    //gluPerspective(122.0,(GLfloat)w/(GLfloat)h,10.0,50.0); 
    glFrustum(-10.f*aspectratio,10.f*aspectratio,-10.f,10.f, 1.0f,15.0f); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity();  

}

答えて

0

私はあなたがあなたのイメージを投稿することができません(と、それはその後、些細ではないかもしれない)場合、それは難しいです同意します。

あなたのコードがオープンソースの場合、Blue Obeliskコミュニティ(http://blueobelisk.shapado.com/はこれらの質問に答えるためのSEタイプのサイト)から分子モデリングの助けを得ることができます。

私たちのコミュニティには多くのGLが使われていましたが、良いコードを知っているかわかりませんが、これを実行するには最高のものを考えてください。主なグラフィックツールは、Jmol(gfxは大部分が手書きで、非常に良い)とQtを使用するAvogadroです。

しかし、オープンソースGLのモレキュラー・グラフィックスの例を尋ねるなら、おそらく助けになるでしょう。

そしてもちろん、あなたはおそらく、あなたが照明システムを設定する必要があるため、単純な3Dアプリケーションは、「3D見て」いないといういつもの理由はここに

1

を補完助けを得るでしょう。照明はあなたの脳の深さの手がかりの主要な源です。ここで

は、OpenGLプログラムに照明を追加するには良いチュートリアルです:

http://www.cse.msu.edu/~cse872/tutorial3.html

EDIT:より多くのコンテキストの場合、ここで古典的なOpenGLのレッドブックから該当する章があります:

http://fly.cc.fer.hr/~unreal/theredbook/chapter06.html

上部の近くのスクリーンショットに、同じ球が照明の有無に関係なくレンダリングされていることがわかります。