28
Dec

四种全景显示插件的比较

   Posted by: sunwd   in 收藏

四种全景显示插件的比较

Java Applet

优点:无须下载插件,文件尺寸小下载快,最常用的全景显示插件,免费缺点:幅面小,图像质量差,动态显示有跳动感不连续,不支持Windows XP常用的Applet:lpjpanoptviewer支持cylindel,spherical,cubic制作工具软件:任何粘贴软件,如panorama tool(.IVR)

例1:武汉东湖 200K
例2:长江大桥   
图像幅面1400X700P  文件尺寸191K

QTVR

优点:图像质量最好,需下载插件Quicktime使用极为普遍,与其他WEB3D或视频播放共用插件.缺点:需要下载插件:Quicktime(7M)Quicktime5.0支持cubic全景,适于在本地主机上演示,专用文件格式(.MOV)制作工具软件:专用:quicktime VR authoring studio 

例1:武汉东湖 500K
例2:长江大桥   图像幅面3200X1600P   文件尺寸320K

Shockwave3d

优点:图像质量好,文件尺寸小,.适于在本地主机演示  缺点:需要下载插件Shockwave PlayerShockwave Director playerFlash player使用极普遍,虽需下载插件,但能与其他WEB3D共用插件 Shockwave3dweb3d的一种专用文件格式(.DCR) 制作工具:Director8.5,因此全景可以与建模技术的web3d结合

例:长江大桥

图像幅面3200X1600P

文件尺寸400K

Imove

优点:图像质量好,可做大幅面全景,适于在本地主机上演示.缺点:需要下载插件 (插件0.99M),文件尺寸稍大全景专用文件格式,3DMAXVIZ可输出此文件格式(.PAN)

例1:武汉东湖500K例2:长江大桥图像幅面3200X1600P文件尺寸207K

 

全景摄影简介

全景摄影是把相机环360 度拍摄的一组照片拼接成一个全景图像,用一个专用的播放软件在互联网上显示,并使您能用鼠标控制环视的方向,可左可右可近可远。使您感到就在环境当中,您好像在一个窗口中浏览外面的大好风光
全景摄影的英文名称是Panorama全景摄影并不是真正意义上的3D图形技术,它发展较快的原因是因为它有下述几个优点:
     * 实地拍摄,有照片级的真实感
     * 交互性,您能用鼠标控制环视的方向,可看天,,,,,远。
     * 它不需要单独下载插件,一个小小的JAVA程序,自动下载后就可以在网上观 
      看全景照片。总共下载的文件100–150K即可,下载时间仅需1分种左右。
 
全景摄影柱形全景,球形全景,立方体全景对象全景
 
柱形全景:最简单的全景摄影,水平360度观看四周的景色,但是如果用鼠标上  
下拖动时,上下的视野将受到限制,您看不到天顶,也看不到地底。即垂直视角小于180度。请看实例:例一。请看我的“云南虚拟旅游”全景照片
 
球形全景:视角是水平360度,垂直180度,即全视角360X180可以说您已经融入了虚拟环境之中了。球形全景照片的制作比较复杂:首先必须全视角拍摄,即要把上下前后左右全部拍下来,普通相机要拍摄很多张照片。然后再用专用的软件把它们拼接起来,做成球面展开的全景图像,最后选用播放软件,把全景照片嵌入您的网页。在美国,也不是所有的制作软件都支持球形全景。有的专业公司提供球形全景制作的全套软硬件设备,但价格昂贵。请看实例:例四


对象全景


对象全景

Object Panorama):对象全景是瞄准互联网上的电子商务的,它与风景全景的主要区别是:拍摄时瞄准对象(如你要拍摄汽车,汽车就是对象),转动对象,而不是相机,每转动一个角度,拍摄一张,顺序完成。然后选用对象全景的播放软件,并把它们嵌入你的网页,发布到您的网站上。对象全景也有很广的应用范围:商品和玩具展示,文物观赏,艺术和工艺品展示等等。请看实例:

            例二   例三(3DMAX模型制作)
 
立方体全景(cubic Panorama)例五
  全景照片是由前,后,左,右,上,下6张照片拼接而成。相机位于立方体的中心,也是全视角。请看实例:

全景摄影并不是真正意义上的3D图形技术,它发展较快的原因是因为它有下述几个优点:

     * 实地拍摄,有照片级的真实感
     * 交互性,您能用鼠标控制环视的方向,可看天,,,,,远。
     * 它不需要单独下载插件,一个小小的JAVA程序,自动下载后就可以在网上观 
      看全景照片。总共下载的文件100–150K即可,下载时间仅需1分种左右。
 
全景摄影柱形全景,球形全景,立方体全景对象全景
 
柱形全景:最简单的全景摄影,水平360度观看四周的景色,但是如果用鼠标上  
下拖动时,上下的视野将受到限制,您看不到天顶,也看不到地底。即垂直视角小于180度。请看实例:例一。请看我的“云南虚拟旅游”全景照片
 
球形全景:视角是水平360度,垂直180度,即全视角360X180可以说您已经融入了虚拟环境之中了。球形全景照片的制作比较复杂:首先必须全视角拍摄,即要把上下前后左右全部拍下来,普通相机要拍摄很多张照片。然后再用专用的软件把它们拼接起来,做成球面展开的全景图像,最后选用播放软件,把全景照片嵌入您的网页。在美国,也不是所有的制作软件都支持球形全景。有的专业公司提供球形全景制作的全套软硬件设备,但价格昂贵。请看实例:例四


对象全景


对象全景

Object Panorama):对象全景是瞄准互联网上的电子商务的,它与风景全景的主要区别是:拍摄时瞄准对象(如你要拍摄汽车,汽车就是对象),转动对象,而不是相机,每转动一个角度,拍摄一张,顺序完成。然后选用对象全景的播放软件,并把它们嵌入你的网页,发布到您的网站上。对象全景也有很广的应用范围:商品和玩具展示,文物观赏,艺术和工艺品展示等等。请看实例:

            例二   例三(3DMAX模型制作)
 
立方体全景(cubic Panorama)例五
  全景照片是由前,后,左,右,上,下6张照片拼接而成。相机位于立方体的中心,也是全视角。请看实例:
27
Dec

Flash制作360度全景效果

   Posted by: sunwd   in 收藏

Flash制作360度全景效果

佚名

 
 随着网络影象技术的飞速发展,出现了很多新兴的图象格式。其中360旋转VR图象无疑是其中相当耀目的一支。如果你到过微软下属的专业汽车网站
www.carpoint.com
或者是苹果公司的www.quicktime.com都可以找到这类图片的踪影。只要用鼠标点住图象,就可以实现从左到右,从上到下的对物体全方位的观
看。实现这样的图象目前已经有几种解决方案。其一是微软的svj格式,其二是quicktime的mov格式,其三还有一种IPIX的格式。这几种方法都
很不错,但对客户机器硬件要求很高,传输速度也有待解决。而且在制作上必须有专业摄象器材和处理软件。这对于一般电脑玩家来说有点可望不可及了。你有没有
想过用FLASH也可以做出这样的图象来呢?

  首先,准备好图片。最简便的方法是用数码相机拍摄一组连续的图象。比如在室内固定一个点,以这个点为圆心,架起三角架,拍下周围的影象,如果是360
度旋转一周,你需要拍摄12到20张照片。(当然,考虑到数码相机并非一个普及的东西,我们就拿一幅单张的图片来做范例也是无所谓的。)用你最顺手的图象
处理软件把这一系列图片拼合成一个整张。我推荐友立的Ulead Cool
360,它使用非常简单。找不到的话就用Photoshop。注意输出图象的时候采取无损失的图象格式,比如用BMP或者是PNG都可以。在FLASH里
会对图象做进一步的压缩,
如果一开始就用JPG的话效果可有点惨不忍睹咯。打开Flash软件,别急着导入图象,先把需要的action脚本写好再说。

  步骤一:说明在Flash里旋转图象的工作原理。想起来好象很复杂,其实是很简单的。有两个同样的movie clip都包含着原始图片;用一个隐型按钮来侦测鼠标的动作;再用一个隐型的movie
clip提供当前鼠标位置。当观看者拖拽鼠标的时候,隐型按钮根据其按下鼠标当时的x轴的数值产生两个变量,同时告知另一个隐型movie clip开始播放。第二个movie
clip把鼠标初始位置和现在位置进行比较,反向转动图片。所以,创建一个名为M.Update的MC,在第一影格里设定Action为stop,第二影格里设定如下:


  Begin Tell Target (“../”)

    Set Variable: “cur_x1″ = GetProperty(“/movie1″,
_x)

    Set Variable: “cur_x2″ = GetProperty(“/movie2″,
_x)

    If (cur_x1 < -3700)

      Set Property (“movie1″, X Position) = cur_x2 + 3557

    End If

    If (cur_x2 < -3700)

      Set Property (“movie2″, X Position) = cur_x1 + 3557

    End If

    If (cur_x1 > 3700)

      Set Property (“movie1″, X Position) = cur_x2 – 3557

    End If

    If (cur_x2 > 3700)

      Set Property (“movie2″, X Position) = cur_x1 – 3557

    End If

  End Tell Target

