2017-12-25 5 views
1

私はGL_LINESで4行で生成されたクワッドを塗りつぶそうとしています。しかし、私は四角形を埋めるようにしようとすると三角形だけが塗りつぶされます。この線を描画するコードである:GL_QUADは三角形を描画します

def SurfaceContour(self, vertices, edges): 
    glBegin(GL_LINES) 
    for edge in edges: 
     for vertex in edge: 
      glColor3fv((1.0, 0.0, 0.0)) 
      glVertex3fv(vertices[vertex]) 
    glEnd() 

これは描画コードではクワッドを埋める:

def Surfaces(self, vertices): 
    glBegin(GL_QUADS) 
    for i in range(4): 
     glColor4f(1, 1, 1, 0.3) 
     glVertex3fv(vertices[i ,:]) 
    glEnd() 

これは私に入る頂点行列である:

[[ 0. -20.23 7. ] 
[ 0. -20.23 -7. ] 
[ 100. -10.  5. ] 
[ 100. -10.  -5. ]] 

This is the result that i get:

答えて

5

この頂点の順序

[[ 0. -20.23 7. ] 
[ 0. -20.23 -7. ] 
[ 100. -10.  5. ] 
[ 100. -10.  -5. ]] 

は、このようなものです:

enter image description here

あなたは4つの頂点によって定義されたクワッドを描きたい場合は、あなたがGL_TRIANGLE_STRIPを描画するかがあります。

enter image description here

def Surfaces(self, vertices): 
    glBegin(GL_TRIANGLE_STRIP) 
    for i in range(4): 
    glColor4f(1, 1, 1, 0.3) 
    glVertex3fv(vertices[i ,:]) 
    glEnd() 

または、頂点の順序を変更する必要がありますGL_QUADためrequiremts(S)

enter image description here

[[ 0. -20.23 7. ] 
[ 0. -20.23 -7. ] 
[ 100. -10.  -5. ] 
[ 100. -10.  5. ]] 

は、まず古い非推奨APIを使用している、どちらもglBegin/glEndのではさらにPrimitive

+0

ありがとうございます、それは完璧に動作します。ちょうど1つのフォローアップの質問、表面が着色した後、私がビューを回転させると、表面の裏側は着色されていないように見えます。 [Example View](https://ibb.co/i60L76)、これについて何かお考えですか?前もって感謝します。 – BjkOcean

+0

@BjkOceanたぶん[Face Culling](https://www.khronos.org/opengl/wiki/Face_Culling)の問題です。 'glDisable(GL_CULL_FACE)'を試してみるか、顔のカリングをオンにしないでください。 – Rabbid76

0

を参照してくださいGL_QUADは、現代のアプリケーションでは使用しないでください。

第2に、glVertex3fvは1つの要素に配列を受け取り、glVertex3fv(vertices[i ,:])元の配列のスライスを渡します。実際は最初の要素のみが使用されるため、verticies[i]に等しくなります。これにより、GL_QUADの頂点の順序が正しくありません。プリミティブ型または要素の順序を変更する必要があります。

+0

あなたの答えをありがとう、近代的なOpenGLアプリケーション用のコードを設定する方法の小さな例を教えてください。 – BjkOcean

+0

@BjkOcean非常に簡単ではありませんが、ここでの主なポイントは、多くの 'glVertex'を呼び出す代わりに、データバッファを使用することです。最新のOpenGL(バージョン3以上)をターゲットとしたチュートリアルをGoogleにお勧めします。これと同じように:https://learnopengl.com/ – Jeka

関連する問題