OpenGL南邮计算机图形学实验报告三——实现类似地月系统的两物体环绕移动

计算机图形学的新题目要求

OpenGL配置参考:
南邮老前辈wonz哥的OpenGL配置(Shader.h始终不用改)、SOIL2 环境配置、GLM 环境配置

学习网站:LearnOpenGL CN

思路:

本次新增了镜头camera
由于课上讲了制作一个环绕移动的光源,只要讲运动圆心设为中心体的中心即可(初始化的时候设置就行),并将旋转设置为对应的轴(我选择了z轴)
谁发光谁不发光就不管了,嘿嘿 。
代码较前面几个实验修改的地方看下面:

glm::vec3 lightPos = glm::vec3(1.0f, 1.0f, 0.0f);
/*
*
*
*/
lightPos = glm::rotate(lightPos, glm::radians(0.1f), glm::vec3(0.0f, 0.0f, 1.0f));

效果图如下:

话不多说上代码:

main.cpp 文件
(135行有误,勘正在评论区)

#include<iostream>//GLEW
#define GLEW_STATIC
#include<GL/glew.h>//GLFW
#include<GLFW/glfw3.h>
#include"shader.h"
#include"Camera.h"
#include"Light.h"#include "SOIL2/SOIL2.h"
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include<glm/gtx/rotate_vector.hpp>const GLint WIDTH = 800, HEIGTH = 600;void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mode);
void MouseCallback(GLFWwindow* window, double xPos, double yPos);
void DoMovement();bool keys[1024];
Camera camera(glm::vec3(0.0f, 0.0f, 2.0f));
GLfloat deltaTime = 0.0f;
GLfloat lastTime = 0.0f;GLfloat lastX = WIDTH / 2.0;
GLfloat lastY=HEIGTH/2.0;bool firstMouse = true;int main()
{glfwInit();glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGTH, "Learn OpenGL", nullptr, nullptr);if (nullptr == window){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}//next two lines are for mac retina displayint screenWidth, screenHeight;glfwGetFramebufferSize(window, &screenWidth, &screenHeight);glfwMakeContextCurrent(window);glfwSetKeyCallback(window, KeyCallback);glfwSetCursorPosCallback(window, MouseCallback);//glfwSetScrollCallback(window, ScrollCallback);glewExperimental = GL_TRUE;if (GLEW_OK != glewInit()){std::cout << "Failed to initialise GLEW" << std::endl;return -1;}glViewport(0, 0, screenWidth, screenHeight);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LESS);glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);Shader ourShader = Shader("res/shaders/core.vs", "res/shaders/core.fs");Shader lightShader= Shader("res/shaders/light.vs", "res/shaders/light.fs");Light lightModel = Light();glm::vec3 lightPos = glm::vec3(1.0f, 1.0f, 0.0f);//设置光源的起始坐标,既然z坐标为0则下面绕z轴转动GLfloat vertices[] ={// position                 //color                 //normal-0.5f,-0.5f,0.5f,           0.0f,1.0f,0.0f,     0.0f,0.0f,-0.1f,0.5f,-0.5f,0.5f,            0.0f,1.0f,0.0f,     0.0f,0.0f,-0.1f,0.5f,0.5f,0.5f,         0.0f,1.0f,0.0f,     0.0f,0.0f,-0.1f,0.5f,0.5f,0.5f,         0.0f,1.0f,0.0f,     0.0f,0.0f,-0.1f,-0.5f,0.5f,0.5f,            0.0f,1.0f,0.0f,     0.0f,0.0f,-0.1f,-0.5f,-0.5f,0.5f,           0.0f,1.0f,0.0f,     0.0f,0.0f,-0.1f,-0.5f,-0.5f,-0.5f,      1.0f,0.0f,0.0f,     0.0f,0.0f,0.1f,0.5f,-0.5f,-0.5f,            1.0f,0.0f,0.0f,     0.0f,0.0f,0.1f,0.5f,0.5f,-0.5f,         1.0f,0.0f,0.0f,     0.0f,0.0f,0.1f,0.5f,0.5f,-0.5f,         1.0f,0.0f,0.0f,     0.0f,0.0f,0.1f,-0.5f,0.5f,-0.5f,            1.0f,0.0f,0.0f,     0.0f,0.0f,0.1f,-0.5f,-0.5f,-0.5f,       1.0f,0.0f,0.0f,     0.0f,0.0f,0.1f,-0.5f,0.5f,0.5f,         0.0f,0.0f,1.0f,   1.0f,0.0f,0.0f,-0.5f,0.5f,-0.5f,          0.0f,0.0f,1.0f,   1.0f,0.0f,0.0f,-0.5f,-0.5f,-0.5f,     0.0f,0.0f,1.0f,   1.0f,0.0f,0.0f,-0.5f,-0.5f,-0.5f,     0.0f,0.0f,1.0f,   1.0f,0.0f,0.0f,-0.5f,-0.5f,0.5f,          0.0f,0.0f,1.0f,   1.0f,0.0f,0.0f,-0.5f,0.5f,0.5f,           0.0f,0.0f,1.0f,   1.0f,0.0f,0.0f,0.5f,0.5f,0.5f,            1.0f,1.0f,0.0f,     -1.0f,0.0f,0.0f,0.5f,0.5f,-0.5f,            1.0f,1.0f,0.0f,     -1.0f,0.0f,0.0f,0.5f,-0.5f,-0.5f,           1.0f,1.0f,0.0f,     -1.0f,0.0f,0.0f,0.5f,-0.5f,-0.5f,           1.0f,1.0f,0.0f,     -1.0f,0.0f,0.0f,0.5f,-0.5f,0.5f,            1.0f,1.0f,0.0f,     -1.0f,0.0f,0.0f,0.5f,0.5f,0.5f,         1.0f,1.0f,0.0f,      -1.0f,0.0f,0.0f,-0.5f,-0.5f,-0.5f,     1.0f,0.0f,1.0f,     0.0f,-1.0f,0.0f,0.5f,-0.5f,-0.5f,           1.0f,0.0f,1.0f,     0.0f,-1.0f,0.0f,0.5f,-0.5f,0.5f,            1.0f,0.0f,1.0f,     0.0f,-1.0f,0.0f,0.5f,-0.5f,0.5f,            1.0f,0.0f,1.0f,     0.0f,-1.0f,0.0f,-0.5f,-0.5f,0.5f,           1.0f,0.0f,1.0f,     0.0f,-1.0f,0.0f,-0.5f,-0.5f,-0.5f,      1.0f,0.0f,1.0f,     0.0f,-1.0f,0.0f,-0.5f,0.5f,-0.5f,           0.0f,1.0f,1.0f,     0.0f,1.0f,0.0f,0.5f,0.5f,-0.5f,         0.0f,1.0f,1.0f,     0.0f,1.0f,0.0f,0.5f,0.5f,0.5f,          0.0f,1.0f,1.0f,     0.0f,1.0f,0.0f,0.5f,0.5f,0.5f,          0.0f,1.0f,1.0f,     0.0f,1.0f,0.0f,-0.5f,0.5f,0.5f,         0.0f,1.0f,1.0f,     0.0f,1.0f,0.0f,-0.5f,0.5f,-0.5f,            0.0f,1.0f,1.0f,     0.0f,1.0f,0.0f,};                                                                GLuint VAO, VBO;glGenVertexArrays(1, &VAO);glGenBuffers(1, &VBO);glBindVertexArray(VAO);glBindBuffer(GL_ARRAY_BUFFER, VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(GLfloat), (GLvoid*)0);glEnableVertexAttribArray(0);glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));glEnableVertexAttribArray(1);glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));glEnableVertexAttribArray(2);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);while (!glfwWindowShouldClose(window)){GLfloat currentTime = glfwGetTime();deltaTime = currentTime - lastTime;lastTime = currentTime;glfwPollEvents();DoMovement();glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glm::mat4 transform = glm::mat4(1.0f);lightPos = glm::rotate(lightPos, glm::radians(0.1f), glm::vec3(0.0f, 0.0f, 1.0f));transform = glm::translate(transform, lightPos);transform = glm::scale(transform, glm::vec3(0.1f, 0.1f, 0.1f));glm::mat4 projection = glm::mat4(1.0f);projection = glm::perspective(glm::radians(camera.GetZoom()), float(screenWidth) / float(screenHeight), 0.1f, 100.0f);glm::mat4 view = camera.GetViewMatrix();lightShader.Use();GLuint transLoc = glGetUniformLocation(lightShader.Program, "transform");glUniformMatrix4fv(transLoc, 1, GL_FALSE, glm::value_ptr(transform));transLoc = glGetUniformLocation(lightShader.Program, "projection");glUniformMatrix4fv(transLoc, 1, GL_FALSE, glm::value_ptr(projection));transLoc = glGetUniformLocation(lightShader.Program, "view");glUniformMatrix4fv(transLoc, 1, GL_FALSE, glm::value_ptr(view));lightModel.Draw(lightShader);transform = glm::mat4(1.0f);transform = glm::rotate(transform, glm::radians(90.0f) * static_cast<GLfloat>(glfwGetTime()), glm::vec3(1.0f, 1.0f, 1.0f));//transform = glm::scale(transform, glm::vec3(0.5f, 0.5f, 0.5f));//transform = glm::translate(transform, glm::vec3(0.1f, 0.0f,-0.8f));ourShader.Use();transLoc = glGetUniformLocation(ourShader.Program, "transform");glUniformMatrix4fv(transLoc, 1, GL_FALSE, glm::value_ptr(transform));transLoc= glGetUniformLocation(ourShader.Program, "projection");glUniformMatrix4fv(transLoc, 1, GL_FALSE, glm::value_ptr(projection));transLoc = glGetUniformLocation(ourShader.Program, "view");glUniformMatrix4fv(transLoc, 1, GL_FALSE, glm::value_ptr(view));glUniform3f(glGetUniformLocation(ourShader.Program, "LightPos"), lightPos.x, lightPos.y, lightPos.z);glUniform3f(glGetUniformLocation(ourShader.Program, "ViewPos"),camera.GetPosition().x, camera.GetPosition().y, camera.GetPosition().z);glUniform1f(glGetUniformLocation(ourShader.Program, "material.diffuse"), 0.6f);glUniform1f(glGetUniformLocation(ourShader.Program, "material.specular"), 0.9f);glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES, 0, 36);glBindVertexArray(0);glfwSwapBuffers(window);}glDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);ourShader.~Shader();glfwTerminate();return 0;
}void KeyCallback(GLFWwindow* window, int key, int scancode, int action, int mode)
{if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS){glfwSetWindowShouldClose(window, GL_TRUE);}if (key >= 0 && key < 1024){if (action == GLFW_PRESS)keys[key] = true;else if (action == GLFW_RELEASE)keys[key] = false;}
}void DoMovement()
{if (keys[GLFW_KEY_W] || keys[GLFW_KEY_UP]) {camera.ProcessKeyboard(FORWARD, deltaTime);}if (keys[GLFW_KEY_S] || keys[GLFW_KEY_DOWN]) {camera.ProcessKeyboard(BACKWARD, deltaTime);}if (keys[GLFW_KEY_A] || keys[GLFW_KEY_LEFT]) {camera.ProcessKeyboard(LEFT, deltaTime);}if (keys[GLFW_KEY_D] || keys[GLFW_KEY_RIGHT]) {camera.ProcessKeyboard(RIGHT, deltaTime);}
}void MouseCallback(GLFWwindow* window, double xPos, double yPos)
{if (firstMouse){lastX = xPos;lastY = yPos;firstMouse = false;}GLfloat xOffset = xPos - lastX;GLfloat yOffset = lastY - yPos;lastX = xPos;lastY = yPos;camera.ProcessMouseMovement(xOffset, yOffset);
}