(3557是我所用的图片宽度,你可以把它更换成你所用图片的尺寸。)第三个影格里动作如下:

  Begin Tell Target (“../”)

    Set Variable: “x” = GetProperty(“/hidden”, _x)

    Set Variable: “offset_x” = (start_x – x) / 8

    Set Variable: “cur_x1″ = GetProperty(“/movie1″,
_x)

    Set Variable: “cur_x2″ = GetProperty(“/movie2″,
_x)

    Set Property (“/movie1″, X Position) = cur_x1 + offset_x

    Set Property (“/movie2″, X Position) = cur_x2 + offset_x

  End Tell Target

  Go to and Play

  第二步:创建隐型侦测按钮。创建一个叫做Drag的按钮,只在HIT影格里画一个实心圆,因为是隐型的所以不必介意圆的颜色。再创建一个叫做M.Hidden的MC,把按钮导入,并在绘制区域内赋予动作如下(注意不是赋予该关键影格的动作):


  On (Press)

    Begin Tell Target (“../”)

      Set Variable: “start_x” = GetProperty(“/hidden”,
_x)

    End Tell Target

    Begin Tell Target (“../update”)

      Go to and Play (2)

    End Tell Target

  End On

  On (Release, Release Outside)

    Begin Tell Target (“../update”)

      Go to and Stop (1)

    End Tell Target

  End On

  第三步:导入和定位图片:现在导入你处理好的图片到一个MC,把该MC命名为M.main。一定要把图片的左边靠拢Flash
绘图区域的最左边。如果没靠拢的话,待会导出的影片会有一个很模糊的区域。回到主场景,把M.main拖进layer1的第一影格,靠边放好,把它的实体
名定为movie1。
再拖拽一个M.main进入相同的地方,随便放在哪里都可以,实体名为movie2。新建图层2,把M.Hidden拖进场景;新建图层3,拖进
M.Update 。在图层 4里,把第一影格上赋予动作如下:

  Start Drag (“/hidden”, lockcenter)

  Set Property (“/movie2″, X Position) = GetProperty(“/movie1″,
_x) + 3557

  Set Property (“/movie2″, Y Position) = GetProperty(“/movie1″,
_y)

  Stop

好了,输出你的全景影片吧,看看效果!

- 完

27
Dec

全景软件

   Posted by: sunwd   in 收藏

全景软件

软件名称(点击详情介绍)

软件类型
大小
上传日期
下载
试用版
57.7KB
2002/07/07
试用版
5.01MB
2002/07/07
试用版
5.49MB
2002/07/07
试用版
1.66MB
2002/07/07
试用版
389KB
2002/07/07
试用版
1.46MB
2002/07/07
试用版
5.85MB
2001/09/02
试用版
2.59MB
2001/09/02
免费软件
3.75MB
2002/07/06
试用版
1.13MB
2002/07/06
试用版
6.17MB
2001/03/12
试用版
4.74MB
2001/03/12
试用版
653KB
2001/09/05
试用版
5.91MB
2001/09/02
试用版
2.3MB
2001/09/02
试用版
3.03MB
2001/09/02
试用版
5.77MB
2001/03/12
试用版
6.95MB
2001/03/12
试用版
3.9MB
2002/07/06
27
Dec

Mozilla Firefox键盘快捷键

   Posted by: sunwd   in 软件

键盘快捷健

下面是 Mozilla Firefox最常用的键盘快捷键的列表以及它们在,  Internet Explorer 和 Opera 中相对应的快捷键.

命令 Mozilla Firefox Internet Explorer Opera
添加为书签 Ctrl+D Ctrl+D Ctrl+T
后退 Backspace 1

Alt+Left Arrow
Backspace

Alt+Left Arrow
Backspace

Alt+Left Arrow

Ctrl+Left Arrow

Z
打开书签 Ctrl+B

Ctrl+I
Ctrl+I F4

Ctrl+Alt+B

Ctrl+1
插入浏览 F7 无此功能 无此功能
关闭窗口 Ctrl+W

Ctrl+F4
Ctrl+W

Ctrl+F4
Ctrl+W

Ctrl+F4
补充 .com 地址 Ctrl+Enter Ctrl+Enter Enter
补充 .net 地址 Shift+Enter 无此功能 无此功能
补充 .org 地址 Ctrl+Shift+Enter 无此功能 无此功能
复制 Ctrl+C Ctrl+C Ctrl+C
剪切 Ctrl+X Ctrl+X Ctrl+X
减小文字大小 Ctrl+-   9
删除 Del Del Del
下载 Ctrl+E 无此功能 Ctrl+Alt+T

Ctrl+5
再次查找 F3

Ctrl+G
  F3
输入查找链接 ' 无此功能 ,

Shift+/
输入查找文本 / 无此功能 /

.
查找 Shift+F3   Shift+F3
本页查找 Ctrl+F Ctrl+F Ctrl+F
前进 Shift+Backspace 1

Alt+Right Arrow
Shift+Backspace

Alt+Right Arrow
Shift+Backspace

Alt+Right Arrow

Ctrl+Right Arrow

X
全屏 F11 F11 F11
历史 Ctrl+H Ctrl+H Ctrl+Alt+H

Ctrl+4
首页 Alt+Home Alt+Home Ctrl+Space
增大文字大小 Ctrl++   0
移到下一帧 F6    
移到上一帧 Shift+F6    
新建标签页 Ctrl+T 无此功能 Ctrl+N
下一个标签页 Ctrl+Tab

Ctrl+PageDown
无此功能 Ctrl+Tab

Alt+Page Down

Ctrl+F6

2
新建窗口 Ctrl+N Ctrl+N Ctrl+Alt+N
打开文件 Ctrl+O Ctrl+O Ctrl+O
在新标签页打开网址 Alt+Enter 无此功能 Shift+Enter
页面信息 Ctrl+J   Ctrl+8
页面源代码 Ctrl+U Ctrl+F3 Ctrl+F3
粘贴 Ctrl+V Ctrl+V Ctrl+V
前一个标签页 Ctrl+Shift+Tab

Ctrl+PageUp
无此功能 Ctrl+shift+Tab

Alt+Page Up

Ctrl+Shift+F6

1
打印 Ctrl+P Ctrl+P Ctrl+P
重做 Ctrl+Shift+Z

Ctrl+Y
Ctrl+Y Ctrl+Shift+Z

Ctrl+Y
重新载入 F5 1

Ctrl+R
F5

Ctrl+R
F5

Ctrl+R
重新载入 (忽略缓存) Ctrl+F5

Ctrl+Shift+R
Ctrl+F5  
恢复文本大小 Ctrl+0   6
页面另存为 Ctrl+S   Ctrl+S
全选 Ctrl+A Ctrl+A Ctrl+A
选择地址条 Alt+D

F6

Ctrl+L
Alt+D

F6

F4

Ctrl+Tab
F8
搜索条 Ctrl+K   Shift+F8
选择标签页 [1 to 9] Ctrl+[1 to 9] 无此功能  
停止 Esc Esc Esc
撤消 Ctrl+Z Ctrl+Z Ctrl+Z

1: 这个快捷键只在windows中起作用.

27
Dec

一些作360公司

   Posted by: sunwd   in 收藏

http://www.e360.cn/
http://www.360cn.net/default.asp
http://www.vcts360.com.cn/
http://www.eyesom.com/products/panorama.htm
http://www.suite-dress.com/database/shop/shopjy/qjhs3.htm
http://www.jietusoft.com/products.html
http://www.86vr.com/news/LIST.ASP?id=620
http://www.86vr.com/
http://xo219918h.sozp.com/

http://www.snowlotus.com/Done/Full360.htm

24
Dec

3D游戏中的碰撞检测

   Posted by: sunwd   in 收藏

【简介】


自从计算机游戏出现以来,程序员就不断地想办法来更精确地模拟现实世界。就拿乒乓游戏为例子(译者:Pong—被誉
为电子游戏的祖先,有幸见过一次:),能见到祖先做的游戏感觉真是爽啊,想看的可以到FTP上下载“地球故事”就可以看到了:),游戏中有一个象征性的小
方块(球)和两支拍子,游戏者需要在恰当的时间将拍子移动到恰当的地点,将小球反弹回去。这个基本操作的背后(以现在的标准来看)就是最原初的碰撞检测
了。


