一、什么是3D模型?

 1.1 3D模型概述

  简而言之,3D模型就是三维的立体的模型,D是英文Dimensions的缩写。

  3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑、人物、植被、机械等等,比如一个大楼的3D模型图。3D模型也包括玩具和电脑模型领域。

  互联网的形态一直以来都是2D模式的,但是随着3D技术的不断进步,在未来的时间里,将会有越来越多的互联网应用以3D的方式呈现给用户,包括网络视讯、电子阅读、网络游戏、虚拟社区、电子商务、远程教育等等。甚至对于旅游业,3D互联网也能够起到推动的作用,一些世界名胜、雕塑、古董将在互联网上以3D的形式来让用户体验,这种体验的真实震撼程度要远超现在的2D环境。

 1.2 如何构建3D模型

3D模型的构建主要有三种:
  ①人工软件构建3D模型:此种方式要求操作人员要具有丰富的专业知识,熟练使用建模软件,而且操作复杂,周期较长,同时最终构件的3D模型真实感不强;
  ②三维扫描仪构建3D模型:此种方式需要价格昂贵的三维扫描仪等硬件设备。并且,三维扫描仪现今只能获得物体的位置信息,对于物体表面的纹理特征多数仍然需要辅助大量的手工工作才能完成。整个过程成本高,周期长;
  ③基于图像构建3D模型:此种方式只需要提供一组物体不同角度的序列照片在计算机辅助下即可自动生成物体的3D模型。操作简单,自动化程度高,成本低,真实感强。

二、Unity中的3D模型基础

 2.1 认识游戏对象

  (1)相信大家经过前一篇博客《Unity3D游戏开发初探—1.跨平台的游戏引擎让.NET程序员新生》初步认识Unity3D之后,对于Hierarchy中的游戏对象有了初步认识了吧。Hierarchy中显示的是GameObject—游戏对象,每个游戏都至少有一个Camera,点击Camera就可以在Preview(预览视图)中看到摄像机的视角画面。

  (2)每个GameObject都有三组属性:Position(位置)、Rotation(旋转、角度)与Scale(缩放大小)三组属性。Position控制游戏对象在三维空间中的坐标,Rotation控制游戏对象显示的角度,而Scale则控制游戏对象缩放的比例。

2.2 认识左手坐标系

  Unity3D采用的是左手坐标系:沿屏幕横向为x轴,沿屏幕纵向为y轴,垂直屏幕方向为z轴。右、上、背向观众的三个方向为正方向。也许这么阐述大家还是不明白,但没关系,我们先来看看空间几何常见的坐标系类型。

  ①空间直角坐标系

  以空间一点O为原点,建立三条两两垂直的数轴;x轴(横轴),y轴(纵轴),z轴(竖轴),这时建立了空间直角坐标系Oxyz,其中点O叫做坐标原点,三条轴统称为坐标轴,由坐标轴确定的平面叫坐标平面

  各轴之间的顺序要求符合右手法则,即以右手握住Z轴,让右手的四指从X轴的正向以90度的直角转向Y轴的正向,这时大拇指所指的方向就是Z轴的正向。这样的三个坐标轴构成的坐标系称为右手空间直角坐标系。与之相对应的是左手空间直角坐标系。

  一般在数学中更常用右手空间直角坐标系,在其他学科方面因应用方便而异。三条坐标轴中的任意两条都可以确定一个平面,称为坐标面。它们是:由X轴及Y轴所确定的XOY平面;由Y轴及Z轴所确定的YOZ平面;由X轴及Z轴所确定的XOZ平面。

  这三个相互垂直的坐标面把空间分成八个部分,每一部分称为一个卦限。位于X,Y,Z轴的正半轴的卦限称为第一卦限,从第一卦限开始,在XOY平面上方的卦限,按逆时针方向依次称为第二,三,四卦限;第一,二,三,四卦限下方的卦限依次称为第五,六,七,八卦限。

  ②右手坐标系

  右手坐标系在中学学空间几何的时候经常会用到。在三维坐标系中,Z轴的正轴方向是根据右手定则确定的。右手定则也决定三维空间中任一坐标轴的正旋转方向。要标注X、Y和Z轴的正轴方向,就将右手背对着屏幕放置,拇指即指向X轴的正方向。伸出食指和中指,如下图所示,食指指向Y轴的正方向,中指所指示的方向即是Z轴的正方向。要确定轴的正旋转方向,如下图所示,用右手的大拇指指向轴的正方向,弯曲手指。那么手指所指示的方向即是轴的正旋转方向。

  ③左手坐标系

  伸出左手,让拇指和食指成“L”形,大拇指向右,食指向上。其余的手指指向前方。如下图所示,这样就建立了一个左手坐标系。拇指、食指和其余手指分别代表x,y,z轴的正方向。判断方法:在空间直角坐标系中,让左手拇指指向x轴的正方向,食指指向y轴的正方向,如果中指能指向z轴的正方向,则称这个坐标系为左手直角坐标系.反之则是右手直角坐标系。

  ④左手坐标系与右手坐标系的比较

  左手坐标系是X轴向右,Y轴向上,Z轴向前,右手坐标系的Z轴正好相反,是指向“自己”的,在计算机中通常使用的是左手坐标系,而数学中则通常使用右手坐标系。计算机里面其实很多也有用右手坐标系,这个只是根据实际应用不同,没有说哪个比较好。

  现在,相信大家至少对于左手坐标系有了一个比较形象的了解了,那么这里介绍的目的也就达到了。(贴图好麻烦的,么么嗒)