Camera.h 文件

#pragma once
#ifndef Camera_h
#define Camera_h#include<vector>
#define GLEW_STATIC
#include<GL/glew.h>#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>const GLfloat YAW = -90.0f;
const GLfloat PITCH = 0.0f;
const GLfloat ZOOM = 45.0f;
const GLfloat SPEED = 6.0f;
const GLfloat SENSITIVITY = 0.25f;enum Camera_Movement
{FORWARD,BACKWARD,LEFT,RIGHT
};
class Camera
{public:Camera(glm::vec3 position = glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3 up = glm::vec3(0.0f, 1.0f, 0.0f), GLfloat yaw = YAW, GLfloat pitch = PITCH) :front(glm::vec3(0.0f, 0.0f, -1.0f)), zoom(ZOOM),movementSpeed(SPEED),mouseSensitivity(SENSITIVITY){this->position = position;this->worldUp = up;this->yaw = yaw;this->pitch = pitch;this->updateCameraVectors();}glm::mat4 GetViewMatrix(){return glm::lookAt(this->position, this->position + this->front, this->up);}GLfloat GetZoom(){return this->zoom;}glm::vec3 GetPosition(){return this->position;}void ProcessKeyboard(Camera_Movement direction,GLfloat deltaTima){GLfloat velocity = this->movementSpeed * deltaTima;if (direction == FORWARD) {this->position += this->front * velocity;}if (direction == BACKWARD) {this->position -= this->front * velocity;}if (direction == LEFT) {this->position -= this->right * velocity;}if (direction == RIGHT) {this->position += this->right * velocity;}}void ProcessMouseMovement(GLfloat xOffset,GLfloat yOffset){xOffset *= this->mouseSensitivity;yOffset *= this->mouseSensitivity;this->yaw += xOffset;this->pitch += yOffset;this->updateCameraVectors();}
private:glm::vec3 front;glm::vec3 position;glm::vec3 up;glm::vec3 right;glm::vec3 worldUp;GLfloat zoom;GLfloat yaw;GLfloat pitch;GLfloat movementSpeed;GLfloat mouseSensitivity;void updateCameraVectors(){glm::vec3 front;front.x = cos(glm::radians(this->pitch)) * cos(glm::radians(this->yaw));front.y = sin(glm::radians(this->pitch));front.z = cos(glm::radians(this->pitch)) * sin(glm::radians(this->yaw));this->front = glm::normalize(front);this->right = glm::normalize(glm::cross(this->front, this->worldUp));this->up = glm::normalize(glm::cross(this->right, this->front));}
};#endif // !Camera