【正文】


自从计算机游戏出现以来,程序员就不断地想办法来更精确地模拟现实世界。就拿乒乓游戏为例子
(译者:Pong—被誉为电子游戏的祖先,有幸见过一次:),能见到祖先做的游戏感觉真是爽啊,想看的可以到FTP上下载“地球故事”就可以看到了:),
游戏中有一个象征性的小方块(球)和两支拍子,游戏者需要在恰当的时间将拍子移动到恰当的地点,将小球反弹回去。这个基本操作的背后(以现在的标准来看)
就是最原初的碰撞检测了。今天的游戏比“乒乓”要高级得多,并且基本上是基于3D的。3D游戏中的碰撞检测比“乒乓”游戏里的要更加难实现。玩一些早期模
拟飞行游戏的体验向我们展现出糟糕的碰撞检测是如何毁灭一个游戏的。当穿过一座大山的尖顶的时候仍然活着,感觉很不真实。即便是现在的一些游戏也还是有碰
撞上的问题,许多玩家曾经失望地看着他们喜爱的英雄或女英雄的部分身体穿进了墙里。甚至更糟的是,许多玩家都有过这样糟糕的体验,就是被那些离得很远的子
弹或火箭击中。因为游戏者们要求提升真实性,我们开发者就不得不绞尽脑汁想办法让我们的游戏世界尽可能地接近现实世界。



  
阅读这篇文章前首先假设你对与碰撞检测相关的几何和数学知识已经有了基本的了解。在文章的最后,我将提供一些这方面的参考资料,以免你对它们感觉有点生
疏。另外我还假设你已经读过 Jeff Lander 的图形专栏里关于碰撞检测文章(“Crashing into the New Year,”
; “When Two Hearts Collide,”;和 “Collision Response: Bouncy, Trouncy,
Fun,”)。我将首先进行一个大概的描述,然后快速地切入到核心内容里,通过这两步从上至下地深入到碰撞检测中。我将讨论两种类型的图形引擎中的碰撞检
测:基于 portal 的和基于 BSP 的。每种引擎中多边形的组织各不相同,因此在 world-object
型的碰撞检测上存在很大的差别。而object-object
型的碰撞检测绝大多数地方在上述两种引擎里的是一样的,主要看你是如何实现的了。当我们接触到多边形的碰撞检测时,我们还会实验如何将其扩展到我们学过的
凸型物体上。


  为了创建一个理想的碰撞检测程序,我们不得不在开发一个游戏的的图形管道的同时就开始计划并创建它的框架。在项目
的最后加入碰撞检测是相当困难的。想在开发周期的末尾创建快速的碰撞检测将很有可能会使整个游戏被毁掉,因为我们不可能使它能高效地运行。在好的游戏引擎
中,碰撞检测应该是精确、有效并且十分快速的。这些要求意味着碰撞检测将要与场景的多边形管理管道紧紧地联系起来。这也意味着穷举法将无法工作――今天的
3D游戏中每帧处理的数据量很可能导致打格,当你还在检测一个物体的各多边形是否与场景中的其它多边形碰撞时,时间已经过去了。



