我正在尝试制作一个顺时针旋转的三角形,但我不能。我做了一个定时器控制,但没有定时器的结果是一样的。因此,下面的代码不显示旋转三角形。 如何用CSGL旋转三角形?
namespace WinDrawCoordinate
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private float a = 0.0f;
private void Form1_Load(object sender, EventArgs e)
{
timer1.Start();
}
protected void Gosterim()
{
GL.glClear(GL.GL_COLOR_BUFFER_BIT);
GL.glLoadIdentity();
Hesapla();
Ucgen();
}
protected void ayarlar()
{
GL.glClearColor(1, 1, 1, 1);
GL.glShadeModel(GL.GL_FLAT);
}
protected void Hesapla()
{
a += 0.5f;
this.Refresh();
}
protected void Ucgen()
{
GL.glColor3f(0, 1, 1);
GL.glRotatef(a, 0, 0, -1);
GL.glBegin(GL.GL_TRIANGLES);
GL.glVertex2f(-0.2f, -0.2f);
GL.glVertex2f(0.2f, -0.2f);
GL.glVertex2f(0.0f, 0.2f);
GL.glEnd();
}
private void timer1_Tick(object sender, EventArgs e)
{
ayarlar();
Gosterim();
}
}
答案 0 :(得分:1)
从发布的代码中我看到了几件事:
您没有任何矩阵设置。虽然您可以使用默认矩阵,但您几乎肯定会指定自己的矩阵,以确保三角形符合您的预期。默认矩阵 应该在这里工作,因为它们指定了身份模型视图和投影。
您没有调用交换缓冲区。完成绘图后需要调用以交换前后缓冲区,以便显示三角形。对于CsGL,我认为您可以使用SwapBuffer()
方法。
请勿使用计时器来重绘。定时器在使用Windows消息泵时工作不可靠,很难从中获得好的结果。相反,你应该使用一个渲染循环 - 一个循环,它运行你的程序运行的整个时间,只是不断刷新屏幕。您必须确保为操作系统提供时间来处理您的消息。一个非常简单的渲染循环可能是:
void RenderLoop() {
while (true) {
SetUpCamera();
CreateGeometry();
SwapBuffers();
Application.DoEvents(); // this lets windows process messages
}
}
请注意,有更好的方法可以在C#中获得良好的消息循环,但这很容易设置和推理。
答案 1 :(得分:0)
仔细检查这一行:
GL.glRotatef(a, 0, 0, -1);
不应该吗?
GL.glRotatef(a, 0, 0, 1);
看起来你的旋转角度(a)的增量应该没问题....但是计时器“滴答”并开火ayarlar
和Gosterim
的速度有多快?
另外你可能想要添加一个关于旋转角度的检查,如果它循环很多并且超过359.5(因为你每次增加0.5),那么你将逐字地“完整圆”