Light.h 文件

#pragma once
#ifndef Light_h
#define Light_h#include<GL/glew.h>
#include"shader.h"
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>GLfloat vertices[] =
{-0.5f,-0.5f,0.5f,0.5f,-0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,-0.5f,0.5f,0.5f,-0.5f,-0.5f,0.5f,-0.5f,-0.5f,-0.5f,0.5f,-0.5f,-0.5f,0.5f,0.5f,-0.5f,0.5f,0.5f,-0.5f,-0.5f,0.5f,-0.5f,-0.5f,-0.5f,-0.5f,-0.5f,0.5f,0.5f,-0.5f,0.5f,-0.5f,-0.5f,-0.5f,-0.5f,-0.5f,-0.5f,-0.5f,-0.5f,-0.5f,0.5f,-0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,-0.5f,0.5f,-0.5f,-0.5f,0.5f,-0.5f,-0.5f,0.5f,-0.5f,0.5f,0.5f,0.5f,0.5f,-0.5f,-0.5f,-0.5f,0.5f,-0.5f,-0.5f,0.5f,-0.5f,0.5f,0.5f,-0.5f,0.5f,-0.5f,-0.5f,0.5f,-0.5f,-0.5f,-0.5f,-0.5f,0.5f,-0.5f,0.5f,0.5f,-0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,0.5f,-0.5f,0.5f,0.5f,-0.5f,0.5f,-0.5f,
};class Light
{public:Light(){this->update();}void Draw(Shader &shader){glBindVertexArray(this->VAO);glDrawArrays(GL_TRIANGLES, 0, 36);glBindVertexArray(0);}
private:GLuint VAO, VBO;void update(){glGenVertexArrays(1, &this->VAO);glGenBuffers(1, &this->VBO);glBindVertexArray(this->VAO);glBindBuffer(GL_ARRAY_BUFFER, this->VBO);glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0);glEnableVertexAttribArray(0);glBindBuffer(GL_ARRAY_BUFFER, 0);glBindVertexArray(0);}
};#endif // !Light_h