我们从基本的游戏引擎循环开始吧(列表1)。快速浏览这些代码来得到碰撞检测的相关策略。我们先假设碰撞没有发生,然后更新物体的位置,如果发现发生了碰
撞,我们将把物体移回原来的位置不允许它穿越边界(或将物体销毁或执行一些预防措施)。然而,这个假设太过简单因为我们无法得知物体原来的位置是否仍然有
效。你必须为这种情况设计一个方案(否则你可能会体验到坠机或被子弹击中的感觉――就是前面举的例子)。如果你是一个热心的玩家,你可能已经注意到了在一
些游戏当中,当你挨着墙壁并试图穿过去的时候,摄像机就开始震动。你正经历的就是将主角移回原位的情况。震动是因为取了较大的时间片引起的。
Listing 1. Extremely Simplified Game Loop
while(1){
process_input();
update_objects();
render_world();
}
update_objects(){
for (each_object)
save_old_position();
calc new_object_position
             {based on velocity accel. etc.}
if (collide_with_other_objects())
new_object_position = old_position();
{or if destroyed object remove it etc.}



Figure 1. Time gradient and collision tests.



是我们的方法有缺陷,我们忘了在等式中加入时间。图1告诉我们时间太重要了不能忘了它。即便物体在 t1 或 t2 时刻没有发生碰撞,它仍有可能在
t
时刻穿过边界(t1<t<t2)。这会在两个连续帧中产生大幅度地跨越(就好象击中了燃料室或其它类似的东西)。我们不得不找一个好的方法来
解决这个问题。


 我们可以把时间看成是第四维并将所有运算在4维空间中进行。然而这可能会让运算变得十分复杂,所以我们会避开这些。我们还可以创建一个以 t1、t2时刻的物体为起始点的实心体,然后用它来与墙进行测试(见图2)

Figure 2. Solid created from the space that an object spans over a given time frame.


  一个简单的方法就是创建一个凸壳来罩住两个不同时刻的物体。这种方法效率低下可能会明显地降低你的游戏速度。以其创建一个凸壳,还不如创建一个围绕实心体的包围盒。我们学习其它的技术后再回来讨论这个问题。


  有另一种比较容易执行但精度较低的方法,就是把给定的时间段分为两分,然后测试时间中点的相交关系。我们还可以递归地依次测定各段的时间中点。这个方法比先前的方法要快得多,但不能保证能捕捉到所有的碰撞情况。


  
另一个暗藏着的问题是collide_with_other_objects()方法的实现――即判断一个物体是否与场景中的其它物体相交。如果场景中有
很多的物体,这个方法可能消耗很大。如果要判断各物体与场景中其它物体是否相交,我们将不得不进行大概N选2次比较。因此比较次数会是N的平方次冪(或表
示成O(N2))。但我们可以用几种方法来避免进行O(N2)对的比较。举个例子,我们可以把场景中的物体分成静态的(被撞物)和动态的(碰撞物――即使
它的速度为0也行)。就好象房间中的墙壁是被撞物,而一个扔向墙壁的小球是碰撞物。我们可以创建两棵独立的树(每一棵对应一类物体),然后测试那些物体可
能会碰撞的树。我们甚至可以对环境进行约定让一些碰撞物之间不发生碰撞――比如我们不需要在两颗子弹之间进行判断。现在在继续之前,(经过改进之后)我们
可以说处理过程变得更加清晰了。(另一个减少场景中成对的比较的方法就是建立八叉树。这已经超出了这篇文章的范围,你可以在Spatial Data
Structures: Quadtree, Octrees and Other Hierarchical Methods文章中的For
Further Info一节里读到更多关于八叉的信息)。现在让我们来看一下基于 Portal
引擎,了解为什么在这类引擎中一提到碰撞检测就会那么痛苦。


Portal引擎和Object-Object型碰撞



  
基于 Portal
的引擎把场景或世界分割成较小的凸方形区域。凸方形区域很适合图形管道因为它们能避免重绘现象。不幸的是,对碰撞检测来说,凸方形区域会给我们带来一些困
难。在我最近的一些测试中,一个引擎中平均大约有400到500个凸方形区域。当然,这个数字会随着不同的引擎而有所变化,因为不同的引擎使用不同的多边
形技术。而且多边形的数目也会因场景的大小而有所不同。


判断一个物体的多边形是否穿过了场景中的多边形产生的运算量可能会很大。一
个最简单的碰撞检测法就是用球形来近似地表示物体或物体的一部分,然后再判断这些包围球是否相交。这样我们仅仅需要测试两个球体中心的距离是否小于它们的
半径合(这表示发生了碰撞)。如果我们是用中心点距离的平方和半径合的平方进行比较,那更好,这样我们可以在计算距离时除去拙劣的开方运算。但是,简单的
运算也导致了精确度的降低(见图3)。

Figure 3. In a sphere-sphere intersection, the routine may report that collision has occurred when it really hasn’t.


  
但我们仅仅是将这个不太精确的方法做为我们的第一步。我们用一个大的球体代表整个对象,然后检测它是否和其它的球体相交。如果检测到发生了碰撞,那么我们
就要进一步提高精度,我们可以将大的球体分割成一系列小的球体,并检查与各小球体是否发生碰撞。我们不断地分割检查直到得到满意的近似值为止。分层并分割
的基本思想就是我们要尽可能达到适合需要的理想的情况。

Figure 4. Sphere subdivision.



球体去近似地代表物体运算量很小,但在游戏中的大多数物体是方的,我们应该用方盒来代表物体。开发者一直用包围盒和这种递归的快速方法来加速光线追踪算
法。在实际中,这些算法已经以八叉和AABB(axis-aligned bounding
boxes)的方式出现了。图5展示了一个AABB和它里面的物体。

Figure 5. An object and its AABB.


  
坐标轴平行(“Axis-aligned”)不仅指盒体与世界坐标轴平行,同时也指盒体的每个面都和一条坐标轴垂直。这样一个基本信息就能减少转换盒体时
操作的次数。AABBs 在当今的许多游戏中都得到了应用,开发者经常用它们作为模型的包围盒。再次指出,提高精度的同时也会降低速度。因为
AABBs 总是与坐标思平行,我们不能在旋转物体的时候简单地旋转 AABBs —
它们应该在每一帧都重新计算过。如果我们知道每个对象的内容,这个计算就不算困难并不会降低游戏的速度。
然而,我们还面临着精度的问题。假如我们有一个3D的细长刚性直棒,并且要在每一帧动画中都重建它的AABB。我们可以看到每一帧中的包围盒的都不一样而
且精度也会随之改变。

Figure 6. Successive AABBs for a spinning
rod (as viewed from the side).


  
所以以其用 AABBs,为什么我们不用任意方向能最小化空白区域的包围盒呢。这是一种基于叫 oriented bounding
boxes—OBBs 的技术,它已经广泛用于光线追踪和碰撞检测中。这种技术不但比 AABBs 技术更精确而且还更健壮。但 OBBs
实现起来比较困难,执行速度慢,并且不太适合动态的或柔性的物体。特别注意的是当我们把一个物体分得越来越小的时候,我们事实上在创建一棵有层次的树。


  
我们是选择 AABBs 还是选择 OBBs 应该根据我们所需的精确程度而定。对一个需要快速反应的3D射击游戏来说,我们可能用 AABB
来进行碰撞检测更好些――我们可以牺牲一些精度来换取速度和实现的简单化。这篇文章附带的代码已经传到 Game Developer
网页上了。里面是从 AABBs 开始讲起,同时还提供了一些实现 OBBs
的碰撞检测包里的代码例子。好了,现在我们已经有了关于每一部分是如果工作的认识了,下面我们来看看实现的细节。


创建树



  为任意的网格模型创建 OBB 树可能是算法里最难的一个部分,而且它还要调整以适合特定的引擎或游戏类型。图7示出了从最初的模型创建一个OBB树的整个过程。可以看到,我们不得不找出包围给定模型的最近似的包围盒(或者其它3D体)。

Figure 7. Recursive build of an OBB and its tree.


  
有几种方法可以事先计算OBB,这其中包括了许多的数学运算。其中一个基本的方法是计算顶点分布的均值,将它作为包围盒的中心,然后计算协方差矩阵。然后
我们用协方差矩阵的三个特征向量中的两个把多边形和包围盒结合起来。我们可以凸盒方法进一步加速和优化树的创建。你可以在Gottschalk,
Lin, 和 Manocha的文章中的“For Further
Info”一节找到相关信息。建立AABB树要简单得多,因为我们不需要找出物体的最小的包围体和它们的轴。我们只需决定在哪分开模型,而且包围盒可以自
由创建(只要包围盒平行于坐标轴并且包含分割面其中一侧的所有顶点)。


  现在我们得到了所有的包围盒,下一步我们来构造一棵树。
我们从最初的包围盒开始从上至下地反复分割它。另外,我们还可以用从下至上的方式,逐步地合并小包围盒从而得到最大的包围盒。把大的包围盒分割成小的包围
盒,我们应该遵守以下几条原则。我们应该用一个面(这个面垂直于包围盒中的一条坐标轴)来分割包围盒上最长的轴,然后根据多边形处在分割轴的哪一边把多边
形分离开来(如图7)。如果不能沿着最长的轴进行分割,那我们就沿第二长的边分割。我们持续地分割直到包围盒不能再分割为止。依据我们需要的精度(比如,
是否我们真的要判断单个三角形的碰撞),我们可以按我们的选择的方式(如是按树的深度或是按包围盒中多边形的数目)以任意的条件停止分割。


  正如你所看到的,创建阶段相当复杂,其中包括了大量的运算。很明显不能实时地创建树――只能是事先创建。事先创建可以免去实时改变多边形的可能。另一个缺点是OBB要求进行大量的矩阵运算,我们不得不把它们定位在适当的地方,并且每棵子树必须与矩阵相乘。
使用树进行碰撞检测



  
现在假设我们已经有了OBB或者AABB树。那么我们该怎么进行碰撞检测呢?我们先检测最大的包围盒是否相交,如果相交了,他们可能发生了碰撞,接下来我
们将进一步地递归处理它们(不断地递归用下一级进行处理)。如果我们沿着下一级,发现子树并没有发生相交,这时我们就可以停止并得出结论没有发生碰撞。如
果我们发现子树也相交了,那么要进一步处理它的子树直到到达叶子节点,并最终得出结论。进行相交测试时,我们可以把包围盒投影到空间坐标轴上并检查它们是
否线性相交。这种给定的坐标轴称为分离坐标轴(separating axis)如图8所示。

Figure 8. Separating axis (intervals
A and B don’t overlap).


  为了快速地判断相交性,我们使用一种叫分离坐标的方法。这种方法告诉我们,只有15条潜在的分离坐标。如果跌交的情况在每一条分离坐标上都发生了,那么包围盒是相交的。因此,很容易就能判断出两个包围盒是否相交。


  
有趣的是,前面提到的时间片大小的问题用分离坐标技术很容易就能解决。回忆一下关于在两个给定时间内是否发生碰撞的问题。如果我们把速度加上,并且在所有
15条坐标轴上的投影都跌交,说明会发生碰撞。我们可以用类似于AABB树那样的数据结构区分碰撞物和受碰物,并判断他们是否有可能发生碰撞。这种运算可
以快速地排除在场景中的大多数情况,产生一个接近理想的O次幂(N logN)的效率。
基于BSP树的碰撞检测技术



  BSP
(二叉空间分割)树是另一种类型的空间分割技术,其已经在游戏工业上应用了许多年(Doom是第一个使用BSP树的商业游戏)。尽管在今天BSP树已经没
像过去那么受欢迎了,但现在三个被认可的游戏引擎――Quake II, Unreal, and
Lithtech(译者:这是2000年的文章,所以指出的这些游戏才这么老:)仍在广泛地采用这项技术。当你看一下BSP在碰撞检测方面那极度干净漂亮
和高速的效率,立刻能让你眼前一亮。不但BSP树在多边形剪切方面表现出色,而且还能让我们有效地自由运用world-object式的碰撞检测。BSP
树的遍历是使用BSP的一个基本技术。碰撞检测本质上减少了树的遍历或搜索。这种方法很有用因为它能在早期排除大量的多边形,所以在最后我们仅仅是对少数
面进行碰撞检测。正如我前面所说的,用找出两个物体间的分隔面的方法适合于判断两个物体是否相交。如果分隔面存在,就没有发生碰撞。因此我们递归地遍历
world树并判断分割面是否和包围球或包围盒相交。我们还可以通过检测每一个物体的多边形来提高精确度。进行这种检测最简单的一个方法是测试看看物体的
所有部分是否都在分割面的一侧。这种运算真的很简单,我们用迪卡尔平面等式 ax + by + cz + d = 0
去判断点位于平面的哪一侧。如果满足等式,点在平面上;如果ax + by + cz + d > 0那么点在平面的正面;如果ax + by
+ cz + d < 0点在平面的背面。


  在碰撞没发生的时候有一个重要的事情需要注意,就是一个物体(或它的包围盒)必须在分割面的正面或背面。如果在平面的正面和背面都有顶点,说明物体与这个平面相交了。


  不幸的是,我们还没有一个很好的方法检测在一个时间间隔内的碰撞(在文章开头提到的方法现在仍在使用)。然而,我已经看到有另外的数据结构像BSP树一样开始广泛使用了。
曲面物体及碰撞检测



  
现在我们已经看到了两种多边形物体的碰撞检测,下面一看看如何计算弯曲物体的碰撞。99年发布的几款游戏已经大量地采用曲面了,因此在接下来几年里高效的
曲面碰撞检测将变得十分重要。曲面碰撞检测(要求有给定点上精确的曲面等式)运算开销极大,所以我们要尽量避开它。实际上我们已经讨论了几种能用在这种情
况下的方法。最明显的方法就是用低网格来近似表示曲面,然后使用这个多面体进行碰撞检测。甚至还有更简单的(但精度比较低),就是在曲面的控制顶点(译
者:大概意思就是说每隔一定量的顶点就构造一个凸壳)上构造凸壳用来做碰撞检测。在这种情况下,曲面的碰撞检测十分近拟于传统的多面体碰撞检测。如图9显
示了曲面及它在控制顶点上形成的凸壳。

Figure 9. Hull of a curved object.


是否我们可以结合这两种技术形成一种混合方法?首先我们用凸壳进行碰撞检测然后逐步在凸壳所属的部分细分下去,这样就增加了精度。


由你决定


  现在我们已经浏览了一些高级的碰撞检测(有一些也是基本的),你应该能够决定什么样的系统更适合你的游戏。你要决定的主要事情是精度、速度、实现的简单程度及系统的适应性。


For Further Info


&#8226; H. Samet. Spatial Data Structures: Quadtree, Octrees and Other Hierarchical Methods. Addison Wesley, 1989.


&#8226;
For more information about AABBs take a look at J. Arvo and D. Kirk. “A
survey of ray tracing acceleration techniques,” An Introduction to Ray
Tracing. Academic Press, 1989.


&#8226; For a
transformation speedup, check out James Arvo’s paper in Andrew S.
Glassner, ed. Graphics Gems. Academic Press, 1990.


&#8226;
S. Gottschalk, M. Lin, and D. Manocha. “OBBTree: A hierarchical
Structure for rapid interference detection,” Proc. Siggraph 96. ACM
Press, 1996. has contributed a great deal to the discussion of OBBs in
terms of accuracy and speed of execution.


&#8226; S. Gottschalk. Separating Axis Theorem, TR96-024, UNC Chapel Hill, 1990.


&#8226;
N. Greene. “Detecting intersection of a rectangular solid and a convex
polyhedron,” Graphics Gems IV. Academic Press, 1994. introduces several
techniques that speed up the overlap computation of a box and a convex
polyhedron.

24
Dec

3D游戏课程

   Posted by: sunwd   in 收藏

基础课:


序号
课程名称
课程目标
RGDC-A01
计算机网络基础
学习计算机网络的基本概念及分类,了解计算机网络的基本工作原理,熟悉常用的网络协议及网络硬件设备。为将来的网络游戏开发打下网络概念基础。
RGDC-A02
游戏开发概论
通过对游戏基本概念及游戏制作流程、开发方法的系统介绍,帮助学员了解游戏开发,在游戏团队找到自己的定位。
RGDC-A03
游戏MOD
通过学习游戏MOD技术,引领初学者进入游戏开发的殿堂,修改现有游戏,实现游戏DIY。
RGDC-A04
关系数据库原理
学习关系型数据库系统的基本概念和体系结构,掌握关系模型的关系运算理论,了解和掌握关系数据库的规范化理论以及数据库设计的全过程。为将来的网络游戏开发打下数据库理论基础。




专业基础课:


序号
课程名称
考试号
RGDC-A05
C++面向对象程序设计
了解面向对象语言的基础知识,掌握如何使用C++进行面向对象的程序设计,并将其运用到游戏开发中。
RGDC-A06
数据结构与算法
讲解游戏开发所必需的数据结构知识,分析经典算法,理解编程的精要。
RGDC-A07
游戏数学
讲解与游戏开发相关的数学知识,建立三维世界与向量、矩阵、行列式、四元数之间的关系。
RGDC-A08
计算机图形学
掌握基本图形生成算法,裁剪与变换,图形层次结构,人机交互技术,光栅图形的扫描转换与区域填充,隐藏面和隐藏线的消除,曲线曲面表示,三维实体造型,真实感图形的基本理论和算法,了解计算机动画理论。
RGDC-A09
WINDOWS API程序设计
深入理解Windows程序运行机制,熟练掌握WIN32
API开发窗口程序的技术,为游戏框架和工具开发打下基础。
RGDC-A10
游戏软件工程与团队协作
熟悉软件工程理论在游戏开发中的应用,熟练使用系统建模工具。了解游戏开发的团队协作模式,以适应实际的工作岗位。
RGDC-A11
程序调试与测试
掌握程序调试技巧,掌握单元测试理论及测试工具。为提高开发效率和程序质量奠定基础。
RGDC-A12
企业级数据库设计、管理与开发
掌握流行的大型企业级数据库的管理技术,掌握SQL语言进行数据库开发,了解分布式数据库集成技术,为大型网络游戏的后台数据库建设奠定基础。
RGDC-A13
游戏专业英语
通过经典专业文章的精度,了解专业词汇,提高相关外文资料的阅读能力。
RGDC-A14
JAVA程序设计
了解并掌握JAVA语言的基本语法。能比较熟练地用JAVA语言进行一般的程序设计,初步掌握JAVA编程开发环境JDK1.3、Visual
J++的使用。为移动平台游戏开发奠定基础。






专业课:


序号
课程名称
考试号
RGDC-A15
OpenGL游戏编程
掌握最流行的3D图形开发API,学习使用它构建真正的三维游戏场景。其中包括网格渲染、纹理映射、光照与材质、摄象机管理等内容。
RGDC-A16
DirectX游戏编程
掌握业界游戏开发最常用的SDK,包括Direct3D、DirectInput、DirectPlay、DirectSound等游戏程序开发的图形、控制、网络、声音等子系统。
RGDC-A17
游戏图形系统
理解游戏图形系统的基本构成,能够对流行3D API进行封装构成图形子系统。学习场景管理、BSP、Portal、Octree、LOD、Terrain、水面、天空盒、粒子特效、顶点混合、Bump
Map、Vertex and Pixel shaders等专用游戏图形技术。
RGDC-A18
游戏控制系统
理解游戏控制系统的基本构成,实现键盘、鼠标、遥控杆编程,实现力反馈设备编程。
RGDC-A19
模型及动画系统
理解游戏模型及动画系统的基本构成,掌握模型的导出插件编程方法,掌握关键帧动画、骨骼动画的实现原理,能够进行角色动画编程。
RGDC-A20
游戏声音系统
理解游戏声音系统的基本构成,熟悉DX Sound,理解OpenAL,掌握三维立体声、多普勒效应实现方法,掌握WAV、MP3、MIDI、CD音轨等多种声音文件格式。
RGDC-A21
游戏网络系统
理解游戏网络系统的基本构成,熟悉Socket 编程机制、熟悉客户、服务器通信机制、掌握游戏数据封包加密传输技术。
RGDC-A22
游戏脚本系统
理解游戏脚本系统的基本构成,掌握编译原理的基本知识,掌握流行的游戏脚本系统Python、Lua等。
RGDC-A23
游戏AI系统
理解游戏人工智能系统的基本构成,了解神经网络、遗传算法、有限状态机、A*寻路算法等,为游戏提供强大的智能。
RGDC-A24
游戏物理系统
理解游戏物理系统的基本构成,理解刚体动力学的基本原理,能够将惯性、重力、加速度、阻力和压力等物理现象在游戏中表现出来,增强游戏真实性。
RGDC-A25
设计模式
面向对象开发重视代码的重用性和可维护性,设计模式使程序员可以更加简单方便地重复使用成功的设计和体系结构。要求掌握20种游戏开发常用设计模式。
RGDC-A26
高级JAVA程序设计
学习多线程、输入输出流、网络编程、数据库编程、图形编程、窗口编程等高级JAVA技术。




岗位能力强化课程:


序号

课程名称

考试号
RGDC-A27
游戏框架设计
学习直接应用底层引擎构建游戏上层逻辑框架,集成图形、控制、声音、网络、物理、AI等子系统。实现消息处理机制。
RGDC-A28
在线网络游戏架构
以可运行的在线网络游戏为实例,分析网络游戏的架构,学习服务器与客户端程序开发。
RGDC-A29
大型游戏数据库系统
以可运行的在线网络游戏为实例,分析大型在线游戏数据库系统,学习大型游戏数据库设计、开发及维护。
RGDC-A30
引擎结构分析
以完整的游戏引擎为实例,分析引擎架构,结合设计模式,学习大型游戏引擎的结构设计,完成引擎各子系统的集成。
RGDC-A31
引擎核心设计
针对引擎的底层技术,学习内存管理、日志管理、异常管理、数学库、文件系统等核心部分的优化与设计。
RGDC-A32
高级实时渲染技术
重点强化游戏图形系统,深入了解Realtime
Rendering的理论、算法。
RGDC-A33
应用程序框架MFC
学习MFC微软标准库的开发,掌握利用应用程序框架快速建立桌面应用程序的能力,为游戏工具开发作好准备。
RGDC-A34
游戏工具实例分析
通过对任务编辑器、关卡编辑器、角色编辑器、粒子编辑器等游戏工具的实例分析,强化游戏工具开发能力。
RGDC-A35
手机游戏设计
掌握手机游戏制作理论、开发规范、程序模型及市场定位分析等知识。
RGDC-A36
J2ME游戏开发
使用SUN公司的J2ME进行手机游戏开发,掌握多种虚拟机平台。
24
Dec

搜索引擎大全

   Posted by: sunwd   in 收藏


 

 

24
Dec

3D Engine 的设计架构

   Posted by: sunwd   in 收藏

 

作者:Luke Hodorowicz
翻译:乐晨光 (2001/9/28)

本人对3D也不甚了解,译文动机一则是内容所致兴致昂然,二则锻炼英译中技能。由本人水平及经验有限,文中绝对不乏大量误解与误译,亦恳请读者指出,得以一同提高。

佳文须共赏,也欢迎大家自由转载 :)

