当前位置: 首页 > news >正文

北京网站怎么优化互联网商城建设

北京网站怎么优化,互联网商城建设,新媒体营销ppt,wordpress设置会员时效前面的一篇文章笔者向大家介绍了模型变化矩阵#xff0c;投影矩阵。现在只剩下最后一个观察矩阵没有和大家讲了。此片文章就为大家介绍OpenGL入门篇的最后一个内容。 观察矩阵 前面的篇章当中#xff0c;我们看到了即使没有观察矩阵#xff0c;我们也能对绘制出来的模型有一…        前面的一篇文章笔者向大家介绍了模型变化矩阵投影矩阵。现在只剩下最后一个观察矩阵没有和大家讲了。此片文章就为大家介绍OpenGL入门篇的最后一个内容。 观察矩阵 前面的篇章当中我们看到了即使没有观察矩阵我们也能对绘制出来的模型有一个很好的控制那么观察矩阵存在的意义又是什么了那么我们现在来想象一下这样一件事我们的屏幕上绘制了特别多的方块现在我们要把它们全部向屏幕的右边移动一定的距离如果是前面的做法的话所有的模型都要再乘上一个向右平移的矩阵这样做完全没有问题只是这会让程序的效率变得很差而且你的GPU除了计算一下像素颜色之外基本上就没有做其他任何事把绝大部分的任务都交给了CPU这样的任务分配是不合理的所以我们需要上传一个观察矩阵ViewMatrix给GPU让他把所有的顶点按照某一个方向进行平移这样我们的任务就合理分配了。什么样的任务应该交给CPU什么样的任务又交给GPU这里也有不少东西需要研究 看过资料的朋友们都知道在OpenGL当中想用创建一个观察矩阵只需要使用glm::lookAt函数即可 glm::lookAt(m_Position, m_Forward, m_Up); //glm::vec3 m_Position 照相机的位置 //glm::vec3 m_Forward 观察的位置 //glm::vec3 m_Up 相机屏幕的上方的方向 这样我们就得到了一个观察矩阵了看起来也没什么好说的对不对。但是困难的往往是处理与之相关的数学问题前面说我们要让屏幕上的所有的方块全部向右移动一段距离那么我们应该怎么设置这个观察矩阵了直接给答案 glm::vec3 m_Position(-0.3f,0.0f,3.0f) glm::vec3 m_Forward(-0.3f,0.0f,0.0f); glm::vec3 m_Up(0.0f,1.0f,0.0f);glm::lookAt(m_Position, m_Forward, m_Up);可能有的朋友们就要问了相机为什么要往左边移动并且看向左边了要回答这个问题也很简单大家现在把手机拿出来打开照相机然后手机屏幕与电脑屏幕保持水平现在把手机水平向左开始移动你就会发现手机屏幕中的物体朝着反方向进行移动了如果再把手机对准刚才位置你就会发现所有的物体都行了旋转拉绳这当然不是我们想要的结果所以我们要让手机继续朝向正前方。观察矩阵和我们的照相机的工作原理一摸一样所以观察矩阵也可以叫作相机矩阵。 制作一个可以观察物体的矩阵 观察矩阵其实介绍到这里也就算是结束了我们现在来做一个可以实际使用的相机。比如说我现在制作了一个立方体每一个面的颜色都不一样它刚被绘制出来的时候我只能看见一两个面但是我想观察其他的面如果说我去修改模型让它自己转过来这也有点太蠢了所以我们要做一个进行鼠标控制的照相机。 我的打算是让照相机沿着一个球面进行运动鼠标坐标的变化来确定照相机在球体坐标上的夹角。 鼠标x方向上的偏移量决定角的大小鼠标y方向上的偏移量决定角的大小有了理论的基础过后我们看一下具体如何实现。 照相机类 Camera.h #pragma once #includeglm/glm.hppclass 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), float yam 0.0f, float pitch 90.0f);Camera(float posX, float posY, float posZ, float upX, float upY, float upZ, float yaw, float pitch);glm::mat4 GetViewMatrix();void ProcessMouseMovement(float xoffset, float yoffset, bool constrainPitch true);void ProcessMouseScroll(float yoffset);inline float GetCameraZoom() const { return m_Zoom; } private:void UpdateCameraVectors();private:glm::vec3 m_Position, m_Front, m_Up, m_Right, m_WorldUp;float m_Yaw, m_Pitch;float m_MouseSensitivity;float m_Zoom; }; Camera.cpp #includeglm/gtc/matrix_transform.hpp #includeiostream#includeCamera.hCamera::Camera(glm::vec3 position ,glm::vec3 up,float yam,float pitch):m_Front(glm::vec3(0.0f,0.0f,-1.0f)),m_MouseSensitivity(0.1f),m_Zoom(45.0f) {m_Position position;m_WorldUp up;m_Yaw yam;m_Pitch pitch;UpdateCameraVectors(); }Camera::Camera(float posX, float posY, float posZ, float upX, float upY, float upZ, float yaw, float pitch):m_Front(glm::vec3(0.0f,0.0f,-1.0f)),m_MouseSensitivity(0.1f),m_Zoom(45.0f) {m_Position glm::vec3(posX, posY, posZ);m_WorldUp glm::vec3(upX, upY, upZ);m_Yaw yaw;m_Pitch pitch;UpdateCameraVectors(); }glm::mat4 Camera::GetViewMatrix() {return glm::lookAt(m_Position, glm::vec3(0.0f, 0.0f, 0.0f), m_Up); }void Camera::ProcessMouseMovement(float xoffset, float yoffset, bool constrainPitch){xoffset * m_MouseSensitivity;yoffset * m_MouseSensitivity;m_Yaw xoffset;m_Pitch yoffset;if (constrainPitch) {m_Pitch m_Pitch 179.0f ? 179.0f : m_Pitch;m_Pitch m_Pitch 0.1f ? 0.1f : m_Pitch;}UpdateCameraVectors(); }void Camera::ProcessMouseScroll(float yoffset) {m_Zoom - yoffset;m_Zoom m_Zoom 1.0f ? 1.0f : m_Zoom;m_Zoom m_Zoom 45.0f ? 45.0f : m_Zoom; }void Camera::UpdateCameraVectors() {glm::vec3 position(0.0f,0.0f,0.0f);position.x 5.0f * sinf(glm::radians(m_Yaw)) * sinf(glm::radians(m_Pitch));position.y 5.0f * cosf(glm::radians(m_Pitch));position.z 5.0f * cosf(glm::radians(m_Yaw)) * sinf(glm::radians(m_Pitch));m_Front glm::normalize(-position);m_Position position;m_Right glm::normalize(glm::cross(m_Front, m_WorldUp));m_Up glm::normalize(glm::cross(m_Right, m_Front)); } 除此以外我们还需要处理鼠标输入函数 void mouse_callback(GLFWwindow* window, double xposIn, double yposIn) {static float lastX 320.0f, lastY 240.0f;static bool firstMouse true;float xpos static_castfloat(xposIn);float ypos static_castfloat(yposIn);if (firstMouse) {lastX xpos;lastY ypos;firstMouse false;}float xoffset xpos - lastX;float yoffset lastY - ypos;lastX xpos, lastY ypos;camera.ProcessMouseMovement(xoffset, yoffset); }void scroll_callback(GLFWwindow* window, double xoffsetIn, double yoffsetIn) {camera.ProcessMouseScroll(static_castfloat(yoffsetIn)); }void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {if (glfwGetKey(window, GLFW_KEY_ESCAPE) GLFW_PRESS)run false; } 好的主函数贴在下面我们就得到了一个可以绕着物体圆转的照相了因为窗口隐藏了光标想要推出的画按Esc键即可。 #includeglad/glad.h #includeGLFW/glfw3.h#includeiostream #includeglm/gtc/matrix_transform.hpp#includeShader.h #includeCamera.hstatic Camera camera(glm::vec3(0.0f, 0.0f, 5.0f)); static bool run true; void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods); void mouse_callback(GLFWwindow* window, double xposIn, double yposIn); void scroll_callback(GLFWwindow* window, double xoffset, double yoffset);int main() {glfwInit();GLFWwindow* window glfwCreateWindow(640, 480, Triangles, NULL, NULL);glfwMakeContextCurrent(window);glfwSetCursorPosCallback(window, mouse_callback);glfwSetScrollCallback(window, scroll_callback);glfwSetKeyCallback(window, key_callback);glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED);//需要初始化GLADif (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {std::cout Failed to initialize GLAD std::endl;return -1;}float vertexes[] {//front surface-0.5f, -0.5f, 0.5f, 1.0f, 1.0f,0.588f,0.2784f, //00.5f, -0.5f, 0.5f, 1.0f, 1.0f,0.588f,0.2784f, //10.5f, 0.5f, 0.5f, 1.0f, 1.0f,0.588f,0.2784f, //2-0.5f, 0.5f, 0.5f, 1.0f, 1.0f,0.588f,0.2784f, //3//back surface-0.5f, -0.5f, -0.5f, 1.0f, 0.933f,0.9098f,0.6666f, //40.5f, -0.5f, -0.5f, 1.0f, 0.933f,0.9098f,0.6666f, //50.5f, 0.5f, -0.5f, 1.0f, 0.933f,0.9098f,0.6666f, //6-0.5f, 0.5f, -0.5f, 1.0f, 0.933f,0.9098f,0.6666f, //7//up surface-0.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.749f,1.0f, //80.5f, 0.5f, 0.5f, 1.0f, 0.0f,0.749f,1.0f, //90.5f, 0.5f, -0.5f, 1.0f, 0.0f,0.749f,1.0f, //10-0.5f, 0.5f, -0.5f, 1.0f, 0.0f,0.749f,1.0f, //11//down surface-0.5f, -0.5f, 0.5f, 1.0f, 0.498f,1.0f,0.0f, //120.5f, -0.5f, 0.5f, 1.0f, 0.498f,1.0f,0.0f, //130.5f, -0.5f, -0.5f, 1.0f, 0.498f,1.0f,0.0f, //14-0.5f, -0.5f, -0.5f, 1.0f, 0.498f,1.0f,0.0f, //15//left surface-0.5f, -0.5f, -0.5f, 1.0f, 0.5f,0.5f,0.145f, //16-0.5f, -0.5f, 0.5f, 1.0f, 0.5f,0.5f,0.145f, //17-0.5f, 0.5f, 0.5f, 1.0f, 0.5f,0.5f,0.145f, //18-0.5f, 0.5f, -0.5f, 1.0f, 0.5f,0.5f,0.145f, //19//right surface0.5f, -0.5f, -0.5f, 1.0f, 1.0f,0.8941f,0.7686f, //200.5f, -0.5f, 0.5f, 1.0f, 1.0f,0.8941f,0.7686f, //210.5f, 0.5f, 0.5f, 1.0f, 1.0f,0.8941f,0.7686f, //220.5f, 0.5f, -0.5f, 1.0f, 1.0f,0.8941f,0.7686f //24}; unsigned int indexes[] {//front surface0,1,2,2,3,0,//back surface4,5,6,6,7,4,//up surface8,9,10,10,11,8,//down surface12,13,14,14,15,12,//left surface16,17,18,18,19,16,//right surface20,21,22,22,23,20};glEnable(GL_DEPTH_TEST);unsigned int buffer 0, vertexArray 0, indexBuffer 0;glCreateVertexArrays(1, vertexArray);glBindVertexArray(vertexArray);glCreateBuffers(1, buffer);glBindBuffer(GL_ARRAY_BUFFER, buffer);glBufferData(GL_ARRAY_BUFFER, sizeof(vertexes), vertexes, GL_STATIC_DRAW);glEnableVertexAttribArray(0);glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 7 * sizeof(float), NULL);glEnableVertexAttribArray(1);glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 7 * sizeof(float), (const void*)(4 * sizeof(float)));glCreateBuffers(1, indexBuffer);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indexes), indexes, GL_STATIC_DRAW);Shader* pShader new Shader(assets/shaders/TextureShader.glsl);while (!glfwWindowShouldClose(window) run) {glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glm::mat4 project glm::perspective(glm::radians(camera.GetCameraZoom()), 640.0f / 480.0f, 0.1f, 100.0f);glm::mat4 view camera.GetViewMatrix();glm::mat4 ViewProject project * view;pShader-Bind();pShader-UploadUniformat4(u_ViewProject, ViewProject);glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, NULL);glfwSwapBuffers(window);glfwPollEvents();}delete pShader;glfwDestroyWindow(window);glfwTerminate(); }void mouse_callback(GLFWwindow* window, double xposIn, double yposIn) {static float lastX 320.0f, lastY 240.0f;static bool firstMouse true;float xpos static_castfloat(xposIn);float ypos static_castfloat(yposIn);if (firstMouse) {lastX xpos;lastY ypos;firstMouse false;}float xoffset xpos - lastX;float yoffset lastY - ypos;lastX xpos, lastY ypos;camera.ProcessMouseMovement(xoffset, yoffset); }void scroll_callback(GLFWwindow* window, double xoffsetIn, double yoffsetIn) {camera.ProcessMouseScroll(static_castfloat(yoffsetIn)); }void key_callback(GLFWwindow* window, int key, int scancode, int action, int mods) {if (glfwGetKey(window, GLFW_KEY_ESCAPE) GLFW_PRESS)run false; } 注意 你可能注意到了相机是不能绕过Y轴顶点的但这里要声明的是并不是笔者的代码写错了这是因为如果绕道Y轴顶点那么你看向的方向和世界向上的方向就平行了这两个向量叉乘的结果是一个0向量也就是根本没办法计算相机的右侧是那一边相机的上边也同样没办法计算。这是纯数学问题导致的纯数学问题也是最难解决的问题现在多软件的相机使用都是四元数来解决这个问有兴趣的朋友可以去查找相关资料。 总结 此片文章看完OpenGL入门基础篇已经写完了相信你也可以做一个像样的游戏出来了比如以前红白机上的一些游戏可能觉得很Low但凡事都要一步一个脚印游戏也是一路发展过来的没有多少人生来就特别牛。笔者在这里感谢大家的支持。
http://www.dnsts.com.cn/news/121883.html

