-----------------------------------------------------------------------
类的源代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CsGL.OpenGL;
namespace OpenGL_nn1
{
class Shili
{
private const double PI = 3.1415926;
private float x, y, angle;
private float xRot = 0.0f;
private float yRot = 0.0f;
public Shili() { }
public void Render3DShow()//显示螺旋线
{
GL.glClear(GL.GL_COLOR_BUFFER_BIT);
GL.glPushMatrix();
GL.glRotatef(xRot, 1.0f, 0.0f, 0.0f);
GL.glRotatef(yRot, 0.0f, 1.0f, 0.0f);
GL.glBegin(GL.GL_POINTS);
float z =-50.0f;
for (angle = 0.0f; angle <= (2.0f * Math.PI) * 3.0f; angle += 0.1f)
{
x = 50.0f* (float)Math.Sin(angle);
y = 50.0f* (float)Math.Cos(angle);
GL.glVertex3f(x, y, z);
z +=0.5f;
}
GL.glEnd();
GL.glPopMatrix();
GL.glFlush();
GL.glVertex3f(x, y, z);
}
}
}
7 个解决方案
#1
无限递归(自己调用自己)造成的。
#2
[Quote=引用楼主 的回复:]
怎么改啊。。。?求解
怎么改啊。。。?求解
#3
执行到哪行出现的?
#4
看代码没有递归,应该是GL类库内部的错误导致的,可以去找类库的新版本,或者看看说明书,也可能是你传参数不适当导致类库出错,
#5
namespace OpenGL_nn1
{
public class OpenGLBase:OpenGLControl
{
Timer Timer_GLupdate = new Timer();//窗口重绘计时器
private Shili shili = new Shili();
public OpenGLBase()
{
#region OpenGL屏幕刷新计时器
this.Timer_GLupdate.Tick += new EventHandler(Timer_GLupdate_Tick);
this.Timer_GLupdate.Interval = 10;
this.Timer_GLupdate.Start();
#endregion
/* 按键回调 */
// this.KeyDown += new KeyEventHandler(OpenGLBase_KeyDown);
}
private void Timer_GLupdate_Tick(Object sender, EventArgs e)//创建屏幕刷新计时器回调函数,每10ms刷新一次OpenGL窗口
{
this.Invalidate();
}
#region 窗体重绘
/// <summary>
/// 视口改变大小时重新设置视口和绘图
/// </summary>
/// <param name="e"></param>
protected override void OnSizeChanged(EventArgs e)
{
GL.glViewport(0, 0, this.Bounds.Width, this.Bounds.Height);//根据窗口大小设置视口
/*重置投影矩阵堆栈 */
GL.glMatrixMode(GL.GL_PROJECTION);
GL.glLoadIdentity();
GL.gluPerspective(40.0f, (float)this.Bounds.Width / (float)this.Bounds.Height, 0.1f, 500.0f);
GL.glMatrixMode(GL.GL_MODELVIEW);//重置模型视图矩阵
GL.glLoadIdentity();
}
/// <summary>
/// OnPaint方法处理Paint事件
/// </summary>
/// <param name="pevent"></param>
// protected override void OnPaint(System.Windows.Forms.PaintEventArgs pevent)
//{
// base.OnPaint(pevent);
//ToDo:可加入自己的设计代码
//}
#endregion
/* OpenGL初始化*/
protected override void InitGLContext()
{
base.InitGLContext();
GL.glMatrixMode(GL.GL_PROJECTION);//选择投影矩阵
GL.glLoadIdentity();//重设投影矩阵
GL.gluPerspective(40.0, ((double)(this.Width) / (double)(this.Height)), 1.0, 1000.0);//调整视口大小
GL.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);//黑色背景
GL.glMatrixMode(GL.GL_MODELVIEW);//选择模型观察矩阵
GL.glLoadIdentity();//重置模型观察矩阵
GL.glShadeModel(GL.GL_SMOOTH); // 启用阴影平滑
}
public override void glDraw()
{
GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // 清除屏幕及深度缓存
GL.glLoadIdentity(); //重置当前模型视图矩阵
GL.glColor3f(0.0f, 1.0f, 0.0f);//绘图颜色设置为绿色
GL.glPushMatrix();//保存矩阵状态并进行旋转
shili.Render3DShow();
GL.glFlush(); //刷新绘图命令
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
}
}
异常提示是class openGL,说CSGL有问题,可是之前画平面图像都没有问题呀。
#6
CSGL.dll从2002年开始就没有更新过了,平面图都没有问题,一画立体图就出错。。。
#7
你先把绘画的代码备份下,然后从最后开始删掉一行调试下,还异常就再删一行再调试,直到找出哪句话出的问题
#1
无限递归(自己调用自己)造成的。
#2
[Quote=引用楼主 的回复:]
怎么改啊。。。?求解
怎么改啊。。。?求解
#3
执行到哪行出现的?
#4
看代码没有递归,应该是GL类库内部的错误导致的,可以去找类库的新版本,或者看看说明书,也可能是你传参数不适当导致类库出错,
#5
namespace OpenGL_nn1
{
public class OpenGLBase:OpenGLControl
{
Timer Timer_GLupdate = new Timer();//窗口重绘计时器
private Shili shili = new Shili();
public OpenGLBase()
{
#region OpenGL屏幕刷新计时器
this.Timer_GLupdate.Tick += new EventHandler(Timer_GLupdate_Tick);
this.Timer_GLupdate.Interval = 10;
this.Timer_GLupdate.Start();
#endregion
/* 按键回调 */
// this.KeyDown += new KeyEventHandler(OpenGLBase_KeyDown);
}
private void Timer_GLupdate_Tick(Object sender, EventArgs e)//创建屏幕刷新计时器回调函数,每10ms刷新一次OpenGL窗口
{
this.Invalidate();
}
#region 窗体重绘
/// <summary>
/// 视口改变大小时重新设置视口和绘图
/// </summary>
/// <param name="e"></param>
protected override void OnSizeChanged(EventArgs e)
{
GL.glViewport(0, 0, this.Bounds.Width, this.Bounds.Height);//根据窗口大小设置视口
/*重置投影矩阵堆栈 */
GL.glMatrixMode(GL.GL_PROJECTION);
GL.glLoadIdentity();
GL.gluPerspective(40.0f, (float)this.Bounds.Width / (float)this.Bounds.Height, 0.1f, 500.0f);
GL.glMatrixMode(GL.GL_MODELVIEW);//重置模型视图矩阵
GL.glLoadIdentity();
}
/// <summary>
/// OnPaint方法处理Paint事件
/// </summary>
/// <param name="pevent"></param>
// protected override void OnPaint(System.Windows.Forms.PaintEventArgs pevent)
//{
// base.OnPaint(pevent);
//ToDo:可加入自己的设计代码
//}
#endregion
/* OpenGL初始化*/
protected override void InitGLContext()
{
base.InitGLContext();
GL.glMatrixMode(GL.GL_PROJECTION);//选择投影矩阵
GL.glLoadIdentity();//重设投影矩阵
GL.gluPerspective(40.0, ((double)(this.Width) / (double)(this.Height)), 1.0, 1000.0);//调整视口大小
GL.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);//黑色背景
GL.glMatrixMode(GL.GL_MODELVIEW);//选择模型观察矩阵
GL.glLoadIdentity();//重置模型观察矩阵
GL.glShadeModel(GL.GL_SMOOTH); // 启用阴影平滑
}
public override void glDraw()
{
GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); // 清除屏幕及深度缓存
GL.glLoadIdentity(); //重置当前模型视图矩阵
GL.glColor3f(0.0f, 1.0f, 0.0f);//绘图颜色设置为绿色
GL.glPushMatrix();//保存矩阵状态并进行旋转
shili.Render3DShow();
GL.glFlush(); //刷新绘图命令
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
}
}
}
异常提示是class openGL,说CSGL有问题,可是之前画平面图像都没有问题呀。
#6
CSGL.dll从2002年开始就没有更新过了,平面图都没有问题,一画立体图就出错。。。
#7
你先把绘画的代码备份下,然后从最后开始删掉一行调试下,还异常就再删一行再调试,直到找出哪句话出的问题