Introduction (简介)


咱们谈谈你如何撰写一份提供优雅性能的3D引擎。你的引擎需要提供的包括:曲面(curved surfaces)、动态光线(dynamic
lighting)、体雾(volumetric
fog)、镜面(mirrors)、入口(portals)、天空体(skyboxes)、节点阴影(vertex
shaders)、粒子系统(particle systems)、静态网格模型(static mesh
models)、网格模型动画(animated mesh
models)。假如你已经知道如何以上所述的所有功能顺利工作,你也许便能将那些东东一起置入到一个引擎当中。

等等!在你开始撰写代码
前你必须先构思一下如何去架构你的引擎。多数来讲,你一定是迫切地渴望去制作一个游戏,但如果你立即投入便开始为你的引擎撰写代码后,你一定会觉得非常难
受,开发后期你可能会为置入新的特效与控制而不得不多次重写大量的局部代码,甚至以失败而放弃告终。花一点时间好好地为你引擎深谋远虑一番,这将会为你节
省大量时间,也少一点头痛。你一定不会急切地去架构一个巨型的工程;或许你也会在引擎未完成时而干脆放弃它,然后去干的别的什么事儿。好了,当你掌握学习
你所需知识的方式之前,也许你还不能完成那些事儿。将设计真正地完成确实是件美事,为之你会感觉更好,你将为之而耀眼!