core.vs 文件

 #version 330 core
layout(location = 0) in vec3 position;
layout(location = 1) in vec3 color;
layout(location = 2) in vec3 normal;out vec3 ourColor;
out vec3 Normal;
out vec3 FragPos;
uniform mat4 transform;
uniform mat4 projection;
uniform mat4 view;void main()
{gl_Position =projection*view*transform* vec4(position,1.0f);FragPos=vec3(transform*vec4(position,1.0f));ourColor=color;Normal=vec3(transpose(inverse(transform)));
}

core.fs

#version 330 core
in vec3 ourColor;
in vec3 Normal;
in vec3 FragPos;
out vec4 color;uniform vec3 LightPos;
uniform vec3 ViewPos;struct Material
{float specular;float diffuse;
};uniform Material material;void main()
{// color = vec4(ourColor,0.5f);vec3 lightDirection=normalize(LightPos-FragPos);vec3 viewDirection=normalize(ViewPos-FragPos);vec3 norm=normalize(Normal);//环境光vec3 ambient=0.6f*ourColor;//漫反射float diff =material.diffuse *max(dot(norm,lightDirection),0.0f);vec3 diffuse=diff*ourColor;//镜面反射vec3 halfAngle=normalize(viewDirection+lightDirection);float spec=material.specular*pow(max(dot(norm,halfAngle),0.0f),32.0f);vec3 specular=spec*ourColor;color=vec4(ambient+diffuse+specular,1.0f);
}

