如果您登录有问题,或者回复有问题,请更新IE版本或更换其它浏览器,例如QQ浏览器,360极速浏览器
如果您查看资源感觉不方便,请点击上方导航栏的资源,我们的源码大部分是经过测试的,请看贴内测试图(测试过的源码都会附送编译好的一键端)
源码
源码
资源
资源
资源
资源
互动
互动

Unity 渲染教程(一):矩阵

[复制链接]
查看: 626|回复: 4

479

主题

493

帖子

5万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
50723
QQ
发表于 2017-3-15 23:44:07 | 显示全部楼层 |阅读模式
创建立方体网格。
支持缩放、位移和旋转。
使用变换矩阵。
创建简单的相机投影。

这是关于渲染基础的系列教程的第一部分。它涵盖了变换矩阵。 首先,从程序化网格开始,让我们先遍历下“网格基础”系列。然后你会知道网格是如何工作的。这个系列将探讨这些网格如何最终转换成显示器上的像素。



对空间中的点进行操作。
可视化空间
你现在已经知道了网格到底是什么,以及它们如何在场景中进行定位。但是这个在场景中的定位是如何工作的?着色器如何知道在哪里绘制这些网格?当然,我们可以依靠unity的变换组件和着色器来处理这一切,但是如果你想获得对网格的完全控制,理解在引擎中实际发生的事情是至关重要的。要完全理解这个过程,最好是通过创建自己的实现来加深理解。
对网格的移动、旋转和缩放是通过操纵网格顶点的位置来完成的。这是一个空间上的变换,所以要看到它是行动的话,我们必须使整个空间可见。我们可以通过创建点的三维网格来做到这一点。点可以是任何预制件。
[AppleScript] 纯文本查看 复制代码
?

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
using UnityEngine;

public class TransformationGrid : MonoBehaviour {

    public Transform prefab;

    public int gridResolution = 10;

    Transform[] grid;

    void Awake () {
        grid = new Transform[gridResolution * gridResolution * gridResolution];
        for (int i = 0, z = 0; z < gridResolution; z++) {
            for (int y = 0; y < gridResolution; y++) {
                for (int x = 0; x < gridResolution; x++, i++) {
                    grid = CreateGridPoint(x, y, z);
                }
            }
        }
    }
}

为什么不使用粒子来可视化这些点?
创建点是一个实例化一个预制件、确定它的坐标,并给它一个独特的颜色。
[AppleScript] 纯文本查看 复制代码
?

1
2
3
4
5
6
7
8
9
Transform CreateGridPoint (int x, int y, int z) {
    Transform point = Instantiate<transform>(prefab);
    point.localPosition = GetCoordinates(x, y, z);
    point.GetComponent<meshrenderer>().material.color = new Color(
        (float)x / gridResolution,
        (float)y / gridResolution,
        (float)z / gridResolution
    );
    return point;
}

我们网格之中最明显的一个形状是立方体,所以让我们从这里开始。我们将它的中心定在原点上,所以变换 - 特别是旋转和缩放 变换- 是相对于网格立方体的中点进行操作的。
[AppleScript] 纯文本查看 复制代码
?

1
2
3
4
5
6
Vector3 GetCoordinates (int x, int y, int z) {
    return new Vector3(
        x - (gridResolution - 1) * 0.5f,
        y - (gridResolution - 1) * 0.5f,
        z - (gridResolution - 1) * 0.5f
    );
}

我将使用默认的立方体来作为预制件,将其缩放到一半的大小,这样这些立方体之间才会有空间。



小的立方体预制件
创建一个网格对象,添加我们的组件,并挂接预制件。当我们进入播放模式的时时候,网格立方体将会出现在场景中,并以我们对象空间的本地原点为中心。



这是来自Transformation grid
变换
理想情况下,我们应该能够对网格应用任意数量的变换。并且我们可以想象出许多类型的转换,但是我们最好把变换限制为位移、旋转和缩放三种类型。
如果我们为每个变换类型创建一个组件类型,那么我们就可以按照我们想要的任何顺序和数量将它们添加到网格对象中去。虽然每个变换的细节不同,但是他们都需要一个方法来将自己应用到空间中的点。
让我们为所有的变换类型创建一个基本组件,以便它们可以继承这个基础组件。这将是一个抽象类,这意味着它不能直接被使用,因为直接使用抽象类将是无意义的。我们会给它一个抽象的Apply方法,这个方法将被具体的变换组件用来做他们自己具体的工作。
[AppleScript] 纯文本查看 复制代码
?

