1

知らない人のために、C#コンソールアプリケーションにはTao.opengl、Tao.freeglutが必要です。

さて、私の問題のために:私の家庭教師は私たちに4つの長方形を描くように頼んだので、私はそれらをうまく描きました。

他のコードをコピーして貼り付けます(時間不足のため、講師は説明しませんでした)

コードは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Tao.FreeGlut;
using Tao.OpenGl;

namespace Homework_1
{
    class Triangles
    {
        static void display()
        {
            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);

            Gl.glColor3f(1.0f,1.0f,1.0f);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glVertex3f(-1.0f,-1.0f,0.0f);
            Gl.glVertex3f(1.0f, -1.0f, 0.0f);
            Gl.glVertex3f(1.0f, 1.0f, 0.0f);
            Gl.glVertex3f(-1.0f, 1.0f, 0.0f);
            Gl.glEnd();

            Gl.glColor3f(1.0f, 1.0f, 1.0f);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glVertex3f(2.0f, -1.0f, 0.0f);
            Gl.glVertex3f(4.0f, -1.0f, 0.0f);
            Gl.glVertex3f(4.0f, 1.0f, 0.0f);
            Gl.glVertex3f(2.0f, 1.0f, 0.0f);
            Gl.glEnd();

            Gl.glColor3f(1.0f, 1.0f, 1.0f);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glVertex3f(2.0f, 2.0f, 0.0f);
            Gl.glVertex3f(4.0f, 2.0f, 0.0f);
            Gl.glVertex3f(4.0f, 4.0f, 0.0f);
            Gl.glVertex3f(2.0f, 4.0f, 0.0f);
            Gl.glEnd();

            Gl.glColor3f(1.0f, 1.0f, 1.0f);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glVertex3f(-1.0f, 2.0f, 0.0f);
            Gl.glVertex3f(1.0f, 2.0f, 0.0f);
            Gl.glVertex3f(1.0f, 4.0f, 0.0f);
            Gl.glVertex3f(-1.0f, 4.0f, 0.0f);
            Gl.glEnd();


            Gl.glFlush();

        }

        static void init()
        {

            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            Gl.glMatrixMode(Gl.GL_PROJECTION);
            Gl.glLoadIdentity();
            Gl.glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
        }

        public static void Main(String[] argv)
        {
            Glut.glutInit();
            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
            Glut.glutInitWindowSize(1000, 1000);
            Glut.glutInitWindowPosition(100, 100);
            Glut.glutCreateWindow("hello");
            init();
            Glut.glutDisplayFunc(display);
            Glut.glutMainLoop();
        }
    }
}

アプリケーションを実行すると、表示されるのはすべて白なので、エラーはコピーして貼り付けたinit()メソッド内にあると100%確信しています。

 Gl.glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0); 

Gl.glOrthoの値を変更する必要があることは100%確信していますが、問題は、その使用方法がわからないことです。

エラーを修正してください。そうすれば、私が描いた4つの三角形が表示され、簡単な説明でわかりやすくなります。

4

2 に答える 2

1

単に話すだけで、glOrtho電話は一般的に目に見えるあなたの世界の領域を決定します。したがって、あなたの場合、最初の(白い)ポリゴン(つまり[-1,1]-正方形)で完全に覆われている[0,1]-正方形だけが表示されます。したがって、すべてのポリゴンを表示するには、次を使用する必要があります。

glOrtho(-1.0, 4.0, -1.0, 4.0, -1.0, 1.0);  //or maybe with some margin of +/- 0.1

これはすべて、正投影ではなく、同一性または透視投影ではないモデルビューマトリックスを使用する場合にさらに困難になります。さらに洞察を得るために、OpenGLの変換パイプラインをもう少し詳しく調べることをお勧めします。たぶん、この質問への答えはそれを助けるでしょう。

あなたも電話をかけるのを忘れているようです

glViewport(0, 0, 1000, 1000);

これは、ビューがレンダリングされるフレームバッファの領域を決定し、その範囲は通常、ウィンドウの範囲と一致する必要があります。デフォルトでは、コンテキストのビューポートは接続されているウィンドウのサイズと一致しますが、特にウィンドウのサイズが変更された場合は、ビューポートが自動的に更新されないため、ビューポートを明示的に設定することをお勧めします。

ちなみに、 OpenGLはステートマシンであるため、すべてのポリゴンが同じ色である場合は、すべてのポリゴンに色を設定する必要はありません。

于 2011-10-10T19:53:51.190 に答える
1

glVertex3非常に非推奨であるため、教師はその存在を認めるべきではありませんが、まあ。

void glOrtho(GLdouble   left,
             GLdouble   right,
             GLdouble   bottom,
             GLdouble   top,
             GLdouble   nearVal,
             GLdouble   farVal);

最初の2つのパラメーターは、左右のクリッピング平面の座標を指定します。3番目と4番目のパラメーターは、下部と上部のクリッピング平面の座標を指定します。

現在のglOrthoでは、最初の長方形が画面全体を覆い、他の長方形も画面を覆っています。描画色を白に設定するGlColor3fと組み合わせると、画面全体が白になります。ちなみに、再指定する必要はありません。

それを機能させる方法は、次のようなglOrthoを持つことです:

 Gl.glOrtho(-5.0, 5.0, -5.0, -5.0, -1.0, 1.0); 

glVertexメソッドを変更して、より小さな長方形を描画することもできます。

于 2011-10-10T19:55:34.963 に答える