2.3 认识Vector3

  如果大家有心的话,会发现我们在第一篇博客里边写的代码里引用了一个Vector3的类,那么这个类是干啥用的呢?我们现在来初步了解一下。

  Vector3是Unity中定义的一个含有x、y、z三个字段的类,可以表示位置点,也可以表示一个向量

  Vector3乘以数值表示对向量的三个值乘以相应的值,假设v1,v2是两个向量,则v1-v2表示从v2指向v1的向量,如下图所示。扩展:后面我们在做打箱子游戏的时候,当一个小球向指定区域发射时,就是一个向量减法的典型应用。已知小球在摄像机位置(即是一个摄像头所在的向量,假设其为v2),以及鼠标所指向的位置坐标后(即为目标地向量,假设其为v1),通过v1-v2即可得到要发射的具体方向的向量(相当于告诉小球朝哪个目标方向发射!)。

三、先学走再学飞—第二个Unity3D程序

  在第一篇博客中的HelloCube程序中,我们让Cube实现了翻转。这次,我们让Cube实现前后移动,让游戏对象学会“走路”这项技能。

  (1)在Hierarchy中Create一个Cube(立方体),并且加入一个Direction Light(平行光);之后,将Cube的Position属性设置为(0,0,-4),这样镜头会近一点;将Cube的Scale属性设置为(1,1,1),这样Cube会放大一点;

  (2)在Project中新增一个C# Script,随便取个名字,这里取名为:CubeController。双击该脚本,在Update方法中输入以下代码:

 using UnityEngine;