light.vs 文件

 #version 330 core
layout(location = 0) in vec3 position;uniform mat4 transform;
uniform mat4 projection;
uniform mat4 view;void main()
{gl_Position =projection*view*transform* vec4(position,1.0f);
}

light.fs 文件

#version 330 core
out vec4 color;void main()
{color = vec4(1.0f,1.0f,1.0f,1.0f);
}

OpenGL南邮计算机图形学实验报告三——实现类似地月系统的两物体环绕移动相关推荐

  1. OpenGL南邮计算机图形学实验报告二——两个纹理的渐变变换和移动

    OpenGL南邮计算机图形学实验报告二--两个纹理的渐变变换和移动 计算机图形学的新题目要求 OpenGL配置参考: 南邮老前辈wonz哥的OpenGL配置(Shader.h始终不用改).SOIL2 ...

  2. OpenGL南邮计算机图形学实验报告四——用键盘控制物体

    OpenGL南邮计算机图形学实验报告四--用键盘控制物体 计算机图形学的新题目要求 OpenGL配置参考: 南邮老前辈wonz哥的OpenGL配置(Shader.h始终不用改).SOIL2 环境配置. ...

  3. 南邮计算机图形学水不水,南邮计算机图形学实验报告(修正版)….doc

    实 验 报 告 实验名称指导教师实验类型综合实验学时2实验时间一.实验目的和要求 能够灵活的运用OpenGL图形API函数,基于C++程序语言,. 设计增加键盘及鼠标输入的互动,实现三维物体交互式运动 ...

  4. 计算机图形学实验报告 裁剪,计算机图形学-实验报告三-图形裁剪算法

    <计算机图形学-实验报告三-图形裁剪算法>由会员分享,可在线阅读,更多相关<计算机图形学-实验报告三-图形裁剪算法(9页珍藏版)>请在人人文库网上搜索. 1.图形裁剪算法1. ...

  5. 南邮计算机网络通信实验报告,南京邮电大学计算机网络..docx

    南京邮电大学计算机网络. 通信与信息工程学院2016/2017学年第一学期实 验 报 告实验课程名称 计算机网络实验 专 业 电子信息工程学 生 学 号 学 生 姓 名 实验一 Windows中常见网 ...

  6. 计算机绘图图框实验报告,南邮工图实验报告.pdf

    南邮工图实验报告 实验报告 课程名称: 制图基础及计算机绘图 学生姓名: 胡正飞 班级学号: 指导教师: 胡正飞 指导单位: 理 学 院 日期: 年 月 日至 年 月 日 <制图 基 础 与 计 ...

  7. 华北电力大学计算机图形学实验报告,华北电力大学计算机图形学实验报告分析.doc...

    华北电力大学计算机图形学实验报告分析 科 技 学 院 课程设计(综合实验)报告 ( 2013 -- 2014 年度第 2 学期) 实验名称 OpenGL基本图元绘制实验 课程名称 计算机图形学 | | ...

  8. 南邮java实验报告,南邮微机原理实验报告精选.doc

    南邮微机原理实验报告精选 <微型计算机原理与接口技术> 上机实验 学 院: 电子科学与工程 专 业: 电磁场与无线技术 姓 名: 陈秀慧 课 程 号: B0300062S 学 号: 任课老 ...

  9. 计算机图形学直线线型实验报告,计算机图形学实验报告-直线中点bresenham算法的实现资料.doc...

    计算机图形学实验报告-直线中点bresenham算法的实现资料.doc (10页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 29.90 积分 计算机图形 ...

最新文章

  1. 【Android】自定义环形菜单View
  2. Windows 通过 SecureCRT 8.x 上传文件到Linux服务器
  3. 160 - 36 cupofcoffe.2
  4. java类快速构造_程序员有什么办法能快速梳理java知识点?有这八张图就够了
  5. android语言切换快捷键,Android的语言设置两种方法
  6. css修改图片形状,css定位图形改(原创)
  7. JavaScript:split() 方法和join() 方法
  8. Java获取区间随机数公式
  9. css3+html仿小米官网商城项目。
  10. protobuf中repeated类型变量与C++ vector类型变量的相互赋值方法
  11. AngularJS 控制器
  12. 进入安全模式后重新启动计算机,进入Win7安全模式方法一:开机按F8键进入 我们在重启或者电脑开机的时候...
  13. dso与Android,DSO 安装及运行 —— dso_ros + Android 手机摄像头
  14. 阿里最新春招面经,腾讯 / 美团 / 字节 1 万道 Java 中高级面试题
  15. CSS进阶(6)- 居中总结
  16. php开发微信demo
  17. OpenCV肤色检测
  18. Unity 2D炸弹爆炸的效果制作
  19. 如何利用企业微信促成交易?
  20. 结构体自定义指针函数c语言,详解C语言结构体中的函数指针

热门文章

  1. 哪些进销存软件既好用又免费?
  2. 第十三章第一节(Triangle类)(Triangle class)
  3. python读取nc文件数据生成专业气象图
  4. 异常检测:综述(基本都是无监督算法)【时间序列算法:AR/MA/ARMA】【传统机器学习算法:孤独森林、One Class SVM】【深度学习算法:AutoEncoder、LSTM、DeepLog】
  5. 构建 PHP运行环境
  6. 电赛-DDS-AD9959
  7. 安卓-使用腾讯TBS浏览服务(X5WebView) - 打开打开PDF,WORD,EXCLE等文件
  8. 很全的饮食英语词汇表
  9. 电机驱动芯片替换传统驱动器方案
  10. Cs修改器(部分功能)