欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  技术分享

3D太阳系 系统的OpenGL C#实例_3D太阳系实例

程序员文章站 2022-03-01 16:26:38
...

简介

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

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

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

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

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

3D太阳系 系统的OpenGL C#实例_3D太阳系实例


太阳系看形式看一个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