相关文章:

  • 网站建设 技术规范书网站平台建设的当前问题
  • 江苏省建设工程管理局网站营销推广费用
  • 上海网站建设方案托管html 网站首页
  • 网站怎么做跳转郑州最出名的不孕不育医院
  • win7架设asp网站html怎么添加动态图片
  • 教育培训网站建站哈尔滨市建设工程信息网官网首页
  • 做自由行的网站好台前网站建设电话
  • 鄂尔多斯 网站建设深圳好客站seo
  • 厦门海投工程建设有限公司网站好口碑自适应网站建设
  • 做的漂亮的商务网站赵公口网站建设北京网站设计
  • 做网站宽高怎么决定福州网站建设哪家强
  • 浦口网站建设网站开发成本评估
  • 做网站 写文章怎样加视频齐博网站模板
  • 商业网站最佳域名网站都是在哪里制作的
  • 做html网站搜索框代码深圳公司网站改版通知
  • 上海浦东建设管理有限公司网站模板网站开发推广
  • 企业网站首页设计wordpress数据表更换域名
  • oppo软件商店手机版长沙seo关键词
  • 大学生作业代做网站网站建设费用什么意思
  • 网站建设方案对比网络媒体设计是什么
  • 杭州网站建设的企业优化建立生育支持政策体系
  • 做优化网站多少钱做网站还是软件
  • 酒店网站设计的目的和意义山东已经宣布封城的城市2022年
  • 微信做网站的公司网络营销系统
  • 搜建筑网建筑规范大全电脑优化大师下载安装
  • 十大知名博客网站如何加强网站信息管理建设
  • 一次性筷子网站建设短网址还原在线生成
  • 河南百度建个网站网页设计制作网站用什么软件
  • 做的比较好的家具网站首页经典网站建设
  • 做企业展示型网站的好处手机qq浏览器网页搜索记录删不掉