博客年龄:17年10个月
访问:?
文章:1610篇

个人描述

梦想是做一辈子的游戏设计,前5年执着于实现和制作,后5年开始每天探讨游戏设计哲理,人生哲理。如今,下定决心,有生之年,多做几款又好玩又畅销的游戏!

摄象机接口的设计

2008-07-19 18:11 阅读(?)评论(0)

云风日志里的载录,最近被程序忽悠过这方面的内容,算是学习一下:

作为 3d engine ,我们设计者就应该严格的考虑每个功能到底应该提供怎样的接口给人使用。可以最佳的满足问题解决的需要。作为 3d engine 的实现者,我们满脑子可以是矩阵变换、空间矢量、线性代数这些东西。但一旦反应到使用人的一边,这些就不再应该是他们描述问题的语言。engine 需要做的就是隐藏这些细节,换一种方式提供出来。又不能失去使用上的灵活性(比如只能做 RTS 而不能用于 fps)。

下面谈谈最近在做的摄像机的接口。尚未定型,暂作记录。

对于 3d api 来说,摄象机就是绝对空间中一个矢量,有绝对空间坐标和朝向。再加上焦距等一系列属性,便可以描述出要渲染的视野。

但对于要解决的问题(一个可以玩的游戏)来说,这不是合适的描述语言。我们关注的摄象机其实可以是一个实体,它在存在于虚拟世界空间中,它自身的位置往往相对于虚拟场景中的另一个实体,而非以世界绝对坐标的形式提供。比如是 fps 游戏,摄象机可能在主角的身后;对于 RTS ,它在地面的上方;对于赛车,它在驾驶位;对于 日式 RPG 它可能固定在场景中由编辑器预先设定好的位置上,等等。

所以,摄象机只需要绑定在虚拟场景中的一个物件上即可。或者它本身就是一个(不可被渲染的)虚拟物件。

而摄象机的朝向呢?

设置它的朝向不应该让使用者提供一个矩阵,这会让人不知所措。在逻辑表达中,大多数情况下,我们只需要让摄象机指向一个物体即可(对于引擎,还要进一步跟踪这个物体,而不需要每个渲染帧都要求使用者不停的刷新摄象机的状态)。这个物体可以在虚拟世界中真实存在,也可以是一个不被渲染的虚拟物体。比如 FPS 游戏中,我们可以让摄象机指向主角面前 10 米远的地方的虚拟物体。

少数时候,我们需要让摄象机指向一个坐标值(往往在写 demo 的时候用)。当然,我们可以排除后一种情况,当需要让摄象机指向一个特定坐标的时候,我们可以为在这个坐标点上创建一个虚拟物体(如同上一段中提示的 fps 游戏的摄象机设计)。但,我们只需要的是物体的坐标不是?而不是需要物体的全部。

这是一个典型的,可以用面向对象方法解决的问题。我们需要的是:具有获取坐标能力的东西,不管它是什么。

所以,我们可以给虚拟世界中的物件都提供一个方法,这个方法可以取出一个接口,一个获取特定坐标的接口。注意,“取出一个接口”在 C++ 中可以让对象继承这个接口的方式提供出来,但不一定必须如此(如果有 gc 的机制,临时创建一个仅含有这个接口的对象更加方便)。如果在 COM 中,那么就是调用 QueryInterface 得到。实现手法并不重要。

这样一个接口背后的实现需要做的事情是,获取自己相对一个指定坐标系的相对位置。它有可能得到一个非法的相对位置。这是因为,对象本身和目标可能并不在一个世界中。

如果我们需要指定一个特定坐标,可以做一个特别的实现封装一组矢量:比如,将一个位置信息绑定在主角面前 10 米处。

转自:http://blog.codingnow.com/2008/06/camera_interface.html#more

 

   阅读(?)评论(0)
 
表  情:
加载中...
 

请各位遵纪守法并注意语言文明