OpenGL--恒星,卫星,行星系统

2023-10-30 03:59

本文主要是介绍OpenGL--恒星,卫星,行星系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为了方便,先用金字塔,正方体,小正方体代替恒星,卫星,行星。
并用矩阵堆栈的形式实现。
在这里插入图片描述

#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <string>
#include <iostream>
#include <fstream>
#include <cmath>
#include <stack>
#include <glm\glm.hpp>
#include <glm\gtc\type_ptr.hpp> // glm::value_ptr
#include <glm\gtc\matrix_transform.hpp> // glm::translate, glm::rotate, glm::scale, glm::perspective
#include "Utils.h"
using namespace std;#define numVAOs 1
#define numVBOs 2float cameraX, cameraY, cameraZ;//视图矩阵,相机位置
GLuint renderingProgram;
GLuint vao[numVAOs];
GLuint vbo[numVBOs];// 分配在display()函数中使用的变量空间,这样它们就不必在渲染过程中分配
GLuint mvLoc, projLoc;
int width, height;
float aspect;
glm::mat4 pMat, vMat, mMat, mvMat;stack<glm::mat4>mvStack;void setupVertices(void) {//正方体//36个顶点,12个三角形,组成了放置在原点处的2×2×2立方体float vertexPositions[108] = {-1.0f,  1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f,1.0f, -1.0f, -1.0f, 1.0f,  1.0f, -1.0f, -1.0f,  1.0f, -1.0f,1.0f, -1.0f, -1.0f, 1.0f, -1.0f,  1.0f, 1.0f,  1.0f, -1.0f,1.0f, -1.0f,  1.0f, 1.0f,  1.0f,  1.0f, 1.0f,  1.0f, -1.0f,1.0f, -1.0f,  1.0f, -1.0f, -1.0f,  1.0f, 1.0f,  1.0f,  1.0f,-1.0f, -1.0f,  1.0f, -1.0f,  1.0f,  1.0f, 1.0f,  1.0f,  1.0f,-1.0f, -1.0f,  1.0f, -1.0f, -1.0f, -1.0f, -1.0f,  1.0f,  1.0f,-1.0f, -1.0f, -1.0f, -1.0f,  1.0f, -1.0f, -1.0f,  1.0f,  1.0f,-1.0f, -1.0f,  1.0f,  1.0f, -1.0f,  1.0f,  1.0f, -1.0f, -1.0f,1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f,  1.0f,-1.0f,  1.0f, -1.0f, 1.0f,  1.0f, -1.0f, 1.0f,  1.0f,  1.0f,1.0f,  1.0f,  1.0f, -1.0f,  1.0f,  1.0f, -1.0f,  1.0f, -1.0f};//金字塔//18个顶点,6个三角形float pyramidPositions[54] ={ -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 0.0f,    //front1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 1.0f, 0.0f,    //right1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 1.0f, 0.0f,  //back-1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 1.0f, 0.0f,  //left-1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, //LF1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f  //RR};glGenVertexArrays(1, vao);//创建顶点数组对象VAO,      //数据集发送给管线时,是以缓冲区形式发送的glBindVertexArray(vao[0]);//将指定的VAO标记为活跃,生成的缓冲区和这个VAO关联glGenBuffers(numVBOs, vbo);//创建VBO.//参数1,创建多少个ID,参数2,保存返回的ID的数组glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);//将缓冲区【0】标记为活跃glBufferData(GL_ARRAY_BUFFER, sizeof(vertexPositions), vertexPositions, GL_STATIC_DRAW);//将包含顶点数据的数组复制进活跃缓冲区glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);glBufferData(GL_ARRAY_BUFFER, sizeof(pyramidPositions), pyramidPositions, GL_STATIC_DRAW);
}//init()函数负责执行只需要一次的任务
void init(GLFWwindow* window) {renderingProgram = Utils::createShaderProgram("vertShader.glsl", "fragShader.glsl");//获取GL程序的ID,该程序创建着色器glfwGetFramebufferSize(window, &width, &height);aspect = (float)width / (float)height;//屏幕纵横比.透视矩阵需要的参数//构建透视矩阵//根据所需的视锥提供3D效果,这里放在了init里,因为只需要构建一次pMat = glm::perspective(1.0472f, aspect, 0.1f, 1000.0f);//构建透视矩阵//参数 1. 指定视场角(这里是60°,对应弧度是1.0472)//,2. 屏幕纵横比 ,3.近裁剪平面,4.远裁剪平面cameraX = 0.0f; cameraY = 0.0f; cameraZ = 12.0f;//相机放在z轴的下方setupVertices();//将顶点数据复制进缓冲区
}//调用display函数的速率被称为帧率
void display(GLFWwindow* window, double currentTime) {
//配置背景,深度缓冲区,渲染程序,以及和原来一样的投影矩阵/////清除深度缓冲区glClear(GL_DEPTH_BUFFER_BIT);//隐藏面消除需要同时用到颜色缓冲区和深度缓冲区glClearColor(1.0, 1.0, 1.0, 1.0);						//这里只清楚了深度缓冲区,不然可能会导致黑屏glClear(GL_COLOR_BUFFER_BIT);glEnable(GL_CULL_FACE);//背面剔除//启用着色器glUseProgram(renderingProgram);//将含有两个已编译着色器的程序载入OpenGL管线阶段(在GPU上!)//glUseProgram没有运行着色器,它只是将着色器加载进硬件//着色器需要视图矩阵的统一变量//获取V矩阵和投影矩阵的统一变量// m/模型矩阵在世界坐标空间中表示对象的位置和朝向mvLoc = glGetUniformLocation(renderingProgram, "mv_matrix");//获取着色器程序中MV矩阵统一变量的位置projLoc = glGetUniformLocation(renderingProgram, "proj_matrix");//获取着色器程序中投影矩阵统一变量的位置
//将视图矩阵推入堆栈vMat = glm::translate(glm::mat4(1.0f), glm::vec3(-cameraX, -cameraY, -cameraZ));//v,视图,相机,变换矩阵mvStack.push(vMat);//摄像机glUniformMatrix4fv(projLoc, 1, GL_FALSE, glm::value_ptr(pMat));//将矩阵数据发送到统一变量中//--------------------pyramid == sunmvStack.push(mvStack.top());//将新矩阵推入堆栈,对第一个对象来说,直接复制一份视图矩阵mvStack.top() *= glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.0f, -0.0f));//太阳的位置//将父对象的模型矩阵和复制的的视图矩阵结合mvStack.push(mvStack.top());//生成完整的MV矩阵,包括它的自转mvStack.top() *= rotate(glm::mat4(1.0f), (float)currentTime, glm::vec3(1.0f, 0.0f, 0.0f));//稍后会弹出不会影响子对象glUniformMatrix4fv(mvLoc, 1, GL_FALSE, glm::value_ptr(mvStack.top()));//将矩阵数据发送到统一变量中,value_ptr返回的是对矩阵数据的引用glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);//将VBO关联给顶点着色器中相应的顶点属性glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);glEnableVertexAttribArray(0);glEnable(GL_DEPTH_TEST);	//调整OpenGL设置,绘制模型glDepthFunc(GL_LEQUAL);glFrontFace(GL_CW);glDrawArrays(GL_TRIANGLES, 0, 18);mvStack.pop();//---------------------cube == planetmvStack.push(mvStack.top());mvStack.top() *= glm::translate(glm::mat4(1.0f), glm::vec3(sin((float)currentTime) * 4.0, 0.0f, cos((float)currentTime) * 4.0));mvStack.push(mvStack.top());mvStack.top() *= rotate(glm::mat4(1.0f), (float)currentTime, glm::vec3(0.0, 1.0, 0.0));//稍后会弹出不会影响子对象glUniformMatrix4fv(mvLoc, 1, GL_FALSE, glm::value_ptr(mvStack.top()));//将矩阵数据发送到统一变量中,value_ptr返回的是对矩阵数据的引用glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);//将VBO关联给顶点着色器中相应的顶点属性glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);glEnableVertexAttribArray(0);glEnable(GL_DEPTH_TEST);	//调整OpenGL设置,绘制模型glDepthFunc(GL_LEQUAL);glDrawArrays(GL_TRIANGLES, 0, 36);mvStack.pop();//-----------------------smaller cube == moonmvStack.push(mvStack.top());mvStack.top() *= glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, sin((float)currentTime) * 2.0, cos((float)currentTime) * 2.0));mvStack.top() *= rotate(glm::mat4(1.0f), (float)currentTime, glm::vec3(0.0, 0.0, 1.0));mvStack.top() *= scale(glm::mat4(1.0f), glm::vec3(0.25, 0.25, 0.25));glUniformMatrix4fv(mvLoc, 1, GL_FALSE, glm::value_ptr(mvStack.top()));//将矩阵数据发送到统一变量中,value_ptr返回的是对矩阵数据的引用glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);//将VBO关联给顶点着色器中相应的顶点属性glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);glEnableVertexAttribArray(0);glEnable(GL_DEPTH_TEST);	//调整OpenGL设置,绘制模型glDepthFunc(GL_LEQUAL);glDrawArrays(GL_TRIANGLES, 0, 36);mvStack.pop(); mvStack.pop(); mvStack.pop();mvStack.pop();//最后一个是视图矩阵
}
void window_size_callback(GLFWwindow* win, int newWidth, int newHeight) {aspect = (float)newWidth / (float)newHeight;glViewport(0, 0, newWidth, newHeight);pMat = glm::perspective(1.0472f, aspect, 0.1f, 1000.0f);
}
int main(void) {if (!glfwInit()) { exit(EXIT_FAILURE); }glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);//设置窗口选项glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 6);GLFWwindow* window = glfwCreateWindow(600, 600, "Chapter 4 - program 2", NULL, NULL);glfwMakeContextCurrent(window);//让当前窗口的环境在当前线程上成为当前环境if (glewInit() != GLEW_OK) { exit(EXIT_FAILURE); }glfwSwapInterval(1);glfwSetWindowSizeCallback(window, window_size_callback);init(window);while (!glfwWindowShouldClose(window)) {display(window, glfwGetTime());glfwSwapBuffers(window);glfwPollEvents();}glfwDestroyWindow(window);glfwTerminate();exit(EXIT_SUCCESS);
}
#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <SOIL2\soil2.h>
#include <string>
#include <iostream>
#include <fstream>
#include <cmath>
#include <glm\glm.hpp>
#include <glm\gtc\type_ptr.hpp> // glm::value_ptr
#include <glm\gtc\matrix_transform.hpp> // glm::translate, glm::rotate, glm::scale, glm::perspective
#include "Utils.h"
using namespace std;Utils::Utils() {}string Utils::readShaderFile(const char *filePath) {string content;ifstream fileStream(filePath, ios::in);string line = " ";while (!fileStream.eof()) {getline(fileStream, line);content.append(line + "\n");}fileStream.close();return content;
}bool Utils::checkOpenGLError() {bool foundError = false;int glErr = glGetError();while (glErr != GL_NO_ERROR) {cout << "glError: " << glErr << endl;foundError = true;glErr = glGetError();}return foundError;
}void Utils::printShaderLog(GLuint shader) {int len = 0;int chWrittn = 0;char *log;glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &len);if (len > 0) {log = (char *)malloc(len);glGetShaderInfoLog(shader, len, &chWrittn, log);cout << "Shader Info Log: " << log << endl;free(log);}
}GLuint Utils::prepareShader(int shaderTYPE, const char *shaderPath)
{	GLint shaderCompiled;string shaderStr = readShaderFile(shaderPath);const char *shaderSrc = shaderStr.c_str();//获取着色器信息的字符串GLuint shaderRef = glCreateShader(shaderTYPE);//创建着色器glShaderSource(shaderRef, 1, &shaderSrc, NULL);//将字符串复制进着色器中glCompileShader(shaderRef);//编译着色器checkOpenGLError();glGetShaderiv(shaderRef, GL_COMPILE_STATUS, &shaderCompiled);if (shaderCompiled != 1){	if (shaderTYPE == 35633) cout << "Vertex ";if (shaderTYPE == 36488) cout << "Tess Control ";if (shaderTYPE == 36487) cout << "Tess Eval ";if (shaderTYPE == 36313) cout << "Geometry ";if (shaderTYPE == 35632) cout << "Fragment ";cout << "shader compilation error." << endl;printShaderLog(shaderRef);}return shaderRef;//返回程序的ID
}void Utils::printProgramLog(int prog) {int len = 0;int chWrittn = 0;char *log;glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &len);if (len > 0) {log = (char *)malloc(len);glGetProgramInfoLog(prog, len, &chWrittn, log);cout << "Program Info Log: " << log << endl;free(log);}
}int Utils::finalizeShaderProgram(GLuint sprogram)
{	GLint linked;glLinkProgram(sprogram); //请求GLSL编译器确保他们的兼容性checkOpenGLError();glGetProgramiv(sprogram, GL_LINK_STATUS, &linked);if (linked != 1){	cout << "linking failed" << endl;printProgramLog(sprogram);}return sprogram;
}GLuint Utils::createShaderProgram(const char *vp, const char *fp) {GLuint vShader = prepareShader(GL_VERTEX_SHADER, vp);//获取编译着色器后得到的着色器对象GLuint fShader = prepareShader(GL_FRAGMENT_SHADER, fp);GLuint vfprogram = glCreateProgram();//创建程序对象glAttachShader(vfprogram, vShader);//将着色器对象载入程序对象中glAttachShader(vfprogram, fShader);finalizeShaderProgram(vfprogram); //请求GLSL编译器确保他们的兼容性return vfprogram;
}GLuint Utils::createShaderProgram(const char *vp, const char *gp, const char *fp) {GLuint vShader = prepareShader(GL_VERTEX_SHADER, vp);GLuint gShader = prepareShader(GL_GEOMETRY_SHADER, gp);GLuint fShader = prepareShader(GL_FRAGMENT_SHADER, fp);GLuint vgfprogram = glCreateProgram();glAttachShader(vgfprogram, vShader);glAttachShader(vgfprogram, gShader);glAttachShader(vgfprogram, fShader);finalizeShaderProgram(vgfprogram);return vgfprogram;
}GLuint Utils::createShaderProgram(const char *vp, const char *tCS, const char* tES, const char *fp) {GLuint vShader = prepareShader(GL_VERTEX_SHADER, vp);GLuint tcShader = prepareShader(GL_TESS_CONTROL_SHADER, tCS);GLuint teShader = prepareShader(GL_TESS_EVALUATION_SHADER, tES);GLuint fShader = prepareShader(GL_FRAGMENT_SHADER, fp);GLuint vtfprogram = glCreateProgram();glAttachShader(vtfprogram, vShader);glAttachShader(vtfprogram, tcShader);glAttachShader(vtfprogram, teShader);glAttachShader(vtfprogram, fShader);finalizeShaderProgram(vtfprogram);return vtfprogram;
}GLuint Utils::createShaderProgram(const char *vp, const char *tCS, const char* tES, char *gp, const char *fp) {GLuint vShader = prepareShader(GL_VERTEX_SHADER, vp);GLuint tcShader = prepareShader(GL_TESS_CONTROL_SHADER, tCS);GLuint teShader = prepareShader(GL_TESS_EVALUATION_SHADER, tES);GLuint gShader = prepareShader(GL_GEOMETRY_SHADER, gp);GLuint fShader = prepareShader(GL_FRAGMENT_SHADER, fp);GLuint vtgfprogram = glCreateProgram();glAttachShader(vtgfprogram, vShader);glAttachShader(vtgfprogram, tcShader);glAttachShader(vtgfprogram, teShader);glAttachShader(vtgfprogram, gShader);glAttachShader(vtgfprogram, fShader);finalizeShaderProgram(vtgfprogram);return vtgfprogram;
}GLuint Utils::loadCubeMap(const char *mapDir) {GLuint textureRef;string xp = mapDir; xp = xp + "/xp.jpg";string xn = mapDir; xn = xn + "/xn.jpg";string yp = mapDir; yp = yp + "/yp.jpg";string yn = mapDir; yn = yn + "/yn.jpg";string zp = mapDir; zp = zp + "/zp.jpg";string zn = mapDir; zn = zn + "/zn.jpg";textureRef = SOIL_load_OGL_cubemap(xp.c_str(), xn.c_str(), yp.c_str(), yn.c_str(), zp.c_str(), zn.c_str(),SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_MIPMAPS);if (textureRef == 0) cout << "didnt find cube map image file" << endl;//	glBindTexture(GL_TEXTURE_CUBE_MAP, textureRef);// reduce seams//	glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);//	glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);//	glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);return textureRef;
}GLuint Utils::loadTexture(const char *texImagePath)
{	GLuint textureRef;textureRef = SOIL_load_OGL_texture(texImagePath, SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y);if (textureRef == 0) cout << "didnt find texture file " << texImagePath << endl;// ----- mipmap/anisotropic sectionglBindTexture(GL_TEXTURE_2D, textureRef);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);glGenerateMipmap(GL_TEXTURE_2D);if (glewIsSupported("GL_EXT_texture_filter_anisotropic")) {GLfloat anisoset = 0.0f;glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &anisoset);glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, anisoset);}// ----- end of mipmap/anisotropic sectionreturn textureRef;
}// GOLD material - ambient, diffuse, specular, and shininess
float* Utils::goldAmbient() { static float a[4] = { 0.2473f, 0.1995f, 0.0745f, 1 }; return (float*)a; }
float* Utils::goldDiffuse() { static float a[4] = { 0.7516f, 0.6065f, 0.2265f, 1 }; return (float*)a; }
float* Utils::goldSpecular() { static float a[4] = { 0.6283f, 0.5559f, 0.3661f, 1 }; return (float*)a; }
float Utils::goldShininess() { return 51.2f; }// SILVER material - ambient, diffuse, specular, and shininess
float* Utils::silverAmbient() { static float a[4] = { 0.1923f, 0.1923f, 0.1923f, 1 }; return (float*)a; }
float* Utils::silverDiffuse() { static float a[4] = { 0.5075f, 0.5075f, 0.5075f, 1 }; return (float*)a; }
float* Utils::silverSpecular() { static float a[4] = { 0.5083f, 0.5083f, 0.5083f, 1 }; return (float*)a; }
float Utils::silverShininess() { return 51.2f; }// BRONZE material - ambient, diffuse, specular, and shininess
float* Utils::bronzeAmbient() { static float a[4] = { 0.2125f, 0.1275f, 0.0540f, 1 }; return (float*)a; }
float* Utils::bronzeDiffuse() { static float a[4] = { 0.7140f, 0.4284f, 0.1814f, 1 }; return (float*)a; }
float* Utils::bronzeSpecular() { static float a[4] = { 0.3936f, 0.2719f, 0.1667f, 1 }; return (float*)a; }
float Utils::bronzeShininess() { return 25.6f; }
#include <GL\glew.h>
#include <GLFW\glfw3.h>
#include <SOIL2\soil2.h>
#include <string>
#include <iostream>
#include <fstream>
#include <cmath>
#include <vector>
#include <glm\glm.hpp>
#include <glm\gtc\type_ptr.hpp>
#include <glm\gtc\matrix_transform.hpp>class Utils
{
private:static std::string readShaderFile(const char *filePath);static void printShaderLog(GLuint shader);static void printProgramLog(int prog);static GLuint prepareShader(int shaderTYPE, const char *shaderPath);static int finalizeShaderProgram(GLuint sprogram);public:Utils();static bool checkOpenGLError();static GLuint createShaderProgram(const char *vp, const char *fp);static GLuint createShaderProgram(const char *vp, const char *gp, const char *fp);static GLuint createShaderProgram(const char *vp, const char *tCS, const char* tES, const char *fp);static GLuint createShaderProgram(const char *vp, const char *tCS, const char* tES, char *gp, const char *fp);static GLuint loadTexture(const char *texImagePath);static GLuint loadCubeMap(const char *mapDir);static float* goldAmbient();static float* goldDiffuse();static float* goldSpecular();static float goldShininess();static float* silverAmbient();static float* silverDiffuse();static float* silverSpecular();static float silverShininess();static float* bronzeAmbient();static float* bronzeDiffuse();static float* bronzeSpecular();static float bronzeShininess();
};