让我们分析一下具
备完整功能的3D游戏引擎的需要哪些基本部件。首先,这为具有相应3D经验但且还需一些指引的开发者提供了一些信息。这是一些并不难且能快速掌握但是你必
须应用的内容条目。为将你的工作更好地进行下去,这里将对关于“把多大的工作量”与“多少部分”置入一个游戏引擎给出一个总概。我把这些成分称为
系统(System)、控制台(Console)、支持(Support),渲染/引擎 内核(Renderer/Engine
Core)、游戏介质层(Game Interface)、以及工具/数据(Tools/Data)。



Tools/Data (工具/数据)


开发过程中,你总是需要一些数据,但不幸的是这并不象写文本文件或是定义一个立方体那么简单。至少,你得需要3d模型编辑器,关卡编辑器,以及图形程序。
你可以通过购买,也可以在网上找一些免费的程序满足你的开发要求。不幸的是你可能还需要一些更多的工具可你却根本无法获得(还不存在呢),这时你只得自己
动手去写。最终你很可能要自行设计编写一个关卡编辑器,因为你更本不可能获得你所需。你可能也会编写一些代码来为大量的文件打个包,整天面对应付成百上千
个文件倒是非常痛苦的。你还必须写一些转换器或是插件将3d模型编辑器的模型格式转换成你自己的格式。你也需要一些加工游戏数据的工具,譬如可见度估算或
是光线贴图。

一个基本的准则是,你可能要为设计工具而置入比游戏本身等量甚至更多的代码。开始你总能找到现成的格式和工具,但是经过一段时间以后你就能认识到你需要你的引擎有很大的特性,然后你就会放弃以前的撰写方式。

也许目前非常流行利用的第3方工具辅助开发,所以你必须时刻注意你的设计。因为一旦当你将你的引擎发布为opensouce或是允许修改,那也许在某天中会有某些人来应用你的开发成果,他们将其扩展或者做某些修改。

或许你也应该花大量时间去设计美术,关卡,音效,音乐和实体模型,这就和你设计撰写游戏,工具以及引擎一样。



System (系统)


统(system)是引擎与机器本身做通信交互的部件。一个优秀的引擎在待平台移植时,它的系统则是唯一需要做主要更改(扩加代码)的地方。我们把一个系
统分为若干个子系统,其中包括:图形(Graphics)、输入(Input)、声音(Sound)、记时器(Timer)、配置
(Configuration)。主系统负责初始化、更新、以及关闭所有的子系统。

图形子系统(Graphics
Sub-System)在游戏里表现得非常直观,如果想在屏幕上画点什么的话,它(图形子系统)便干这事儿。大多数来讲,图形子系统都是利用
OpenGL、Direct3D, Glide或是软件渲染(software
rendering)实现。如果能更理想一些,你甚至可以把这些API都给支持了,然后抽象出一个“图形层”并将它置与实现API之上,这将给了客户开发
人员或是玩家更多的选择,以获取最好的兼容性、最佳的表现效果。

输入子系统(Input
Sub-System)需要把各种不同输入装置(键盘、鼠标、游戏板[Gamepad],游戏手柄[Joystick])的输入触发做统一的控制接收处
理。(透明处理)
比方说,在游戏中,系统要检测玩家的位置是否在向前移动,与其直接地分别检测每一种输入装置,不如通过向输入子系统发送请求以获取输入信息,而输入子系统
才在幕后真正地干活(分别检测每一种输入装置),这一切对于客户开发人员都是透明的。用户与玩家可以非常自由地切换输入装置,通过不同的输入装置来获取统
一的行为将变的很容易。

声音子系统(sound system)负责载入、播放声音。该子系统功能非常简洁明了,但当前很多游戏都支持3D声音,实现起来会稍许复杂一些。

3D
游戏引擎中很多出色的表现都是基于“时间系统”(time)的。因此你需要一段时间来为时间子系统(Timer
sub-system)好好构思一番。即使它非常的简单,(游戏里)任何东西都是通过时间触发来做移动变化,但一份合理的设计将会让你避免为实现而一遍又
一遍地撰写大量雷同的控制代码……

配置系统(Configuration)位于所有子系统的顶端。它负责读取配置记录文件,命令行参数,
或是实现修改设置(setup)。在系统初始化以及运行期间,所有子系统都将一直与它保持通讯。切换图象解析度(resolution),色深
(color depth),定义按钮(key bindings),声音支持选项(sound support
options),甚至包括载入游戏,该系统将这些实现显得格外的简单与方便。把你引擎设计得更为可设置化一些,这将为调试与测试带来更大的方便;玩家与
用户也能很方便地选择他(她)们喜欢的运行方式。



Console (控制台)

哈!
我知道所有人都乐意去更风做一个象Quake那样的控制台(console)系统。但这的确是一个非常好的想法。通过命令行变量与函数,你就能够在运行时
改变你的游戏或是引擎的设置,而不需要重启。开发期间输出调试信息它将显得非常的有效。很多时间你都需要测试一系列变量的值,将这些值输出到控制台上要比
运行一个debugger速度显然要快得多。你的引擎在运行期间,一旦发现了一个错误,你不必立即退出程序;通过控制台,你可以做些非常轻便的控制,并将
这个错误信息打印出来。假如你不希望你的最终用户看见或是使用该控制台,你可以非常方便地将其disable,我想没人能看得见它。



Support (支持)


持系统(Support)在你引擎中任何地方都将被使用到。该系统包含了你引擎中所有的数学成分(点,面,矩阵等),(内)存储管理器,文件载入器,数据
容器(假如你不愿自己写,也可以使用STL)。该模块任务显得非常基础与底层,或许你会将它复用到更多别的相关项目中去。



Renderer/Engine Core (渲染/引擎 内核)

哈~是呀,所有的人都热爱3D图象渲染!因为这边有着非常多的不同种类的3D世界渲染方式,可要为各类拥有不同工作方式的3D图形管道做出一个概要描述也是几乎不可能的。

不管你的渲染器如何工作,最重要的是将你的渲染器组件制作得基化(based)与干净(clean)。

先可以确定的是你将拥有不同的模块来完成不同的任务,我将渲染器拆分为以下几个部份:可见裁减(Visibility)、碰撞检测与反馈
(Collision Detection and Response)、摄像器(Camera)、静态几何体(Static
Geometry)、动态几何体(Dynamic Geometry)、粒子系统(Particle
Systems)、布告板(Billboarding)、网格(Meshes)、天空体(Skybox)、光线(Lighting)、雾
(Fogging)、节点阴影(Vertex Shading)和输出(Output)。

其中每一个部分都得需要一个接口来方便地实现改变设置(settings)、位置(position)、方向(orientation)、以及其他可能与系统相关的属性配置。

