Rendering1_Matrices
本篇重点内容
1.创建一个立方体网格(cube grid)
2.让cube grid支持缩放,位移和旋转
3.研究变换矩阵
4.创建简单的相机投影
这是basics of rendering教程的第一篇,主要讲的是变换矩阵。这个系列会讲解这些网格(mesh)是如何变成一个个像素呈现在屏幕上的。
原作者有示例工程,用的是Unity5.3.1,我这里重新制作使用Unity2019.4.36f1c1。
在空间中操纵这些“点”
1空间可视化
对unity使用者来说,你们已经知到meshes是什么并如何在场景中改变他们的位置。但他们工作的原理是什么呢?着色器(shader)是如何知道该在什么地方绘制呢?我们当然可以只管使用unity的transform组件和使用shader搞定一切,但是搞清楚背后的原理对我们把控项目的一切是非常重要的。而要搞清背后的原理,最好的方法是我们自己来实现一下这些功能。
mesh的缩放旋转位移是通过操作顶点(vertice)的位置来完成的。我们通过空间可视化来了解变换发生。我们首先创建一个3D 点网格,而点可以是任何预制体。
1 using UnityEngine; 2 3 public class TransformationGrid : MonoBehaviour 4 { 5 public Transform prefab; 6 public int gridResolution = 10; 7 Transform[] grid; 8 void Awake() 9 { 10 grid = new Transform[gridResolution * gridResolution * gridResolution]; 11 for(int gridCount=0,z=0;z) 12 { 13 for(int y=0;y ) 14 { 15 for (int x = 0; x ) 16 { 17 grid[gridCount] = CreateGridPoint(x, y, z); 18 } 19 } 20 } 21 } 22 23 Transform CreateGridPoint(int x,int y,int z) 24 { 25 Transform point = Instantiate (prefab); 26 point.localPosition = GetCoordinate(x, y, z); 27 point.GetComponent ().material.color = new Color( 28 (float)x / gridResolution, 29 (float)y / gridResolution, 30 (float)z / gridResolution 31 ); 32 return point; 33 } 34 35 Vector3 GetCoordinate(int x,int y,int z) 36 { 37 return new Vector3( 38 x - (gridResolution - 1) * 0.5f, 39 y - (gridResolution - 1) * 0.5f, 40 z - (gridResolution - 1) * 0.5f 41 ); 42 43 } 44 }
简单来说,我们就是要实例化一下cube,赋予他们坐标,并根据坐标来决定每个cube有独特的颜色。
我们以原点为中心,这样一来变换(特别是旋转和缩放)都是相对于cube 网格的中心来的。