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

企业网站建设毕业设计电线电缆技术支持中山网站建设

企业网站建设毕业设计,电线电缆技术支持中山网站建设,python语言好学吗,手机网站页面将坐标变换为标准化设备坐标#xff0c;接着再转化为屏幕坐标的过程通常是分步进行的#xff0c;也就是类似于流水线那样子。在流水线中#xff0c;物体的顶点在最终转化为屏幕坐标之前还会被变换到多个坐标系统(Coordinate System)。将物体的坐标变换到几个过渡坐标系(Inte…将坐标变换为标准化设备坐标接着再转化为屏幕坐标的过程通常是分步进行的也就是类似于流水线那样子。在流水线中物体的顶点在最终转化为屏幕坐标之前还会被变换到多个坐标系统(Coordinate System)。将物体的坐标变换到几个过渡坐标系(Intermediate Coordinate System)的优点在于在这些特定的坐标系统中一些操作或运算更加方便和容易这一点很快就会变得很明显。对我们来说比较重要的总共有5个不同的坐标系统 局部空间(Local Space或者称为物体空间(Object Space))世界空间(World Space)观察空间(View Space或者称为视觉空间(Eye Space))裁剪空间(Clip Space)屏幕空间(Screen Space) 概述 为了将坐标从一个坐标系变换到另一个坐标系我们需要用到几个变换矩阵最重要的几个分别是模型(Model)、观察(View)、投影(Projection)三个矩阵。我们的顶点坐标起始于局部空间(Local Space)在这里它称为局部坐标(Local Coordinate)它在之后会变为世界坐标(World Coordinate)观察坐标(View Coordinate)裁剪坐标(Clip Coordinate)并最后以屏幕坐标(Screen Coordinate)的形式结束。下面的这张图展示了整个流程以及各个变换过程做了什么 局部坐标是对象相对于局部原点的坐标也是物体起始的坐标。下一步是将局部坐标变换为世界空间坐标世界空间坐标是处于一个更大的空间范围的。这些坐标相对于世界的全局原点它们会和其它物体一起相对于世界的原点进行摆放。接下来我们将世界坐标变换为观察空间坐标使得每个坐标都是从摄像机或者说观察者的角度进行观察的。坐标到达观察空间之后我们需要将其投影到裁剪坐标。裁剪坐标会被处理至-1.0到1.0的范围内并判断哪些顶点将会出现在屏幕上。最后我们将裁剪坐标变换为屏幕坐标我们将使用一个叫做视口变换(Viewport Transform)的过程。视口变换将位于-1.0到1.0范围的坐标变换到由glViewport函数所定义的坐标范围内。最后变换出来的坐标将会送到光栅器将其转化为片段。 局部空间 局部空间是指物体所在的坐标空间即对象最开始所在的地方。想象你在一个建模软件比如说Blender中创建了一个立方体。你创建的立方体的原点有可能位于(0, 0, 0)即便它有可能最后在程序中处于完全不同的位置。甚至有可能你创建的所有模型都以(0, 0, 0)为初始位置译注然而它们会最终出现在世界的不同位置。所以你的模型的所有顶点都是在局部空间中它们相对于你的物体来说都是局部的。 世界空间 如果我们将我们所有的物体导入到程序当中它们有可能会全挤在世界的原点(0, 0, 0)上这并不是我们想要的结果。我们想为每一个物体定义一个位置从而能在更大的世界当中放置它们。世界空间中的坐标正如其名是指顶点相对于游戏世界的坐标。如果你希望将物体分散在世界上摆放特别是非常真实的那样这就是你希望物体变换到的空间。物体的坐标将会从局部变换到世界空间该变换是由模型矩阵(Model Matrix)实现的。 模型矩阵是一种变换矩阵它能通过对物体进行位移、缩放、旋转来将它置于它本应该在的位置或朝向。你可以将它想像为变换一个房子你需要先将它缩小它在局部空间中太大了并将其位移至郊区的一个小镇然后在y轴上往左旋转一点以搭配附近的房子。你也可以把上一节将箱子到处摆放在场景中用的那个矩阵大致看作一个模型矩阵我们将箱子的局部坐标变换到场景/世界中的不同位置。 观察空间 观察空间经常被人们称之OpenGL的摄像机(Camera)所以有时也称为摄像机空间(Camera Space)或视觉空间(Eye Space)。观察空间是将世界空间坐标转化为用户视野前方的坐标而产生的结果。因此观察空间就是从摄像机的视角所观察到的空间。而这通常是由一系列的位移和旋转的组合来完成平移/旋转场景从而使得特定的对象被变换到摄像机的前方。这些组合在一起的变换通常存储在一个观察矩阵(View Matrix)里它被用来将世界坐标变换到观察空间。在下一节中我们将深入讨论如何创建一个这样的观察矩阵来模拟一个摄像机。 裁剪空间 在一个顶点着色器运行的最后OpenGL期望所有的坐标都能落在一个特定的范围内且任何在这个范围之外的点都应该被裁剪掉(Clipped)。被裁剪掉的坐标就会被忽略所以剩下的坐标就将变为屏幕上可见的片段。这也就是裁剪空间(Clip Space)名字的由来。 因为将所有可见的坐标都指定在-1.0到1.0的范围内不是很直观所以我们会指定自己的坐标集(Coordinate Set)并将它变换回标准化设备坐标系就像OpenGL期望的那样。 为了将顶点坐标从观察变换到裁剪空间我们需要定义一个投影矩阵(Projection Matrix)它指定了一个范围的坐标比如在每个维度上的-1000到1000。投影矩阵接着会将在这个指定的范围内的坐标变换为标准化设备坐标的范围(-1.0, 1.0)。所有在范围外的坐标不会被映射到在-1.0到1.0的范围之间所以会被裁剪掉。在上面这个投影矩阵所指定的范围内坐标(1250, 500, 750)将是不可见的这是由于它的x坐标超出了范围它被转化为一个大于1.0的标准化设备坐标所以被裁剪掉了。 如果只是图元(Primitive)例如三角形的一部分超出了裁剪体积(Clipping Volume)则OpenGL会重新构建这个三角形为一个或多个三角形让其能够适合这个裁剪范围。 由投影矩阵创建的观察箱(Viewing Box)被称为平截头体(Frustum)每个出现在平截头体范围内的坐标都会最终出现在用户的屏幕上。将特定范围内的坐标转化到标准化设备坐标系的过程而且它很容易被映射到2D观察空间坐标被称之为投影(Projection)因为使用投影矩阵能将3D坐标投影(Project)到很容易映射到2D的标准化设备坐标系中。 一旦所有顶点被变换到裁剪空间最终的操作——透视除法(Perspective Division)将会执行在这个过程中我们将位置向量的xyz分量分别除以向量的齐次w分量透视除法是将4D裁剪空间坐标变换为3D标准化设备坐标的过程。这一步会在每一个顶点着色器运行的最后被自动执行。 在这一阶段之后最终的坐标将会被映射到屏幕空间中使用glViewport中的设定并被变换成片段。 将观察坐标变换为裁剪坐标的投影矩阵可以为两种不同的形式每种形式都定义了不同的平截头体。我们可以选择创建一个正射投影矩阵(Orthographic Projection Matrix)或一个透视投影矩阵(Perspective Projection Matrix)。 正射投影 正射投影矩阵定义了一个类似立方体的平截头箱它定义了一个裁剪空间在这空间之外的顶点都会被裁剪掉。创建一个正射投影矩阵需要指定可见平截头体的宽、高和长度。在使用正射投影矩阵变换至裁剪空间之后处于这个平截头体内的所有坐标将不会被裁剪掉。它的平截头体看起来像一个容器 上面的平截头体定义了可见的坐标它由由宽、高、近(Near)平面和远(Far)平面所指定。任何出现在近平面之前或远平面之后的坐标都会被裁剪掉。正射平截头体直接将平截头体内部的所有坐标映射为标准化设备坐标因为每个向量的w分量都没有进行改变如果w分量等于1.0透视除法则不会改变这个坐标。 要创建一个正射投影矩阵我们可以使用GLM的内置函数glm::ortho glm::ortho(0.0f, 800.0f, 0.0f, 600.0f, 0.1f, 100.0f);前两个参数指定了平截头体的左右坐标第三和第四参数指定了平截头体的底部和顶部。通过这四个参数我们定义了近平面和远平面的大小然后第五和第六个参数则定义了近平面和远平面的距离。这个投影矩阵会将处于这些xyz值范围内的坐标变换为标准化设备坐标。 正射投影矩阵直接将坐标映射到2D平面中即你的屏幕但实际上一个直接的投影矩阵会产生不真实的结果因为这个投影没有将透视(Perspective)考虑进去。所以我们需要透视投影矩阵来解决这个问题。 透视投影 如果你曾经体验过实际生活给你带来的景象你就会注意到离你越远的东西看起来更小。这个奇怪的效果称之为透视(Perspective)。透视的效果在我们看一条无限长的高速公路或铁路时尤其明显正如下面图片显示的那样 正如你看到的那样由于透视这两条线在很远的地方看起来会相交。这正是透视投影想要模仿的效果它是使用透视投影矩阵来完成的。这个投影矩阵将给定的平截头体范围映射到裁剪空间除此之外还修改了每个顶点坐标的w值从而使得离观察者越远的顶点坐标w分量越大。被变换到裁剪空间的坐标都会在-w到w的范围之间任何大于这个范围的坐标都会被裁剪掉。OpenGL要求所有可见的坐标都落在-1.0到1.0范围内作为顶点着色器最后的输出因此一旦坐标在裁剪空间内之后透视除法就会被应用到裁剪空间坐标上 顶点坐标的每个分量都会除以它的w分量距离观察者越远顶点坐标就会越小。这是也是w分量非常重要的另一个原因它能够帮助我们进行透视投影。最后的结果坐标就是处于标准化设备空间中的。 在GLM中可以这样创建一个透视投影矩阵 glm::mat4 proj glm::perspective(glm::radians(45.0f), (float)width/(float)height, 0.1f, 100.0f);同样glm::perspective所做的其实就是创建了一个定义了可视空间的大平截头体任何在这个平截头体以外的东西最后都不会出现在裁剪空间体积内并且将会受到裁剪。一个透视平截头体可以被看作一个不均匀形状的箱子在这个箱子内部的每个坐标都会被映射到裁剪空间上的一个点。下面是一张透视平截头体的图片 它的第一个参数定义了fov的值它表示的是视野(Field of View)并且设置了观察空间的大小。如果想要一个真实的观察效果它的值通常设置为45.0f但想要一个末日风格的结果你可以将其设置一个更大的值。第二个参数设置了宽高比由视口的宽除以高所得。第三和第四个参数设置了平截头体的近和远平面。我们通常设置近距离为0.1f而远距离设为100.0f。所有在近平面和远平面内且处于平截头体内的顶点都会被渲染。 当你把透视矩阵的 near 值设置太大时如10.0fOpenGL会将靠近摄像机的坐标在0.0f和10.0f之间都裁剪掉这会导致一个你在游戏中很熟悉的视觉效果在太过靠近一个物体的时候你的视线会直接穿过去。 把它们都组合到一起 我们为上述的每一个步骤都创建了一个变换矩阵模型矩阵、观察矩阵和投影矩阵。一个顶点坐标将会根据以下过程被变换到裁剪坐标 注意矩阵运算的顺序是相反的记住我们需要从右往左阅读矩阵的乘法。最后的顶点应该被赋值到顶点着色器中的gl_PositionOpenGL将会自动进行透视除法和裁剪。 进入3D 既然我们知道了如何将3D坐标变换为2D坐标我们可以开始使用真正的3D物体而不是枯燥的2D平面了。 在开始进行3D绘图时我们首先创建一个模型矩阵。这个模型矩阵包含了位移、缩放与旋转操作它们会被应用到所有物体的顶点上以变换它们到全局的世界空间。让我们变换一下我们的平面将其绕着x轴旋转使它看起来像放在地上一样。这个模型矩阵看起来是这样的 进入3D 既然我们知道了如何将3D坐标变换为2D坐标我们可以开始使用真正的3D物体而不是枯燥的2D平面了。 在开始进行3D绘图时我们首先创建一个模型矩阵。这个模型矩阵包含了位移、缩放与旋转操作它们会被应用到所有物体的顶点上以变换它们到全局的世界空间。让我们变换一下我们的平面将其绕着x轴旋转使它看起来像放在地上一样。这个模型矩阵看起来是这样的 glm::mat4 model; model glm::rotate(model, glm::radians(-55.0f), glm::vec3(1.0f, 0.0f, 0.0f)); 通过将顶点坐标乘以这个模型矩阵我们将该顶点坐标变换到世界坐标。我们的平面看起来就是在地板上代表全局世界里的平面。 接下来我们需要创建一个观察矩阵。我们想要在场景里面稍微往后移动以使得物体变成可见的当在世界空间时我们位于原点(0,0,0)。要想在场景里面移动先仔细想一想下面这个句子 将摄像机向后移动和将整个场景向前移动是一样的。 这正是观察矩阵所做的我们以相反于摄像机移动的方向移动整个场景。因为我们想要往后移动并且OpenGL是一个右手坐标系(Right-handed System)所以我们需要沿着z轴的正方向移动。我们会通过将场景沿着z轴负方向平移来实现。它会给我们一种我们在往后移动的感觉。 在下一个教程中我们将会详细讨论如何在场景中移动。就目前来说观察矩阵是这样的 glm::mat4 view; // 注意我们将矩阵向我们要进行移动场景的反方向移动。 view glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f));最后我们需要做的是定义一个投影矩阵。我们希望在场景中使用透视投影所以像这样声明一个投影矩阵 glm::mat4 projection; projection glm::perspective(glm::radians(45.0f), screenWidth / screenHeight, 0.1f, 100.0f);既然我们已经创建了变换矩阵我们应该将它们传入着色器。首先让我们在顶点着色器中声明一个uniform变换矩阵然后将它乘以顶点坐标 #version 330 core layout (location 0) in vec3 aPos; ... uniform mat4 model; uniform mat4 view; uniform mat4 projection;void main() {// 注意乘法要从右向左读gl_Position projection * view * model * vec4(aPos, 1.0);... }我们还应该将矩阵传入着色器这通常在每次的渲染迭代中进行因为变换矩阵会经常变动 int modelLoc glGetUniformLocation(ourShader.ID, model)); glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); ... // 观察矩阵和投影矩阵与之类似我们的顶点坐标已经使用模型、观察和投影矩阵进行变换了最终的物体应该会 稍微向后倾斜至地板方向。离我们有一些距离。有透视效果顶点越远变得越小。 让我们检查一下结果是否满足这些要求
http://www.yutouwan.com/news/118151/