vertShader.glsl

#version 430layout (location=0) in vec3 position;uniform mat4 mv_matrix;
uniform mat4 proj_matrix;out vec4 varyingColor;void main(void)
{gl_Position = proj_matrix * mv_matrix * vec4(position,1.0);varyingColor = vec4(position,1.0)*0.5 + vec4(0.5, 0.5, 0.5, 0.5);
} 

fragShader.glsl

#version 430in vec4 varyingColor;
out vec4 color;uniform mat4 mv_matrix;
uniform mat4 proj_matrix;void main(void)
{	color = varyingColor;
}

这篇关于OpenGL--恒星,卫星,行星系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/305461

相关文章

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

使用Python实现Windows系统垃圾清理

《使用Python实现Windows系统垃圾清理》Windows自带的磁盘清理工具功能有限,无法深度清理各类垃圾文件,所以本文为大家介绍了如何使用Python+PyQt5开发一个Windows系统垃圾... 目录一、开发背景与工具概述1.1 为什么需要专业清理工具1.2 工具设计理念二、工具核心功能解析2.

Linux系统之stress-ng测压工具的使用

《Linux系统之stress-ng测压工具的使用》:本文主要介绍Linux系统之stress-ng测压工具的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、理论1.stress工具简介与安装2.语法及参数3.具体安装二、实验1.运行8 cpu, 4 fo

ubuntu20.0.4系统中安装Anaconda的超详细图文教程

《ubuntu20.0.4系统中安装Anaconda的超详细图文教程》:本文主要介绍了在Ubuntu系统中如何下载和安装Anaconda,提供了两种方法,详细内容请阅读本文,希望能对你有所帮助... 本文介绍了在Ubuntu系统中如何下载和安装Anaconda。提供了两种方法,包括通过网页手动下载和使用wg

ubuntu系统使用官方操作命令升级Dify指南

《ubuntu系统使用官方操作命令升级Dify指南》Dify支持自动化执行、日志记录和结果管理,适用于数据处理、模型训练和部署等场景,今天我们就来看看ubuntu系统中使用官方操作命令升级Dify的方... Dify 是一个基于 docker 的工作流管理工具,旨在简化机器学习和数据科学领域的多步骤工作流。