地月系3D-OPENGL
2008-09-24 15:52
162 查看
使用CSGL开源框架来做这个系统,主要需要注意一些基本调用。这里都已经封装了起来。
此外注意Drawtexture(int index) ,如果里边的GL.glTexParameteri参数不适当,也可能引起无法正常显示的情况。
using System; using System.Collections.Generic; using System.Text; using System.Drawing; using System.Drawing.Imaging; using CsGL.OpenGL; namespace USTC { class OpenGlTool { private uint[] texture; private uint[] Textures_dispList; public OpenGlTool(int n) { texture = new uint ; Textures_dispList = new uint ; GL.glGenTextures(1, texture); } /// /// 载?入?第?几?个?索?引?图? /// /// 文?件?名? /// 绑?定?UNIT指?针?索?引?,?代?表?第?几?幅?素?材?图? /// public void loadBit(int index, string fileName) { //string fileName = "image/earth.bmp"; GL.glNewList(Textures_dispList[index] = GL.glGenLists(1), GL.GL_COMPILE_AND_EXECUTE); GL.glBindTexture(GL.GL_TEXTURE_2D, texture[index]); Bitmap img = new Bitmap(fileName); Rectangle rect = new Rectangle(0, 0, img.Width, img.Height); BitmapData tex = img.LockBits(rect, ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR); GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR); GL.glTexImage2D(GL.GL_TEXTURE_2D, 0, (int)GL.GL_RGB8, img.Width, img.Height, 0, GL.GL_BGRA_EXT, GL.GL_UNSIGNED_BYTE, tex.Scan0); img.UnlockBits(tex); GL.glEndList(); // GL.glTexParameteri(GL.GL_TEXTURE_2D, GLTexParamPName.TextureMinFilter, GLTextureFilter.Linear); // GL.glTexParameteri(GL.GL_TEXTURE_2D, GLTexParamPName.TextureMagFilter, GLTextureFilter.Linear); //绑?定?我?们?之?前?定?义?好?的?纹?理? //用?于?自?动?纹?理?映?射?的?二?次?曲?面?对?象? //绘?制?半?径?为?.3 的?球?体?,?同?时?使?用? } /// /// 绑?定?UNIT指?针?索?引?,?代?表?第?几?幅?素?材?图? /// /// public void Drawtexture(int index) { GL.glBindTexture(GL.GL_TEXTURE_2D, texture[index]); //GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_S, GL.GL_CLAMP); // GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_WRAP_T, GL.GL_CLAMP); GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR); GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR); // GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR); // GL.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR_MIPMAP_NEAREST); } public void sunshare() { //开?启?光?照?渲?染? GL.glEnable(GL.GL_LIGHTING); //设?置?光?源?属?性? float[] light_ambient = { 0.7F, 0.0F, 0.0F, 1.0F };//R,G,B,ALPHA float[] light_diffuse = { 0.5F, 0F, 0F, 0.5F }; //指?定?光?源?的?位?置? float[] light_position = { 0.0F, 0.0F, 10.0F, 1.0F }; //用?定?义?好?的?光?源?属?性?给?指?定?光?源?GL_LIGHT0 进?行?设?置? GL.glLightfv(GL.GL_LIGHT0, GL.GL_AMBIENT, light_ambient); GL.glLightfv(GL.GL_LIGHT0, GL.GL_DIFFUSE, light_diffuse); GL.glLightfv(GL.GL_LIGHT0, GL.GL_POSITION, light_position); //开?启?设?置?的?光?源?GL_LIGHT0 GL.glEnable(GL.GL_LIGHT0); //镜?面?反?射? // float[] planet_specular = { 0.5F , 0.5F , 0.5F , 0.5F }; // GL.glMaterialfv(GL.GL_FRONT, GL.GL_SPECULAR, planet_specular); //打?开?全?局?光?照? // GL.glLightModelfv(GL.GL_LIGHT_MODEL_AMBIENT, light_ambient); } #region 画?几?何?体? /// /// 画?正?方?体? /// public void Esquare() { GL.glBegin(GL.GL_QUAD_STRIP);// GL.glVertex3f(0.0f, 0.0f, 0.0f);//a0点? GL.glVertex3f(0.0f, 1.0f, 0.0f);//a1点? GL.glVertex3f(1.0f, 0.0f, 0.0f);//b0点? GL.glVertex3f(1.0f, 1.0f, 0.0f);//b1点? GL.glVertex3f(1.0f, 0.0f, -1.0f);//c0点? GL.glVertex3f(1.0f, 1.0f, -1.0f);//c1点? GL.glVertex3f(0.0f, 0.0f, -1.0f);//d0点? GL.glVertex3f(0.0f, 1.0f, -1.0f);//d1点? GL.glVertex3f(0.0f, 0.0f, 0.0f);//a0点? GL.glVertex3f(0.0f, 1.0f, 0.0f);//a1点? GL.glEnd(); GL.glBegin(GL.GL_POLYGON);// GL.glVertex3f(0.0f, 0.0f, 0.0f);//a0点? GL.glVertex3f(1.0f, 0.0f, 0.0f);//b0点? GL.glVertex3f(1.0f, 0.0f, -1.0f);//c0点? GL.glVertex3f(0.0f, 0.0f, -1.0f);//d0点? GL.glVertex3f(0.0f, 1.0f, 0.0f);//a1点? GL.glVertex3f(1.0f, 1.0f, 0.0f);//b1点? GL.glVertex3f(1.0f, 1.0f, -1.0f);//c1点? GL.glVertex3f(0.0f, 1.0f, -1.0f);//d1点? GL.glEnd(); } #endregion } }
调用类:
using System; using System.Collections.Generic; using System.Text; using CsGL.OpenGL; using System.IO; using System.Drawing; using System.Drawing.Imaging; using Exocortex; namespace Solar_system { class SolarSystemView : OpenGLControl { private static int year = 0, day = 0, day1 = 0; USTC.OpenGlTool tool; GLUquadric g_text = GL.gluNewQuadric(); protected override void InitGLContext() { GLU.gluQuadricNormals(g_text, GLU.GLU_SMOOTH); GLU.gluQuadricOrientation(g_text, GLU.GLU_OUTSIDE); GLU.gluQuadricTexture(g_text, (byte)GL.GL_TRUE); GLU.gluQuadricDrawStyle(g_text, GLU.GLU_FILL); base.InitGLContext(); GL.glEnable(GL.GL_DEPTH_TEST); GL.glDepthFunc(GL.GL_LESS); GL.glEnable(GL.GL_BLEND); GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE); //GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA); GL.glMatrixMode(GL.GL_MODELVIEW); GL.glEnable(GL.GL_TEXTURE_2D); tool = new USTC.OpenGlTool(1); //如?果?是?多?个?贴?图?,?下?边?将?是?多?个?载?入?loadBit tool.loadBit(0, "image/earth.bmp"); //sunshare(); } protected override void OnSizeChanged(EventArgs e) { base.OnSizeChanged(e); //得?到?当?前?屏?幕?尺?寸? GL.glViewport(0, 0, Size.Width, Size.Height); GL.glMatrixMode(GL.GL_PROJECTION); GL.glLoadIdentity(); GL.gluPerspective(60, Size.Width / Size.Height, 1, 30); GL.glMatrixMode(GL.GL_MODELVIEW); GL.glLoadIdentity(); GL.gluLookAt(0, 5, 15, 0, 0, 0, 0, 2, 0); } public override void glDraw() { base.glDraw(); GL.glClear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT); GL.glEnable(GL.GL_BLEND); tool.Drawtexture(0); GL.gluSphere(g_text, 2, 30, 30);//半?径?为? //绘?制?地?月?系? GL.glPushMatrix(); GL.glRotated(year, 0, 1, 0);//绕?y轴?转?动? GL.glTranslated(5, 0, 0);//平?移?个?单?位? //绘?制?地?球? GL.glPushMatrix(); GL.glRotated(day, 0, 1, 0);//绕?y轴?转?动? // GL.glColor3f(0, 0, 1); tool.Drawtexture(0); GL.gluSphere(g_text,0.6, 12, 12); GL.glPopMatrix(); //绘?制?月?球? GL.glRotated(day1, 0, 1, 0);//绕?y轴?转?动? GL.glTranslated(1, 0, 0); GL.glRotated(day1, 0, 1, 0);//绕?y轴?转?动? GL.glutWireSphere(0.1, 6, 6); GL.glPopMatrix(); GL.glDisable(GL.GL_BLEND); year = year > 360 ? (year % 360 + 1) : (year + 1); day = day > 360 ? (day % 360 + 5) : (day + 5); day1 = day1 > 360 ? (day1 % 360 + 20) : (day1 + 20); OnSizeChanged(null);//使?显?示?更?加?流?畅? } } } 调用:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; using CsGL.OpenGL; using Solar_system; namespace test2 { public partial class Form1 : Form { private static Thread thrDraw; private SolarSystemView view; public Form1() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false; this.view = new SolarSystemView(); this.view.Parent = this; this.view.Dock = System.Windows.Forms.DockStyle.Fill; //this.Controls.Add(this.view); } private void OpenGL_Start() { while (true) { this.view.Refresh(); Thread.Sleep(80); } } private void Form1_Load(object sender, EventArgs e) { ThreadStart start = new ThreadStart(OpenGL_Start); thrDraw = new Thread(start); thrDraw.Start(); } } }
相关文章推荐
- opengl学习笔记3-2-在3D中画线
- Qt OpenGL:学习现代3D图形编程之三,移动三角形
- OpenGL实现3d
- [OpenGL(C++)] - (开源)3D 游戏界的大牛人 John Carmack 终于放出quakeIII(雷神之锤3)的源代码
- OpenGL实现3D模型自由旋转——之代码解析
- Tom Mulgrew——教你用Basic语言制作2D/3D OpenGL 程序(全中文教程) 二
- PRJ: 3D Object View - OpenGL与SDL的整合
- OpenGL学习入门之3D光照机器人
- 【OpenGL】“我叫MT”纯手工3D动画制作之2——建立模型
- Android移动开发-使用OpenGL来绘制3D纹理图的实现
- Qt下的OpenGL 编程(4)进军3D世界
- OpenGL学习程序,创建一个3D的三角椎体和正方体并旋转
- 学习OpenGL-ES: 3 - 3D绘图原理
- 3D OpenGL ES
- opengl | openmesh 读取显示3d模型文件
- 基于 OpenGL 进行 3D 图形开发
- OpenGL_Qt学习笔记之_04(3D图形的绘制和旋转)
- 3D基础:3D坐标变换在OpenGL 中的实践
- 3D Computer Graphics : A Mathematical Introduction with OpenGL