相关文章:

  • 怎么做网站301重定向河北省建设厅网站运行条件
  • 网站建设 黑龙江seo百度seo排名优化软件
  • 营销型网站建设需要注意什么建设校园网站意义
  • 企业网站建设的公司有哪些网站建设企业
  • 网站推广双鼎个人主页推荐
  • php网站开发哪个好鄂州网警
  • 云南建设注册考试中心网站十大接单推广平台
  • 外贸综合服务网站建设wordpress轮播插件
  • it行业做网站一个月多少钱515ppt网站建设
  • asp网站开发实例书籍电商设计是做什么的工作
  • 学校网站如何建设网页制作平台哪家好
  • 加强住房公积金网站建设外贸出口网站建设
  • 免费的个人网站怎么做h5页面开发用什么工具
  • 网站解析是什么意思电子产品网页设计
  • com网站域名注册云服务器费用
  • 微信如何建商城网站中国域名备案查询系统
  • 大连哪里有手机自适应网站建设长春网络建站
  • 付费网站 源码 下载链接网站推广方式的策划
  • 15年做那个网站能致富模拟网站建设软件有哪些
  • php做网站难么百度账号管理
  • 海外网站速度慢wordpress 搜索模板
  • 学校网站建设风险分析兰州出台9条优化措施
  • 成都网站开发建设公司wordpress自动抓取
  • 天津市工程建设项目报建网站网络营销有什么岗位
  • 龙岗做网站公司szaowflash做企业网站宣传片
  • 国内移动端网站做的最好的怎么建立一个表格
  • 网站开发与应用论文云空间
  • 网站app封装怎么做证券网站怎么做
  • html 学习网站用备忘录制作一个网站的制作
  • ppt网站建设答案做网站的系统