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

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

 

作者:邓家海

2018-02-12 20:33:13

摘  要

透视投影是3D渲染的基本概念,也是3D程序设计的基础。掌握透视投影的原理对于深入理解其他3D渲染管线具有重要作用。本文详细介绍了透视投影的原理和算法实现,包括透视投影的标准模型、一般模型和屏幕坐标变换等,并通过VC实现了一个演示程序。

在Unity3D里面,投影方式决定了我们人眼看到的场景,投影方式一般分为透视投影和正交投影两种,透视投影相当于我们人的眼睛看到的东西。越远越小,越近越大。还会出现一个倒影。在物理学上面的小孔成像就是透视投影。正交投影是平行光源的投射,物体不会随着距离的改变而改变。在计算机三维图像里面,投影是可以看作是一种将三维坐标变成二维坐标的方法。

相机设置

透视投影:与人的视觉系统相似,多用在三维平面中对三维世界的呈现。模型是由视点E和视平面P两部分构成(要求E不在平面P上),视点就是观察者的位置,也就是三维世界的角度,视平面就是渲染三维对象的二维平面图,对于任意一点X,构造一条从E到X的射线R,R与平面P的交点X,p即是X点的透视投影结果。如图所示:

图 1-1

图 1-2

 

正交投影:用于二维世界的呈现。

图 1-3

无论远近,大小是一样的

 

 

3D默认是透视投影(Perspective),2D默认是正交投影(Orthographic)。

透视投影的实现

6.1 载入3D模型

使用Matt Fairfax实现的Model_3DS类支持3DS模型文件的载入,该类的实现非常简单,而且很容易使用,具体可参考[7]。由于本文的DEMO只需要其中的模型载入功能,所以对源代码进行了删减,去掉了纹理加载(暂不需要)和渲染(我们自己实现)代码,在析构函数中添加了资源释放代码。

6.2 视图变换

为表示透视投影的一般模型,实现了KCamera类,除保存视点的位置和姿态,还保存视图变换矩阵m_kmView,随着视点位置和姿态的变化,视图矩阵也不断更新,更新算法详见第4节。对于世界坐标系中的任何一点v(x, y, z),通过v = m_kmView*v将其变换到透视投影的标准模型坐标系,详见KCamera::Transform函数。

6.3 透视变换

KFrustum类用来对透视投影的标准模型进行建模,其成员包括视平面的尺寸大小,以及近截面和远截面的z轴坐标。KFrustum通过Project函数将视图变换的结果变换为透视坐标。算法的原理见第3节,代码实现如下:

 1 void KFrustum::Project(KVector3& v)
 2
 3 {
 4
 5     // xp = x*n/z, yp = y*n/z, zp = n.
 6
 7     float fFactor = GetNear()/v.z;
 8
 9     v.x *= fFactor;
10
11     v.y *= fFactor;
12
13     v.z = GetNear();
14
15 }

6.4 屏幕变换

屏幕变换的算法通过宏实现,代码如下:

 1 #define ToScreen(v, Ws, Hs) /
 2
 3 {/
 4
 5     float x = (v.x/GetWidth()+0.5f)*(Ws-1);/
 6
 7     float y = (v.y/GetHeight()+0.5f)*(Hs-1);/
 8
 9     v.x = KMath::Round(x);/
10
11     v.y = KMath::Round(y);/
12
13 }

6.5 渲染

Demo中的渲染使用软件实现,没有使用任何第三方图形库,主代码在KCamera::Render函数中,它接收两次参数:Model_3DS和KSurface,对Model_3DS中的顶点进行透视投影,然后将结果绘制到Ksurface中。函数代码如下:

 1 bool KCamera::Render(Model_3DS& m3DS, KSurface& kSurface)
 2
 3 {
 4
 5     kSurface.Fill(RGB(0,0,0)); // 背景为黑色
 6
 7     COLORREF crPen = RGB(255,0,0); // 用红色绘制模型
 8
 9
10
11     KMatrix4 m = m_kmView;
12
13     int Ws = kSurface.GetWidth();
14
15     int Hs = kSurface.GetHeight();
16
17
18
19     for(int i=0; i<m3DS.numObjects; i++)
20
21     {
22
23         Model_3DS::Object& obj = m3DS.Objects[i];
24
25
26
27         for(int n=0; n<obj.numFaces; n+=3)
28
29         {
30
31             int index = obj.Faces[n]*3;
32
33             KVector4 v0(obj.Vertexes[index], obj.Vertexes[index+1], obj.Vertexes[index+2]);
34
35             index = obj.Faces[n+1]*3;
36
37             KVector4 v1(obj.Vertexes[index], obj.Vertexes[index+1], obj.Vertexes[index+2]);
38
39             index = obj.Faces[n+2]*3;
40
41             KVector4 v2(obj.Vertexes[index], obj.Vertexes[index+1], obj.Vertexes[index+2]);
42
43
44
45             Transform(v0, Ws, Hs);
46
47             Transform(v1, Ws, Hs);
48
49             Transform(v2, Ws, Hs);
50
51
52
53             // 绘制网线
54
55             kSurface.MoveTo(v0.x, v0.y);
56
57             kSurface.LineTo(v1.x, v1.y, crPen);
58
59             kSurface.LineTo(v2.x, v2.y, crPen);
60
61             kSurface.LineTo(v0.x, v0.y, crPen);
62
63         }
64
65     }
66
67
68
69     return true;
70
71 }

