标题:提出问题,C#如何运用OPENGL的glVertex3f?
取消只看楼主
jianfeixu
Rank: 1
等 级:新手上路
帖 子:96
专家分:0
注 册:2005-1-24
 问题点数:0 回复次数:1 
提出问题,C#如何运用OPENGL的glVertex3f?

我先提供一段程序,是C#的OPENGL的, 先创建一个// 创建一个View类,继承自CsGL.OpenGL.OpenGLControl internal class View : OpenGLControl // 创建一个View类,继承自CsGL.OpenGL.OpenGLControl { float[] Light_Model_Ambient={ 0.0f , 1.0f , -1.0f , 1.0f }; // 全局环境光 偏绿色 private float Angle; // 旋转角度 private float Step = 5f; // 控制旋转角速度

protected override void InitGLContext() { GL.glEnable( GL.GL_LIGHTING ); // 启用光照 GL.glEnable( GL.GL_LIGHT0 ); // 启用0号光源 GL.glLightModelfv( GL.GL_LIGHT_MODEL_AMBIENT , Light_Model_Ambient ); // 设置全局环境光 GL.glEnable( GL.GL_DEPTH_TEST ); // 启用深度检测 } protected override void OnSizeChanged( System.EventArgs e) { base.OnSizeChanged( e ); Size _Size = Size;

GL.glMatrixMode(GL.GL_PROJECTION); // 选择 GL_PROJECTION 矩阵 GL.glLoadIdentity(); // 重置投影矩阵 GL.gluPerspective( 50.0f , (double)_Size.Width / (double)_Size.Height , 0.1f , 100.0f ); // 设置透视图 GL.glMatrixMode(GL.GL_MODELVIEW); // 选择模型观察( GL_MODELVIEW )矩阵 GL.glLoadIdentity(); // 重置当前的模型观察矩阵 }

public override void glDraw() { GL.glClear( GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT ); // 清除颜色缓存

GL.glLoadIdentity(); // 重置当前的模型观察矩阵 GL.glTranslatef( 0.0f , 0.0f , -4.0f ); // 调整视图 GL.glRotatef( 15.0f , 0.0f , 1.0f , 0.0f ); // 设置视图角度 Angle += Step; GL.glRotatef( Angle , 0.0f , 1.0f , 0.0f ); // 控制旋转 /********************************************************************************************/ GLUT.glBegin(GL.GL_QUADS); // 绘制正方形 GLUT.glVertex3f(-1.0f, 1.0f, 0.0f); // 左上 GLUT.glVertex3f( 1.0f, 1.0f, 0.0f); // 右上 GLUT.glVertex3f( 1.0f,-1.0f, 0.0f); // 右下 GLUT.glVertex3f(-1.0f,-1.0f, 0.0f); // 左下 GLUT.glEnd(); // 正方形绘制结束 /********************************************************************************************/ GLUT.glTranslatef(2.0f, 0.0f, 0.0f); // 右移3单位 /********************************************************************************************/ GLUT.glBegin(GL.GL_TRIANGLES); // 绘制三角形 GLUT.glVertex3f( 0.0f, 1.0f, 0.0f); // 上顶点 GLUT.glVertex3f(-1.0f,-1.0f, 0.0f); // 左下 GLUT.glVertex3f( 1.0f,-1.0f, 0.0f); // 右下

GLUT.glVertex3f( 1.0f, 1.0f, 0.0f); // 上顶点 GLUT.glVertex3f( 0.0f,-1.0f, 0.0f); // 左下 GLUT.glVertex3f( 2.0f,-1.0f, 0.0f); // 右下 GLUT.glEnd(); // 三角形绘制结束 /********************************************************************************************/ unsafe { fixed(int *oo=byIndex) { fixed(int *q=nSrcBox) { //GL.glEnableClientState( GL.GL_VERTEX_ARRAY ); // 启用顶点数组 //GL.glVertexPointer( 3, GL.GL_INT, 0, q ); // 设置顶点数组地址 //GL.glDrawElements(GL.GL_POLYGON, 48, GL.GL_UNSIGNED_INT, oo); //GL_TRIANGLES } } //fixed(float * ddd=intertwined) //{ // GL.glInterleavedArrays(GL.GL_C3F_V3F, 0,ddd); //} } //GL.glFlush(); // 强制绘制完成 } private static int [] byIndex ={0, 4, 6,0, 2, 4,0, 6, 7,0, 7, 1,0, 3, 2,0, 1, 3,5, 2, 3,5, 4, 2,5, 6, 4,5, 7, 6, 5, 1, 7,5, 3, 1,1,8,3,7,8,1,5,8,7,3,8,5 }; private static int [] byIndex_1 ={ 0, 3, 2, 0, 1, 3 }; private static float[] intertwined = { 1.0f, 0.2f, 1.0f, 100.0f, 100.0f, 0.0f, 1.0f, 0.2f, 0.2f, 0.0f, 200.0f, 0.0f, 1.0f, 1.0f, 0.2f, 100.0f, 300.0f, 0.0f, 0.2f, 1.0f, 0.2f, 200.0f, 300.0f, 0.0f, 0.2f, 1.0f, 1.0f, 300.0f, 200.0f, 0.0f, 0.2f, 0.2f, 1.0f, 200.0f, 100.0f, 0.0f }; private static int [] nSrcBox = { 1, 1, -1,1,1, 1, 1, -1, -1,1, -1, 1, -1, -1, -1,-1, -1, 1, -1, 1, -1,-1,1, 1 ,0,0,2 }; private static int [] nSrcBox_1 = { 0, 0, 0,1,0, 0, 0, 1, 0,1, 1, 0 }; public int [] s ; } 主程序中有如下操作, private void button36_Click(object sender, System.EventArgs e) { int[] edge=new int[pictureBox1.Image.Width*pictureBox1.Image.Height]; Color c1=new Color(); int r1; Bitmap box1=new Bitmap(pictureBox1.Image); for(int i=0;i<pictureBox1.Image.Width-1;i++) { for(int j=0;j<pictureBox1.Image.Height-1;j++) { c1=box1.GetPixel(i,j); r1=c1.R; edge[i+j*pictureBox1.Image.Width]=r1; } } _View.s=edge; //while(!this.IsDisposed ) //{ //if( !this.IsFinished ) //{

_View.Parent = this.panel3; // 设置_View的父容器 _View.Dock = DockStyle.Fill; // 使_View的各个边缘都停靠在_Form1的各个边缘 并适当调整大小 _View.glDraw(); // 绘制 _View.Refresh(); // 刷新

//} //} Application.DoEvents(); // 处理在当前消息队列中的所有Windows消息 } 现在问题是,如果我在主程序用有一个128X128的数据数组,而我要用到glVertex3f,我应该如何在类中建立这个数据数组,

搜索更多相关主题的帖子: OPENGL float View 
2005-05-24 21:20
jianfeixu
Rank: 1
等 级:新手上路
帖 子:96
专家分:0
注 册:2005-1-24
得分:0 
其实没有很复杂的,定义公共变量就可以了!在这里丢脸了
2005-05-25 11:31



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-19223-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.344405 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved