PISCOnoob

导航

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<gridResolution;z++)
12         {
13             for(int y=0;y<gridResolution;y++)
14             {
15                 for (int x = 0; x<gridResolution;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<Transform>(prefab);
26         point.localPosition = GetCoordinate(x, y, z);
27         point.GetComponent<MeshRenderer>().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 网格的中心来的。

posted on 2022-04-08 17:59  PISCOnoob  阅读(37)  评论(0编辑  收藏  举报