zoukankan      html  css  js  c++  java
  • XNA那些事(四) 3D知识初步

                        首先要向大家解释一下,我马上要当爸爸了,家事繁忙所以很久没有更新博客了。但是我会坚持把这个系列的博客添加完整的。

            前面已经和大家谈了有关XNA 2D的相关知识与介绍,其实2D的世界已经可以做不少事情了,比如前面所提到的那些像植物大战,还有连连看黄金矿工等等,但是做为一个XNA的开发者还是要知道3D建模的相关知识的。

         那么我想说这节内容其实是一节数学方面的补漏课,如果大家的几何学得够好,比如什么右手坐标,矩阵变换这些概念都已经非常理解的情况下那么可以跳过这一节。

        说到3D其实必须要说的是坐标系的概念,在平面或者说2D开发当中这个很简单,X正向朝左,Y正向朝上,这个我觉得不会有什么人疏漏,但是如果现在我问您什么是右手定则,可能有很多朋友就会表示不记得了。

        那么说到底其实坐标系除了定下方向,还要规定哪个方向代表正方向。直角坐标系的 x-轴,y-轴,与 z-轴必须相互垂直。称包含 z-轴的直线为 z-线。在三维空间里,当我们设定了 x-轴,y-轴的位置与方向的同时,我们也设定了 z-线的方向。可是,我们仍旧必须选择,在 z-线以原点为共同点的两条半线中,那一条半线的点的坐标是正值的,那一条是负值的?这两种不同的坐标系统,称为右手坐标系左手坐标系。右手坐标系又称为标准坐标系,或正值坐标系

    右手坐标系这名词是由右手定则而来的。先将右手的手掌与手指伸直。然后,将中指指向往手掌的掌面 半空间,与食指呈直角关系。再将大拇指往上指去,与中指,食指都呈直角关系。则大拇指,食指,与中指分别表示了右手坐标系的 x-轴,y-轴,与 z-轴。同样地,用左手也可以表示出左手坐标系。见下图:

     了解过了坐标系,还要再提到一个矩阵的概念,虽然XNA的MATRIX类已经做了很多工作,把很多的方法都隐藏了起来,但是一些基本概念还是要有

    1.单位矩阵,什么是单位矩阵,一句话说就是一个主对角线上的元素全是1,其它位置上的元素都是0的矩阵,他的性质是任何矩阵与它相乘都是原矩阵本身。这个矩阵在XNA当中对应这个值:Matrix.Identity。

    2.平移矩阵,旋转矩阵等概念由于XNA已经封装很好了如果读者感兴趣,可以去查一下,但是行列式,矩阵的逆,转置,等等概念都是进阶的内容,在这里就不加介绍了。

    接下来是3D开发中的一个重要概念。

    摄像机:

    其实这是任何一个3D建模都需要理解概念,

    摄像机需要两个概念进行定义,一个是位置参数,一个是几何性质的参数,让我们来看一下一段典型的摄像机建模的代码。

     public Camera(Game game, Vector3 pos, Vector3 target, Vector3 up)
                : base(game)
            {
                view = Matrix.CreateLookAt(pos, target, up);

                projection = Matrix.CreatePerspectiveFieldOfView(
                    MathHelper.PiOver4,
                    (float)Game.Window.ClientBounds.Width /
                    (float)Game.Window.ClientBounds.Height,
                    1, 3000);
            }

    其中Matrix.CreateLookAt(pos, target, up);就是指定摄像机的几何位置,第一个参数POS好理解,就是摄像机的位置,第二个参数TARGET就是摄像机朝向如果把眼睛理解为摄像机那么这个参数就是定义眼睛往哪看,第三个参数UP是摄像机的正向,这个参数比较难理解其实可以这样理解,假如您的眼睛位置不变,看的方向不变,但如果你是站着的与你是倒立的两种状态所看到的图像还是不一样的,所以这个参数定义的是你头顶的方向。

    好再看   projection = Matrix.CreatePerspectiveFieldOfView(
                    MathHelper.PiOver4,
                    (float)Game.Window.ClientBounds.Width /
                    (float)Game.Window.ClientBounds.Height,
                    1, 3000);
    这句定义几何性质。Matrix.CreatePerspectiveFieldOfView接受4个参数

    第一个参数定义视角, 第二个参数定义了摄像机的长宽比,第三个参数与第四个参数定义摄像机可以拍摄到的最近距离与最远距离,例如人眼在很近的地方与很远的地方都是看不到物体的,这两个参数定义视距。

    好了,有了上述几个概念,相信大家对于XNA3D已经有了一定的认识,希望有帮助。

  • 相关阅读:
    git系列3之简单命令(查看不同|文件提交|文件移除|重命名)
    git系列2之简单命令(乱码问题|修改文件提交|忽略文件)
    git系列1之安装初体验(windows)
    mongodb主从复制副本集(12)
    mongodb系统知识(11)
    mongodb系统知识(10)
    linux下h2集群创建,及java集成详细步骤
    windows下创建h2集群,及java集成详细步骤
    MySQL与Oracle 差异比较之一数据类型
    快速恢复update了的orcale数据表
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/2458369.html
Copyright © 2011-2022 走看看