2013-07-06 2 views
0

그래서 삼각형 클래스가 있고 삼각형의 인스턴스를 그려야하지만 몇 가지 이유로 단 하나만 그려지고 그 뒤에있는 논리는 저를 넘어 있습니다.OpenGl, 여러 삼각형 객체 그리기 C#

나는 주변을 둘러 보았지만, 발견 된 것은 모든 삼각형이 같은 파일에 그려지는 예입니다.

이 삼각형 클래스입니다 : 여기

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(); 
    } 
} 

입니다 객체이지만 그것을 알아낼 수는 없습니다.

아이디어가 있으십니까?

glPush/glPop

당신은 당신의 Render() 방법의 시작 부분에

Gl.glPushMatrix(); 

를 호출해야하고, 상기

Gl.glPopMatrix(); 

:

답변

2

이 다른 문제입니다 종료.

그렇지 않으면 glRotated()이 모든 통화에서 누적됩니다. glPushMatrix()을 호출하면 현재 ModelView 행렬을 복사 한 다음 회전을 적용하고 glPopMatrix()은 이전 모델을 복원 할 수 있습니다.

glLoadIdentity 함수 당신은 GameLoop의 시작 부분에 모델 뷰 행렬을 재설정해야

호출하여 :

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

이 이전 프레임에서 축적 대한 수정을 방지 할 수 있습니다.

은 마지막 프레임 이후 과거를 가지고 Time.deltaTime

내가 Time.deltaTime는 시간 (초)입니다 추측 것을 축적한다. 이것은 상수 일 가능성이 높으므로 speed*Time.deltaTime도 상수이므로 동일한 각도로 회전 된 삼각형을 항상 표시하므로 움직임이 없습니다. angle 회원을 만들고 각 GameLoop 통화에서 angle += speed * Time.deltaTime으로 전화하여 늘려야합니다.

glRotated의 마지막 세 인수 당신이 회전하는 하나의 주위에 회전축을 표시

을 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(); 
} 
+0

그것을 할 수 있습니다. 내가 얻는 것은 정상에있는 삼각형과 깜박 거릴 것 같은 다른 두 개입니다. 어쨌든 고마워. – Everts

+0

@fafase 다른 값으로 회전했는지 확인 했습니까? 'Gl.glRotated (speed * Time.deltaTime, speed * Time.deltaTime, speed * Time.deltaTime, speed * Time.deltaTime); 매개 변수의 값을 출력한다. 삼각형 (같은 위치에 있으므로 하나처럼 보임) – Boris

+0

좋아, 나는 진보 해. 지금 내가 가진 것은 다른 삼각형 객체를 얻지 만 문제는 순환 게재로 남아 있습니다. 그들은 당신이 말했듯이 둘 다 회전을 반복합니다. 그러나 회전하기 전에 glPushMatrix()를 넣으면 아무런 움직임이 없습니다. – Everts