1
2
3
4
5
using UnityEngine;

public abstract class Transformation : MonoBehaviour {

    public abstract Vector3 Apply (Vector3 point);
}

一旦我们将这样的组件添加到我们的网格对象中以后,我们将不得不检索它们,所以我们可以将它们应用到所有的网格点。我们将使用通用列表来存储对这些组件的引用。
[AppleScript] 纯文本查看 复制代码
?

01
02
03
04
05
06
07
08
09
10
11
12
using UnityEngine;
using System.Collections.Generic;

public class TransformationGrid : MonoBehaviour {

    …
    List<transformation> transformations;

    void Awake () {
        …
        transformations = new List<transformation>();
    }
}

现在我们可以添加一个Update方法,它会提取变换信息,然后循环遍历整个网格,对所有的点进行变换。
[AppleScript] 纯文本查看 复制代码
?

1
2
3
4
5
6
7
8
9
void Update () {
    GetComponents<transformation>(transformations);
    for (int i = 0, z = 0; z < gridResolution; z++) {
        for (int y = 0; y < gridResolution; y++) {
            for (int x = 0; x < gridResolution; x++, i++) {
                grid.localPosition = TransformPoint(x, y, z);
            }
        }
    }
}

为什么要在每次更新的时候获取组件?
为什么要使用列表而不是数组?
对每个点的变换是通过获得原始坐标,然后依次应用每个变换来完成的。我们不能依赖于各点的实际位置,因为那些已经被变换进行了更改,我们不希望在每一帧中队这些变换的效果进行累积。


免责声明
  1.零度游戏源码(http://www.0dyx.xyz) 所发布的网游信息、网游源代码资源均来自互联网,非本站开发。如有侵犯您的合法权益请来信告之,我们会在三个工作日内予以清除。
  2.零度游戏源码(http://www.0dyx.xyz) 中所有资料、资源文件仅供技术学习、研究之用,请必须在24小时内删除所下载文件,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担。
  3.零度游戏源码(http://www.0dyx.xyz) 致力于打造国内最权威、最完整的网游源代码下载站点,所有下载源码都是按“原样”提供,不会删减、揉碎,力求全网最全源码。我们提供的源码就是我们团队所研究的代码初始版本,学习价值最高,对于更新、维护的版本,我们会给出维护清单。
  4.零度游戏源码(http://www.0dyx.xyz) 对提供下载的软件等不拥有任何权利,其版权归该下载资源的合法拥有者所有。
网站主域名:www.0dyx.cn 觉得网站不错可以分享给朋友

0

主题

623

帖子

4222

积分

论坛元老

Rank: 8Rank: 8

积分
4222
发表于 2017-3-15 23:51:13 | 显示全部楼层
打酱油的人拉,回复下赚取积分

网站主域名:www.0dyx.cn 觉得网站不错可以分享给朋友

0

主题

652

帖子

4599

积分

论坛元老

Rank: 8Rank: 8

积分
4599
发表于 2017-3-16 09:16:54 | 显示全部楼层
撸过

网站主域名:www.0dyx.cn 觉得网站不错可以分享给朋友

0

主题

632

帖子

4478

积分

论坛元老

Rank: 8Rank: 8

积分
4478
发表于 2017-3-16 15:20:24 | 显示全部楼层
支持你哈...................................

网站主域名:www.0dyx.cn 觉得网站不错可以分享给朋友

0

主题

31

帖子

1457

积分

金牌会员

Rank: 6Rank: 6

积分
1457
发表于 2017-6-8 10:15:43 | 显示全部楼层
支持啊啊啊啊啊啊啊啊啊啊啊

网站主域名:www.0dyx.cn 觉得网站不错可以分享给朋友
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

精彩图文
VIP特价活动即将结束,全网最低价

Copyright   ©2015-2016  零度游戏源码素材  Powered by©Discuz!  技术支持:零度