即将显露出来的一个主要缺陷便是“特性臃肿”,这将取决于设计期间你想实现什么样的特性。但如不把新特色置入引擎的话,你就会发觉一切都将变的很困难,解决问题的方式也显得特别逊色。


有一件有意义的事便是让所有的三角形[triangles](或是面[faces])最终在渲染管道里经过同一点。(并非每次的每个三角形,这里讨论的是
三角形列表[triangle lists]、扇形[fans]、带形[strips]、等)
多花一些工作让所有物体的格式都能经过相同的光线、雾、以及阴影代码,这样就能非常便利地仅通过切换材质与纹理id就使任何多边形具有不同的渲染效果。

这不会伤及到被大量被渲染绘出的点,但是一旦你不当心,它可能会导致大量的冗余代码。

你也许最终便能发现,实现所有这些你所需的极酷效果可能只占了所有的15%左右的代码量甚至更少。这是当然的,因为大多数游戏引擎并不只是图形表现。



Game Interface (游戏介质)


个3D(游戏)引擎很重要的部分便是——它是一个游戏引擎。但这并不是一个游戏。一个真正的游戏所需的一些组件永远不要将它包含到游戏引擎里。引
擎与游戏制作之间的控制介质能使代码设计变得更清晰,应用起来也会更舒服。这虽是一些额外的代码,但它能使游戏引擎具有非常好重用性,通过设计架够游戏逻
辑(game logic)的脚本语言(scripting
language)也能使开发变的更方便,也可以将游戏代码置入库中。如果你想在引擎本身中嵌入你的游戏逻辑系统设计的话,大量的问题与大量修改一定会让
你打消复用这个引擎的念头。

因此,此时你很可能在思考这个问题:联系引擎与游戏的介质层到底提供了什么。答案就是控制
(control)。几乎引擎的每一个部分都有动态的属性,而该引擎/游戏介质层(engine/game
layer)提供了一个接口去修改这些动态属性。它们包括了摄像器(camera)、模型属性(model
properties)、光线(lights)、粒子系统物理(particle system physics)、声效播放(playing
sounds)、音乐播放(playing music)、输入操作(handling input)、切换等级(changing
levels)、碰撞检测以及反馈(collision detection and
response)、以及2D图形界面的顶端显示、标题画面等相关的东西。基本上来讲如果你想让你的游戏能优雅的实现这些元素,在引擎中置入这个介质层
(interface)是必不可少的。



The Game (游戏)

在这里,我无法告诉你如何去写你的游戏。这该轮到你发挥啦。如果你已经为你那令人赞异的引擎设计出了一套出色的介质层的话,我想在设计撰写游戏过程中一定会轻松许多。

3D游戏引擎设计是一项巨大的软件工程。一个人独立完成设计并撰写也并非不可能,但这不只是熬一两个晚上便能搞定的,你很可能会出写出几兆的源代码量。如果你没有持久的信念与激情,你很可能无法完成它。

当然,别指望你的第一次尝试就能写出完整的引擎,挑一个比较小的项目所需的小规模引擎去实现。按你的方式去努力工作,你就能到达成功。

22
Dec

世界500强(世界五百强)企业网站

   Posted by: sunwd   in 收藏