原文地址:https://www.cnblogs.com/dengjiahai/p/8443536.html

时间: 2024-11-06 07:30:22

投影方式- Unity3D游戏开发培训的相关文章

Unity3D游戏开发培训

Unity3D游戏开发培训 作者:邓家海 时间:2017-01-08 修改:2017-01-09 12:36:15 1         项目的构成 图1-1 如图1-1所示,Unity3D的项目构成主要分成三部分: Assets:资源解包,例如 3D 模型. 2D 纹理和声音的会在在此目录中的某个地方   Library:类库,此属性包含Unity3D 使用配合资产(tie assets)和逻辑一起在scenes的引用关系.这里还放置您设置的editor preferences. platfor

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

作者:邓家海 2018-02-12 19:21:58 五大面板: -Hierachy:当前场景中的物体 图 1-1 -Project:项目中的所有资源 图 1-2 -Scene:当前场景的预览图 图 1-3 -Inspector:属性 图 1-4 -Game:游戏视图,以摄像机视觉查看场景,可以预览到玩家看到的内容 图 1-5 图 1-6   快捷键分别是Q.W.E.R,第一个手是移动,第二个是XYZ坐标移动,第三个是球型旋转,第四个2D视图. -Q:移动场景 -W:位置变换 -E:位置变换 -

Unity3D游戏开发之如何截屏的技能培训

下面我们开始今天的Unity3D技能培训. 我们学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. 今天我们来做点简单的东西,做个什么呢?答案就是截屏.作为一名热爱单机游戏的玩家,每次在玩游戏的同时截取游戏中比较喜欢的画面,特别是学习了Unity3D以后玩游戏的时候更多地是从一个游戏设计者的角度来看待游戏,换句话说,可能关注技术的成分更多一点吧.比如在写<Unity3D游戏开发之自由视角下的角色控制>和<

Unity3D游戏开发之网络游戏服务器架构设计培训

下面我们开始今天的Unity3D游戏开发技能培训. 我们专业培养"游戏主程",挑战20W年薪,初期学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. 今天给大家讲一下如何做一个好的主程 入手 假如,我现在接手一个新项目,我的身份还是主程序.在下属人员一一到位之前,在和制作人以及主策划充分沟通后,我需要先独自思考以下问题: 1.服务器跑在什么样的操作系统环境下?2.采用哪几种语言开发?主要是什么?3.服

Unity3D游戏开发之《愤怒的小鸟》弹弓实现技能培训

今天我们来做一个高端大气上档次的东西.我相信大家都玩过一款叫做<愤怒的小鸟>的游戏,这款游戏之所以能够受到玩家的喜爱,是因为这是一款物理游戏,在游戏中处处充满了物理.我们熟悉的抛物线.引力等物理元素都在这款游戏中得到了体现.那么<愤怒的小鸟>这款游戏使用的正是Unity引擎,所以我们在游戏中看到了各种各种有趣的物理现象.那么,我们今天呢,就以<愤怒的小鸟>游戏中的小鸟发射器——弹弓为例,来讲述在Unity中如何实现弹性效果. 下面我们开始今天的Unity3D游戏开发技能

Unity3D游戏开发之《愤怒的小鸟》弹弓实现的技能培训

下面我们开始今天的Unity3D游戏开发技能培训. 我们学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. 今天我们来做一个高端大气上档次的东西.我相信大家都玩过一款叫做<愤怒的小鸟>的游戏,这款游戏之所以能够受到玩家的喜爱,是因为这是一款物理游戏,在游戏中处处充满了物理.我们熟悉的抛物线.引力等物理元素都在这款游戏中得到了体现.那么<愤怒的小鸟>这款游戏使用的正是Unity引擎,所以我们在游戏中

unity3d游戏开发之简单的透明shader技能培训

下面我们开始今天的Unity3D游戏开发技能透明shader技能培训. 我们学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. [plain] view plaincopy // Shader created with Shader Forge Beta 0.34 // Shader Forge (c) Joachim Holmer - http://www.acegikmo.com/shaderforge/

[Unity3D]Unity3D游戏开发之经典打砖块游戏的实现

大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 今天呢,我们来一起做一个怀旧版的经典游戏打砖块.相信每一个和博主同龄的人对于这个游戏都有着一种独特的情感吧.这个游戏是博主小时候掌上游戏机里面比较好玩的一个游戏,玩家需要通过控制屏幕下方的横条,通过一个小方块来消灭屏幕上方的砖块,玩家每消灭一个砖块,就能够得到一定的分数,当消灭完整个屏幕上的方块后,即可进入下一关,而且屏幕下方的横条长度会增长.那么,关于这个游戏就暂且介绍到这里,我们下面开

APP定制 HTML5开发 UNITY3D游戏开发 Mac软件外包

APP定制 HTML5开发 UNITY3D游戏开发 Mac软件外包 app软件开发带给企业哪些价值? APP现在对于很多人都不在是陌生的词语,而是用户智能时代的快捷应用.智能手机大范围普及的时代,事物移动化已经成为业界共识. 1.APP软件开发帮助企业实现精准营销.APP将企业的最新信息快速精准的传达给目标客户.例如,公司最近的新产品上市或优惠促销活动等信息,都可以通过手机APP第一时间传达给客 户,这种传达方式,既精准又有效.2.信息传播随时随地.手机APP传达给客户的信息不会因为时间或者是空