持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天点击查看活动详情
坐标 局部空间 :物体自己的坐标 每个物体有自己的坐标 原点 所以局部空间有很多个 世界空间 :就是所有物体都在的一个空间 局部空间坐标*世界空间的位置=该物体在世界空间的每个顶点的坐标 观察空间 :大概的理解就是摄像机的视角问题 裁剪空间 :这个空间就是我们视野窗口内应该能看到的点 其他不应该被看到的点会被裁剪掉 由投影矩阵创建的观察箱被称为平截头体,每个出现在平截头体范围内的坐标都会最终出现在用户的屏幕上。将特定范围内的坐标转化到标准化设备坐标系的过程(而且它很容易被映射到2D观察空间坐标)被称之为投影,因为使用投影矩阵能将3D坐标投影,到很容易映射到2D的标准化设备坐标系中。 透视除法这个过程中我们将位置向量的x,y,z分量分别除以向量的齐次w分量;透视除法是将4D裁剪空间坐标变换为3D标准化设备坐标的过程 屏幕空间 :
正射投影的理解:会创建一个类似立方体的平截头箱,这个大概就是他的裁剪空间 如果超过了这个空间的坐标就会被截掉 他的w值是1
透视投影的理解:他也创建了一个平截头体 具体看教程 它主要的原理是因为和正射投影一样 都是每个顶点会除以他的w分量 但是他和正射不一样的是他的w分量是离的越近的w分量越小
欧拉角:欧拉角(Euler Angle)是可以表示3D空间中任何旋转的3个值 俯仰角是描述我们如何往上或往下看的角 偏航角表示我们往左和往右看的程度 滚转角代表我们如何翻滚摄像机
translate函数 (位移函数) translate()第一个参数传一个单位矩阵进来 第二个参数传一个要位移的向量进来 最终可以得到一个变换矩阵 最后用你自己的向量和这个变换矩阵相乘就可以得到最终的向量 比如 mat4 a; a = translate(a, vec3(1.0f, 1.0f, 0.0f)); vec = a * vec; 好像这样也行view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f));
持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天点击查看活动详情
rotate函数 (旋转函数) rotate()第一个参数传一个单位矩阵进来 第二个参数传radians(90.0f) 这是一个将角度化为弧度制的函数 第三个参数传一个向量 就是你想绕哪个轴旋转 比如a = rotate(a, radians(90.0f), vec3(0.0, 0.0, 1.0));
scale函数 (缩放函数) a = scale(a, vec3(0.5, 0.5, 0.5));
ortho函数 (正射投影矩阵的创建) ortho(0.0f, 800.0f, 0.0f, 600.0f, 0.1f, 100.0f); 前两个参数指定了平截头体的左右坐标,第三和第四参数指定了平截头体的底部和顶部。通过这四个参数我们定义了近平面和远平面的大小,然后第五和第六个参数则定义了近平面和远平面的距离。这个投影矩阵会将处于这些x,y,z值范围内的坐标变换为标准化设备坐标。
perspective函数 (创建透视的矩阵) mat4 proj = perspective(radians(45.0f), (float)width/(float)height, 0.1f, 100.0f); 第一个参数表示了视野 设置了观察空间的大小 正常填45 末日风格可以大一点 第二个参数是宽高比 由视口的宽除以高所得 第三和第四个参数设置了平截头体的近和远平面。我们通常设置近距离为0.1f,而远距离设为100.0f
look at函数 (摄像机函数) LookAt函数需要一个位置、目标和上向量。它会创建一个和在上一节使用的一样的观察矩阵。
normalize()函数 (向量单位化)
cross()函数 (点乘) cross(up, cameraDirection)把括号里面的向量x乘