using System.Collections; public class CubeController : MonoBehaviour { // Use this for initialization
void Start () { } // Update is called once per frame
void Update () {
if(Input.GetKey(KeyCode.UpArrow))
{
transform.Translate(Vector3.forward*0.2f);
} if(Input.GetKey(KeyCode.DownArrow))
{
transform.Translate(Vector3.back*0.2f);
}
}

  (3)点击预览按钮:按键盘Up键,Cube会朝前移动;按Down键,Cube会往后移动;

  

四、案例深入:地球围绕太阳转

  有了以上的基本的3D理论基础之后,我们再来做一个Unity3D小案例:地球围绕太阳转。所谓地球围绕太阳转,指的是指地球绕太阳做周期性转动。(如果你要问为什么地球围绕太阳转,请问哥白尼先生和牛顿童鞋)

  

  (1)首先Create以下游戏对象:两个Sphere,一个Direction Light;并将其中一个Sphere命名为Earth,另一个Sphere命名为Sun;设置Sun的Scale为(3,3,3),让太阳这个大球体显得大一点;而将Earth的Position设置为(5,0,0),让Earth显示在太阳的右边;

  (2)为了让太阳更像太阳一点,我们在Project中Create一个Material(材质,所谓材质就是修饰游戏对象的),命名为SunMaterial,这里主要是为太阳增加一个颜色。

  选中SunMaterial,双击Main Color,弹出颜色选择器,在颜色选择器中选则一个深黄色的区域。

  (3)为了让地球更像地球一点,这里我们为地球增加一个背景图片—地球贴图。(可以从网上搜索一下,也可以从本文底部给出的URL下载)下载完成之后,将地球贴图拖动到项目中,最后将贴图拖动到Earth对象上。最后效果如下图所示。

  (4)新增一个C# Script,命名为EarthControl。双击该脚本文件,在编辑器中写入以下代码。这里要注意,常用的游戏对象一般设置为全局变量,并且在Start方法中进行初始化(这里是通过GameObject的Find静态方法获取,你可以理解为JavaScript的Dom操作GetElementById("Earth"))。游戏对象的transform组件用于控制物体的位置,旋转和缩放。

 using UnityEngine;
using System.Collections; public class EarthControl : MonoBehaviour
{
// 定义游戏对象
public GameObject earth;
public GameObject sun; // Use this for initialization
void Start()
{
// 启动时获取游戏对象
earth = GameObject.Find("Earth");
sun = GameObject.Find("Sun");
} // Update is called once per frame
void Update()
{
// 使地球对象围绕着太阳旋转
earth.transform.RotateAround(sun.transform.position, Vector3.up, 0.3f);
}
}

PS:使用RotateAround()方法,让地球始终围绕着太阳在Y轴方向旋转。参数1表示围绕旋转参照点的位置(太阳的位置),参数2表示围绕旋转的角度,Vector3.up就是表示Y轴旋转,参数3表示一次旋转的速度(long类型,越大则越快)。

  (5)脚本写好之后,将该脚本拖动到Earth上进行绑定。最后,点击预览按钮,即可看到地球围绕太阳转的效果了。

  

五、小结

  本篇主要介绍了游戏开发中的一些3D模型基础,涉及到一点中学的空间几何知识,复习一下对后续学习会有好处。后面会探索一下物理引擎和GUI,但也只是初步的。最后,仍然感谢一下参考文献的作者,站在你们的肩膀上我能看的更远,谢谢!

参考文献与资料

  (1)3D模型百度百科:http://baike.baidu.com/link?url=dFgpG-8l3EFNqybYgkRSe-0fWd3oye2jcKYqMYHV8mfXRYlIJYM0-nsNkeKJMq0Rtgzc5IR6ZDbNl0SrZYxSNK

  (2)泡泡堂,《左手坐标系和右手坐标系》:http://www.cnblogs.com/mythou/p/3327046.html

(5)传智播客Unity3D公开课:http://net.itcast.cn/subject/Unity3D/index.html

附件

  (1)地球贴图:http://pan.baidu.com/s/1c069Vvq

作者:周旭龙

出处:http://www.cnblogs.com/edisonchou/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

Unity3D游戏开发初探—2.初步了解3D模型基础的更多相关文章

  1. Unity3D游戏开发初探—3.初步了解U3D物理引擎

    一.什么是物理引擎? 四个世纪前,物理学家牛顿发现了万有引力,并延伸出三大牛顿定理,为之后的物理学界的发展奠定了强大的理论基础.牛顿有句话是这么说的:“如果说我看得比较远的话,那是因为我站在巨人的肩膀 ...

  2. Unity3D游戏开发初探—4.开发一个“疯狂击箱子”游戏

    一.预备知识—对象的”生“与”死“ (1)如何在游戏脚本程序中创建对象而不是一开始就创建好对象?->使用GameObject的静态方法:CreatePrimitive() 以上一篇的博文中的“指 ...

  3. Unity3D游戏开发初探—1.跨平台的游戏引擎让.NET程序员新生

    一.Unity3D平台简介 Unity是由Unity Technologies开发的一个让轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的 ...

  4. [Unity3D]Unity3D游戏开发3D选择场景中的对象,并显示轮廓效果强化版

    大家好,我是秦培,欢迎关注我的博客,我的博客地址blog.csdn.net/qinyuanpei. 在上一篇文章中,我们通过自己定义着色器实现了一个简单的在3D游戏中选取.显示物体轮廓的实例. 在文章 ...

  5. 内置3D对象-Unity3D游戏开发培训

    内置3D对象-Unity3D游戏开发培训 作者:Jesai 2018-02-12 19:21:58 五大面板: -Hierachy:当前场景中的物体 图 1-1 -Project:项目中的所有资源 图 ...

  6. Unity3D游戏开发从零单排(四) - 制作一个iOS游戏

    提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...

  7. [Unity3D]Unity3D游戏开发之跑酷游戏项目解说

    大家好,我是秦元培.我參加了CSDN2014博客之星的评选,欢迎大家为我投票,同一时候希望在新的一年里大家能继续支持我的博客. 大家晚上好.我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.c ...

  8. 投影方式- Unity3D游戏开发培训

    投影方式- Unity3D游戏开发培训   作者:Jesai 2018-02-12 20:33:13 摘  要 透视投影是3D渲染的基本概念,也是3D程序设计的基础.掌握透视投影的原理对于深入理解其他 ...

  9. Unity3D游戏开发培训

    Unity3D游戏开发培训 作者:Jesai 时间:2017-01-08 修改:2017-01-09 12:36:15 1         项目的构成 图1-1 如图1-1所示,Unity3D的项目构 ...

随机推荐

  1. Zbrush 快捷键

    1.按住shift 在空白地方移动鼠标左键 就会去到正交视图 2.shift+F可以看一下布线的情况 3.按住shift 点一下画布,松开shift键,就可以旋转画布

  2. swift - 字典和集合

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #4dbf56 } p.p2 { margin: 0.0px 0. ...

  3. 百度地图API试用--(初次尝试)

    2016-03-17: 百度地图API申请key的步骤相对简单,不做过多阐述. 初次使用百度地图API感觉有点神奇,有些功能加进来以后有点问题,注释掉等有空再解决. 代码如下: <%@ page ...

  4. Hibernate注解方式配置-继承关系

    在JPA中,实体继承关系的映射策略共有三种:单表继承策略(table per class).Joined策略(table per subclass)和Table_PER_Class策略. 1.单表继承 ...

  5. iOS APP可执行文件的组成

    iOS APP编译后,除了一些资源文件,剩下的就是一个可执行文件,有时候项目大了,引入的库多了,可执行文件很大,想知道这个可执行文件的构成是怎样,里面的内容都是些什么,哪些库占用空间较高,可以用以下方 ...

  6. mysql+ssh 配置(转载)

    Mysql+ssh配置 一.Linux平台间mysql+ssh配置 本机地址为:192.168.189.133 mysql服务器地址为:192.168.189.139 linux命令行下使用ssh命令 ...

  7. 解决jquery新加入的元素没有绑定事件问题

    在使用jquery操作时,往往需要动态的添加一些元素,但是这些新加入的元素并没有像css那样被赋予原本定义的样式,解决方法如下: 1.动态插入元素后,并用bind事件给新加入的元素绑定事件. 2.如果 ...

  8. Linux文件系统

    今天学习了Linux文件系统,现在来做个小总结. 首先Linux中一切都是文件,下面这个清单是Linux系统的顶层目录结构. 清单 1. Linux 系统的顶层目录结构 / 根目录 ├── bin 存 ...

  9. C# uploadify 上传 -220 IO Error 问题

    1. 前端: uploadify 上文件大小限制配置. 2. 后端: web.config 配置 <?xml version="1.0"?> <configura ...

  10. C语言_第五章__实践(密码转换)

    1.   要求 输入China  输出 Glmre #include <stdio.h> #include <stdlib.h> int main() { char c ; c ...