通用汽车公司 [英文] 戴姆勒-克莱斯勒公司 [英文] 沃尔-马特百货公司 [英文]
三井公司 [英文] 伊腾忠商社 [英文] 三菱公司 [英文]
埃克森公司 [英文] 通用电气公司 [英文] 丰田汽车公司 [英文]
皇家荷兰壳牌集团 [英文] MARRUBENI公司 [英文] 住友司 [英文]
国际商用机器公司 [英文] AXA公司 [英文] 花旗集团 [英文]
大众汽车公司 [英文] 日本电报电话公司 [英文] 日胜公司 [英文]
BP 阿莫科公司 [英文] 日本人寿保险公司 [英文] 西门子公司 [英文]
安联保险 [英文] ING集团公司 [英文] 美国邮政服务公司 [英文]
松下电器产业公司 [英文] 索尼公司 [英文] 波音公司 [英文]
美国电报电话公司 [英文] 菲亚特公司 [英文] 城市持股公司 [英文]
日产汽车公司 [英文] 莫比尔公司 [英文] 美洲银行公司 [英文]
通用保险股份公司 [英文] 联合利华公司 [英文] 本田汽车公司 [英文]
德意志行 [英文] 台市互助人寿保险公司 [英文] 惠普公司 [英文]
国家农场保险公司 [英文] 东芝公司 [英文] 联合利华公司 [英文]
汇丰控股有限公司 [英文] 富士通公司 [英文] 费巴集团公司 [英文]
西尔斯-罗巴克公司 [英文] 住友寿险公司 [英文] 雷诺公司 [英文]
德国电讯公司 [英文] 菲利浦电气公司 [英文] 东京电力公司 [英文]
苏黎世金融服务公司 [英文] NEC公司 [英文] 杜邦公司 [英文]
标致公司 [英文] RWE集团公司 [英文] 宝洁公司 [英文]
法国电力公司 [英文] 埃尔夫阿基坦公司 [英文] 帕斯奇塞纳蒙特银行 [英文]
宝马公司 [英文] ABN阿莫罗持股公司 [英文] 美林公司 [英文]
慕尼黑RE集团 [英文] 凯马特公司 [英文] 莱昂纳斯奥克斯公司 [英文]
美国谨慎保险公司 [英文] 埃尼公司 [英文] 中国石油化工集团公司 [英文]
农业信贷公司 [英文] 德士古公司 [英文] 美国国际集团公司 [英文]
法尼梅公司 [英文] 福蒂斯公司 [英文] 奇斯曼哈顿公司 [英文]
戴顿哈德逊公司 [英文] 康帕克计算机公司 [英文] 大西洋贝尔公司 [英文]
ABB阿斯那布劳恩勃沃里公司 [英文] TOMEN公司 [英文] 安隆公司 [英文]
加福尔公司 [英文] 巴斯夫公司 [英文] 摩根-斯坦利集团 [英文]
SBC通讯公司 [英文] 霍姆.德波特公司 [英文] 东京-三菱银行 [英文]
维亚哥公司 [英文] 三菱电气公司 [英文] 皮切尼公司 [英文]
UBS公司 [英文] 三星公司 [英文] 朗讯科技 [英文]
雪夫龙公司 [英文] 罗伯特博世公司 [英文] 摩托罗拉公司 [英文]
大都会寿险公司 [英文] 英国电信 [英文] 鲜京公司 [英文]
洛克希德马丁公司 [英文] 三菱汽车公司 [英文] 明治人寿保险公司 [英文]
联合技术公司 [英文] LIMITED公司 [英文] 克罗杰公司 [英文]
NICHIMEN公司 [英文] 巴黎国民银行 [英文] 法国电讯公司 [英文]
GTE公司 [英文] 日本产业银行 [英文] 默克公司 [英文]
圣斯伯里公司 [英文] 意大利电信 [英文] 沃尔沃汽车公司 [英文]
联合包裹服务公司 [英文] PDVSA公司 [英文] 英特尔公司 [英文]
现代公司 [英文] 第一银行公司 [英文] 阿尔斯塔特公司 [英文]
康格拉公司 [英文] 皇家与太阳联盟公司 [英文] 第一银行公司 [英文]
奥卡恩集团公司 [英文] 联合包裹服务公司 [英文] NICHIMEN公司 [英文]
沃尔特.迪斯尼公司 [英文] 隋福威公司 [英文] 伊东-八鹿岛公司 [英文]
西德意志土地银行 [英文] 科斯托克公司 [英文] 赫希斯特公司 [英文]
三井互助人寿保险公司 [英文] 强生公司 [英文] USX公司 [英文]
诺华制药公司 [英文] 爱立信公司 [英文] 蔡斯克鲁普公司 [英文]
埃尼尔公司 [英文] 德累斯登银行 [英文] CNP保险公司 [英文]
佳能公司 [英文] 里昂信贷公司 [英文] 阿尔卡特-阿尔斯通集团公司 [英文]
西格纳公司 [英文] 英格雷姆麦克罗公司 [英文] 南方贝尔公司 [英文]
中国银行 [GB] 中国工商银行 [GB] 三菱重工公司 [英文]
墨西哥石油公司 [英文] 国民威斯敏斯特银行 [英文] 百事公司 [英文]
KANSAI电力公司 [英文] 商业银行 [英文] 巴克莱银行 [英文]
萨拉.李公司 [英文] 卡特彼勒公司 [英文] 西日本铁路公司 [英文]
美国百货公司 [英文] 麦克逊公司 [英文] 第一联合公司 [英文]
弟阿格公司 [英文] 埃特纳人寿与意外伤害保险公司 [英文] 曼内斯曼公司 [英文]
国际造纸公司 [英文] 富士银行 [英文] 住友银行 [英文]
旭互助寿险公司 [英文] PG&E 公司 [英文] 普里伊萨格公司 [英文]
可口可乐公司 [英文] 纽约人寿保险公司 [英文] 旭化学工业公司 [英文]
拉勃银行 [英文] 西班牙电讯公司 [英文] 施乐公司 [英文]
三星电子公司 [英文] AMR公司 [英文] 莱曼兄弟控股公司 [英文]
戴尔电脑 [英文] 三和银行 [英文] 圣戈班公司 [英文]
伊里公司 [英文] 埃贡公司 [英文] 雷声公司 [英文]
北方电讯 [英文] 道氏化学公司 [英文] 东日本铁路公司 [英文]
SNCF公司 [英文] 皮诺特-普林特普集团公司 [英文] JUSCO公司 [英文]
联合保健公司 [英文] 斯坦德集团公司 [英文] 旭化学工业公司 [英文]
美国技术公司 [英文] MCI世界通讯公司 [英文] BCE公司 [英文]
BOUYGUES公司 [英文] UAL公司 [英文] J P.摩根公司 [英文]
约翰汉科共同寿险公司 [英文] 苏比维鲁公司 [英文] 布里斯托尔-迈耶斯-施贵宝公司 [英文]
诺威治联合公司 [英文] 哈利博顿 [英文] 富来第马克公司 [英文]
马来西亚石油公司 [英文] 布罗肯.希尔公司 [英文] 阿贝国家公司 [英文]
佛兰兹汉尼尔公司 [英文] 桥石公司 [英文] 金松公司 [英文]
大伊智贯鱼银行 [英文] 电子数据系统 [英文] 德意志巴恩公司 [英文]
阿歇丹尼尔斯.米德兰公司 [英文] AMP公司 [英文] 中分电力公司 [英文]
安田互助人寿保险公司 [英文] 瑞士再保险公司 [英文] 巴西银行 [英文]
卡西诺集团公司 [英文] 德意志邮政公司 [英文] 东京海事与火灾保险公司 [英文]
创意系统公司 [英文] 马自达汽车公司 [英文] 劳.加兹普罗姆公司 [英文]
阿尔卡公司 [英文] 阿尔伯特逊公司 [英文] 豪尔法克斯建筑会社 [英文]
沃尔格林公司 [英文] 联邦百货商店公司 [英文] 法国邮政公司 [英文]
拜里斯切国家银行 [英文] 拉格公司 [英文] 微软 [英文]
明尼苏达矿业与制造业公司 [英文] 巴西石油公司 [英文] 比尔鲍.维兹卡亚银行 [英文]
标准人寿保险公司 [英文] 帝国化学工业公司 [英文] 德尔海兹“利莲”公司 [英文]
德州公用 [英文] CVS公司 [英文] 日本石油公司 [英文]
伯灵顿北桑塔佛公司 弗来明公司 [英文] 高岛野公司 [英文]
三星人寿保险公司 [英文] 日本烟草公司 [英文] 米切林公司 [英文]
丹侬集团公司 [英文] 丽都公司 [英文] 曼公司 [英文]
大成公司 [英文] 三洋电气公司 [英文] 登索公司 [英文]
迪尔公司 [英文] 浦菲泽公司 [英文] 温-迪克斯百货公司 [英文]
伯格.布鲁斯威克公司 [英文] 诺基亚 [英文] 马克斯与斯宾塞公司 [英文]
柏林银行公司 [英文] 迈卡尔公司 [英文] 丰田通笑公司 [英文]
斯卡迪纳集团公司 [英文] 孝尔斯.迈耶公司 [英文] 美国家庭产品公司 [英文]
加拿大皇家银行 [英文] 蒙特迪生公司 [英文] 可口可乐 [英文]
埃默逊电器公司 [英文] 圣保罗IMI公司 [英文] 斯密斯克林比凯姆公司 [英文]
梅百货商店公司 [英文] 斯塔托尔公司 [英文] 葛阑素威康公司 [英文]
乔治亚-太平洋公司 [英文] 伯克夏哈撒韦公司 [英文] 利比蒂互助人寿保险公司 [英文]
新闻公司 [英文] 中国化工进出口公司 [英文] 因特撒银行 [英文]
日本捷运公司 [英文] 夏普公司 [英文] 汉莎航空集团公司 [英文]
伯特尔斯曼公司 [英文] 阿克佐诺贝尔公司 [英文] 达那公司 [英文]
华盛顿共同基金 [英文] 加拿大帝国商业银行 [英文] 国立澳大利亚银行 [英文]
泛加输油管道 [英文] 弗劳尔公司 [英文] 三井FUDOSAN公司 [英文]
固特异轮胎与橡胶公司 [英文] 伊斯特曼.柯达公司 [英文] 太阳互助人寿保险公司 [英文]
清水公司 [英文] 意大利联合信贷 [英文] 公用联合公司 [英文]
奥托邮购两合公司 [英文] 全国保险企业公司 [英文] 阿拉斯通公司 [英文]
KINGFISHER公司 [英文] 新闻公司 [英文] 雅培制药公司 [英文]
拉加德里集团公司 [英文] 多伦多自治领银行 [英文] 麦克唐纳公司 [英文]
法律通用保险公司 [英文] IBP公司 [英文] 美国西部公司 [英文]
维亚康姆公司 [英文] 洛拉尔公司 [英文] 金伯莱-克拉克公司 [英文]
东方电力公司 [英文] 日特爱德公司 [英文] LOWE’S公司 [英文]
DENTSU公司 [英文] 五十铃汽车公司 [英文] 苏格兰皇家银行 [英文]
菲利浦石油公司 [英文] 约翰逊控制公司 [英文] 银行家信托纽约公司 [英文]
安豪泽-布施公司 [英文] ASDA 集团公司 [英文] 施伦泊格 [英文]
英国邮政局公司 [英文] 隋神福威公司 [英文] 三菱化学公司 [英文]
电路城集团 [英文] 森特理克公司 [英文] 乌尔沃斯公司 [英文]
安田火灾与海事保险公司 [英文] 泰克国际公司 [英文] 凸版印刷公司 [英文]
北方钢铁联合公司 [英文] 日本航空公司 [英文] 高露洁公司 [英文]
联合太平洋公司 [英文] 汉高公司 [英文] 阿尔贝特公司 [英文]
法国天然气公司 [英文] 托斯克公司 [英文] 理光公司 [英文]
惠而浦公司 [英文] 德国冶金公司 [英文] 皮切尼公司 [英文]
武中公司 [英文] 特里斯特拉公司 [英文] 拉法日公司 [英文]
法国航空公司 [英文] 日本旅行局 [英文] 维尔豪泽公司 [英文]
加拿大电力公司 [英文] 佳迪尼.马瑟逊公司 [英文] 大众互助人寿保险公司 [英文]
艾里莉丽公司 [英文] KYUSHU电力公司 [英文] 阿第克公司 [英文]
旭玻璃公司 [英文] 克威尔内公司 [英文] 日本能源公司 [英文]
大日本印刷公司 [英文] 诺瓦斯考地亚银行 [英文] 乔治威斯顿公司 [英文]
埃德卡中心股份有限公司 [英文] OBAYASHI公司 [英文] 爱迪生国际公司 [英文]
太阳公司 [英文] 西格雷公司 [英文] 赤水住宅公司 [英文]
DDI公司 [英文] 富士重工业公司 [英文] 吉列公司 [英文]
王子造纸公司 [英文] 盖普公司 [英文] 住友电器工业公司 [英文]
乐喜金星电子公司 [英文] 卡斯达特公司 [英文] 意大利商业银行 [英文]
福顿公司 [英文] 德意志合作银行 [英文] 信念健康公司 [英文]
中国石油公司 [GB] 美国通用保险 [英文] 半岛东方汽船公司 [英文]
KAWASHO公司 [英文] 神户钢铁公司 [英文] 哈门那公司 [英文]
西北航空公司 [英文] 大西洋与太平洋茶叶公司 [英文] 浦项钢铁公司 [英文]
办公用品仓储商店 [英文] BEST BUY 公司 [英文] 耐克公司 [英文]
德古萨公司 [英文] 韩国电力公司 [英文] 施霸商业 [英文]
诺斯罗普.格鲁曼公司 [英文] 舰队金融公司 [英文] 川崎重工业公司 [英文]
圣保罗考司 [英文] 雪花牌牛奶产品公司 [英文] 苏格兰鳏寡基金 [英文]
理尔公司 [英文] 塞比公司 [英文] 亨氏 [英文]
大宇宙商店 [英文] 出光产业公司 [英文] 重建信贷机构 [英文]