3D太阳系 系统的OpenGL C#实例_3D太阳系实例
2014-08-04 16:59:22  By: dwtedx

简介

你好,这是一个3D太阳能系统实现用OpenGL和C#。我想是因为这个演示它仅用于教育目的

以保持它的简单。它包含了太阳,行星,我们的月亮,行星的轨道和一些明星

它被编程在Visual Studio 2008和我有它升级到Visual Studio 2010中、没有任何形式问题

我用这个演示陶宏命名空间,它是OpenGL的DLL和NET框架之间的互操作性

我也用Shadowengine,由我开发摆脱了硬编码的纹理加载,其中包括图形上下文的初始化乏味的,你一个小图形框架


太阳系看形式看一个3D的程序员点

那么,做了太阳能系统包含?行星,孙卫星,宇宙的背景等作为3D程序员,你应该觉得你将如何把这些实体编程环境的星星

例如,宇宙是全黑与具有黑色背景,你会解决这个问题。 OpenGL的具有该功能已经Gl.glClearColor(0,0,0,1)

红,绿,蓝阿尔法将背景色设置为黑色。关于明星,他们只是亮点,然后你可以利用OpenGL图元的处理点的绘制

您可以利用随机函数产生了很多明星,如果你懒得把他们一个接一个

你只需要确保他们不属于太阳系内部。行星只是球的纹理;他们也有轨道,并在其自身的轴线旋转

所以你必须跟踪这些变量的使用和更新它们,因为它们随时间改变。如果你不想让球在3D Max中

你可以使用OpenGL二次曲面,因为它定义了一套基本的三角形状,也定义纹理坐标为他们

卫星的行星,唯一的区别是,他们的旋转轴位于没有太阳的行星一样

源代码 MainForm.cs

hdc = (uint)pnlViewPort.Handle;
string error = "";
OpenGLControl.OpenGLInit(ref hdc, pnlViewPort.Width, pnlViewPort.Height, ref error);
在这里,它的代码的装入纹理转换成OpenGL的内存:

ContentManager.SetTextureList("texturas\");
ContentManager.LoadTextures();  
我的小引擎负责加载所有位于该文件夹中的纹理,纹理格式acepted是TGA的JPG和BMP

纹理可能不NPOT(两个非动力),仍然会正确加载。、在这里,它绘制的所有场景中的代码:

private void tmrPaint_Tick(object sender, EventArgs e)
{
    // clears OpenGL
    Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
    //updates the camera
    solarSystem.Camara.Update(moving);
    //draws the scene
    solarSystem.DrawsScene();
    //swaps buffers
    Winapi.SwapBuffers(hdc);
    //finish drawing operations
    Gl.glFlush();
}

源代码 Planet.cs

public void DrawOrbit()
{
    Gl.glBegin(Gl.GL_LINE_STRIP);
    for (int i = 0; i < 361; i++)
    {
        Gl.glVertex3f(p.x * (float)Math.Sin(i * Math.PI / 180), 
        0, p.x * (float)Math.Cos(i * Math.PI / 180));
    }
    Gl.glEnd(); 
}

源代码 Satellite.cs SolarSystem.cs Sun.cs 请下载下面的分享


源代码 Star.cs

public void CreateStars(int amount)
{
    Random r = new Random();
    int count = 0;

    while (count != amount)
    {
        Position p = default(Position);
        p.x = (r.Next(110)) * (float)Math.Pow(-1, r.Next());
        p.z = (r.Next(110)) * (float)Math.Pow(-1, r.Next());
        p.y = (r.Next(110)) * (float)Math.Pow(-1, r.Next());
        if (Math.Pow(Math.Pow(p.x, 2) + Math.Pow(p.y, 2) 
		+ Math.Pow(p.z, 2), 1 / 3f) > 15)
        {
            stars.Add(p);
            count++;
        }
    }
}
最后再给大家献上源代码链接: http://dwtedx.com/download.html?bdkey=s/1o6yTBlS 密码: g3ls

若资源对你有帮助、浏览后有很大收获、不妨小额打赏我一下、你的鼓励是维持我不断写博客最大动力

想获取DD博客最新代码、你可以扫描下方的二维码、关注DD博客微信公众号(ddblogs)

或者你也可以关注我的新浪微博、了解DD博客的最新动态:DD博客官方微博(dwtedx的微博)

如对资源有任何疑问或觉得仍然有很大的改善空间、可以对该博文进行评论、希望不吝赐教

为保证及时回复、可以使用博客留言板给我留言: DD博客留言板(dwtedx的留言板)

感谢你的访问、祝你生活愉快、工作顺心、欢迎常来逛逛


快速评论


技术评论

  • 该技术还没有评论、赶快抢沙发吧...
DD记账
top
+