0

だから私は Triangle クラスを持っていて、三角形のインスタンスを描画したいのですが、何らかの理由で 1 つだけが描画され、その背後にあるロジックは私を超えています。

私は周りを見回してきましたが、すべての三角形が同じファイルに描かれている例しか見つかりませんでした。

これは Triangle クラスです。

 public class Triangle:IGameObject
 {
    Vector3 position;
    int speed;

    public Triangle(int speed, Vector3 vec) {
        this.speed = speed;
        position = new Vector3(vec);
    }
    public void Update() { }

    public void Render()
    {
        Gl.glPushMatrix();
        Gl.glRotated(speed*Time.deltaTime,speed*Time.deltaTime,speed*Time.deltaTime,speed*Time.deltaTime);

        Gl.glBegin(Gl.GL_TRIANGLE_STRIP);

            Gl.glColor3f(1.0f, 0.0f, 0.0f);
            Gl.glVertex3d(position.x, 0, 0);
            Gl.glColor3d(0.0, 1.0, 0.0);
            Gl.glVertex3d(position.y, 0, 0);
            Gl.glColor3d(0.0, 0.0, 1.0);
            Gl.glVertex3d(0, position.z, 0);

        Gl.glEnd();
        Gl.glPopMatrix();
    }
}

ここに Form.cs があります

public partial class Form1 : Form
{
    Triangle _trA = new Triangle(100, new Vector3(0.1f,-0.2f,0.2f));
    Triangle _trB = new Triangle(50, new Vector3(0.5f, 0.3f, -0.1f));
    public Form1()
    {
        InitializeComponent();
        _openGLControl.InitializeContexts();

        if (_fullscreen)
        {
            FormBorderStyle = FormBorderStyle.None;
            WindowState = FormWindowState.Maximized;
        }
        else {
            ClientSize = new Size(1280,720);
        }
    }

    void GameLoop()
    {
        Gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
        Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
        _trA.Render();
        _trB.Render();
        _openGLControl.Refresh();
    }
}

オブジェクトに使用した後(または前)にマトリックスをクリアする必要があることを見たと思いますが、それを理解できません。

何か案は?

4

1 に答える 1

2

さまざまな問題があります。

glPush/glPop

あなたは電話するべきです

Gl.glPushMatrix();

Render()メソッドの最初に、そして

Gl.glPopMatrix();

最後に。

そうしglRotated()ないと、すべての通話で蓄積されます。glPushMatrix()現在の ModelView マトリックスの複製を呼び出すと、回転を適用しglPopMatrix()て前の回転を復元できます。

glLoadIdentity

以下を呼び出して、GameLoop の開始時に ModelView マトリックスをリセットする必要があります。

Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glLoadIdentity();

これにより、変更が前のフレームから蓄積されるのを防ぎます。

Time.deltaTime を累積します

Time.deltaTimeこれは、最後のフレームから経過した秒単位の時間だと思います。これは一定である可能性が高く、その後speed*Time.deltaTimeも一定であるため、常に同じ角度で回転した三角形を表示するため、動きはありません。メンバーを作成し、GameLoop 呼び出しごとangleに呼び出してメンバーを増やす必要があります。angle += speed * Time.deltaTime

glRotated

の最後の 3 つの引数はglRotated、回転する軸の周りの回転軸を示します。2D シーンを使用しているので、この軸をカメラが見ている軸にしたいと思います。(0,0,1)次に、代わりに軸を使用する必要があります(angle,angle,angle)

結論

これらすべての要素を考慮すると、コードは次のようになります。

public class Triangle:IGameObject
{
    Vector3 position;
    int speed;
    double angle;

    public Triangle(int speed, Vector3 vec) {
        this.speed = speed;
        position = new Vector3(vec);
        angle = 0;
    }
    public void Update()
    { 
        angle += speed*Time.deltaTime;
    }

    public void Render()
    {
        Gl.glPushMatrix();
        Gl.glRotated(angle,0,0,1);

        Gl.glBegin(Gl.GL_TRIANGLE_STRIP);

            Gl.glColor3f(1.0f, 0.0f, 0.0f);
            Gl.glVertex3d(position.x, 0, 0);
            Gl.glColor3d(0.0, 1.0, 0.0);
            Gl.glVertex3d(position.y, 0, 0);
            Gl.glColor3d(0.0, 0.0, 1.0);
            Gl.glVertex3d(0, position.z, 0);

        Gl.glEnd();
        Gl.glPopMatrix();
    }
}

void GameLoop()
{
    // Update the scene
    _trA.Update();
    _trB.Update();

    // Draw the scene
    Gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
    Gl.glMatrixMode(Gl.GL_MODELVIEW);
    Gl.glLoadIdentity();
    _trA.Render();
    _trB.Render();
    _openGLControl.Refresh();
}
于 2013-07-07T02:06:54.477 に答える