【小沐学GIS】基于C++绘制三维太阳系SolarSystem(OpenGL、glfw、glut)

25 篇文章 45 订阅
16 篇文章 3 订阅
🍺三维数字地球系列相关文章如下🍺:
1【小沐学GIS】基于C++绘制三维数字地球Earth(456:OpenGL、glfw、glut)第一期
2【小沐学GIS】基于C++绘制三维数字地球Earth(456:OpenGL、glfw、glut)第二期
3【小沐学GIS】基于OpenSceneGraph(OSG)绘制三维数字地球Earth(7:OpenGL)
4【小沐学GIS】基于C++QT绘制三维数字地球Earth(8:OpenGL)
5【小沐学GIS】基于C++绘制太阳系SolarSystem(9:OpenGL、glfw、glut)
6【小沐学GIS】基于C#绘制三维数字地球Earth(10:OpenGL)
7【小沐学GIS】基于Python绘制三维数字地球Earth(11:OpenGL)
8【小沐学GIS】基于Android绘制三维数字地球Earth(12:OpenGL)
9【小沐学GIS】基于WebGL绘制三维数字地球Earth(13:OpenGL)

1、简介

1.1 太阳系概述

太阳系有一颗恒星、八颗行星、五颗官方认可的矮行星、至少 290 颗卫星、超过 130 万颗小行星和大约 3,900 颗彗星。
在这里插入图片描述

它位于银河系的外旋臂中,称为猎户座臂或猎户座支线。我们的太阳系以大约515,000英里/小时(828,000公里/小时)的速度绕银河系中心运行。大约需要2.3亿年才能完成围绕银河系中心的一个轨道。

我们称它为太阳系,因为它由我们的恒星、太阳和所有被引力束缚的东西组成——水星、金星、地球、火星、木星、土星、天王星和海王星;矮行星冥王星、谷神星、马克马克、豪米亚和厄里斯——以及数百颗卫星;以及数以百万计的小行星、彗星和流星体。
在这里插入图片描述
我们的太阳系是我们所知道的唯一一个拥有支持生命的行星的太阳系。到目前为止,我们只知道地球上的生命,但我们正在寻找其他星球上的生命。

在这里插入图片描述

1.2 电磁频谱

电磁能由带电粒子的振动产生,以波的形式穿过大气层和太空真空。这些波具有不同的波长(从波峰到波峰的距离)和频率;波长越短意味着频率越高。有些波长更长,如无线电波、微波和红外波,而另一些波长更短,如紫外线、X 射线和伽马射线。可见光位于长波到短波辐射范围的中间。这一小部分能量是人眼能够检测到的全部。电磁波谱图如下图。
在这里插入图片描述

1.3 球体坐标计算

std::vector<float> sphereVertices;
std::vector<int> sphereIndices;

/*计算球体顶点*/
//(1)生成组成球的顶点Vertices
for (int y=0;y<=Y_SEGMENTS;y++)
{
	for (int x=0;x<=X_SEGMENTS;x++)
	{
		float xSegment = (float)x / (float)X_SEGMENTS;
		float ySegment = (float)y / (float)Y_SEGMENTS;
		float xPos = std::cos(xSegment * 2.0f * PI) * std::sin(ySegment * PI);
		float yPos = std::cos(ySegment * PI);
		float zPos = std::sin(xSegment * 2.0f * PI) * std::sin(ySegment * PI);
		sphereVertices.push_back(xPos);
		sphereVertices.push_back(yPos);
		sphereVertices.push_back(zPos);
	}
}

//(2)生成组成球的三角形面片的顶点序号Indices
for (int i=0;i<Y_SEGMENTS;i++)
{
	for (int j=0;j<X_SEGMENTS;j++)
	{
		sphereIndices.push_back(i * (X_SEGMENTS + 1) + j);
		sphereIndices.push_back((i + 1) * (X_SEGMENTS + 1) + j);
		sphereIndices.push_back((i + 1) * (X_SEGMENTS + 1) + j+1);
		sphereIndices.push_back(i* (X_SEGMENTS + 1) + j);
		sphereIndices.push_back((i + 1) * (X_SEGMENTS + 1) + j + 1);
		sphereIndices.push_back(i * (X_SEGMENTS + 1) + j + 1);
	}
}

9、代码测试

9.1 opengl / glfw / glew / stb / c++ / 太阳系(3d)

在这里插入图片描述
在这里插入图片描述

9.2 opengl / glut / glew / lodepng / c++ / 太阳系(3d)

在这里插入图片描述
在这里插入图片描述

9.3 opengl / glfw / glad / imgui / freetype / c++ / 太阳系(3d)

在这里插入图片描述
在这里插入图片描述

9.4 opengl / glut / tga / c++ / 太阳系(3d)

在这里插入图片描述
在这里插入图片描述

9.5 opengl / glfw / glad / glm / stb / c++ / 太阳系(3d)

在这里插入图片描述
在这里插入图片描述

9.6 opengl / glut / tga / c++ / 太阳系(3d)

在这里插入图片描述
在这里插入图片描述

9.7 opengl / glfw / glad / glm / stb / freetype / c++ / 太阳系(3d)

在这里插入图片描述
在这里插入图片描述

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

  • 20
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个使用glfw glad绘制卧室三维场景的完整C++代码,代码中包含了一些基本的场景渲染和交互功能,可以作为参考。 ``` #include <glad/glad.h> #include <GLFW/glfw3.h> #include <iostream> void framebuffer_size_callback(GLFWwindow* window, int width, int height); void processInput(GLFWwindow *window); // 窗口大小 const unsigned int SCR_WIDTH = 800; const unsigned int SCR_HEIGHT = 600; int main() { // 初始化glfw glfwInit(); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // 创建窗口 GLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "Bedroom Scene", NULL, NULL); if (window == NULL) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); // 初始化glad if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) { std::cout << "Failed to initialize GLAD" << std::endl; return -1; } // 设置视口大小 glViewport(0, 0, SCR_WIDTH, SCR_HEIGHT); // 注册窗口大小改变的回调函数 glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); // 渲染循环 while (!glfwWindowShouldClose(window)) { // 处理输入 processInput(window); // 渲染指令 glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); // 交换缓冲区 glfwSwapBuffers(window); glfwPollEvents(); } // 清理 glfwTerminate(); return 0; } void framebuffer_size_callback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height); } void processInput(GLFWwindow *window) { if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) glfwSetWindowShouldClose(window, true); } ``` 这个代码只是一个简单的框架,你需要在这个基础上添加你自己的3D场景渲染代码。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值