`
webcenterol
  • 浏览: 943801 次
文章分类
社区版块
存档分类
最新评论

【转】【翻译】Orx官方教程:05.视口与摄像机 (viewport & camera)

 
阅读更多

本文译自 orx tutorials 视口与摄像机 (viewport & camera) 落后的簔羽鹤译。最新版本见Orx 官方中文Wiki 。 本文转自落后的簔羽鹤的博客 。原文链接在:http://blog.csdn.net/wind2006/archive/2010/07/07/5717831.aspx 。望有新人能够加入这个翻译者的队伍,早日将Orx的WIKI页中文化。有兴趣的请加入73063577,并与我取得联系,防止重复翻译。

综述

请阅读前面的基本教程 basic object creation(基本类创建),clock handling(时钟) ,fremes hierarchy(层次结构) 和 animations(动画)。

此教程显示了如何使用有多个摄像机的多视口技术。教程中将同时创建4个视口。

分别为左上角的(Viewport1),右下角的(Viewport4),它们共用一个摄像机 (Camera1),实现此功能,只需要在配置文件中配置2个视口的Camera属性,为同一个(也就是Camera1)。当我们使用鼠标的左右键旋转摄 像机(Camera1),left Control或left Shift键+方向键进行摄像机的缩放操作,关联的两个Viewport1和Viewport4将相应的发生变化。

右上角视口(Viewport2)是基于另一个摄像机(Camrea2),此摄像机的视锥较第一 个窄,所以显示时比例是其的两倍大。在教程的程序中,我们不能通过任何操作设置此视口。

最后一个视口(Viewport3)是基于Camera3的,Camera3的配置与 Camera1完全一样。

NB:当两个视口重叠,较先创建的将显示在顶层。

最后,有一个固定不动的箱子和一个世界坐标随着鼠标实时移动的小兵,也就是说无论如何设置视口的 摄像机,无论鼠标在那个视口上移动,小兵在它所属的视口中,相对于鼠标在在屏幕中的位置移动。

在配置文件中使用随机关键字符‘~’,使的视口和基本对象的颜色和大小可以随机创建。

NB:摄像机将它的坐标/缩放尺度/旋转存放在 orxFRAME 结构中,在[[frame|frame]]教程中我们看到他们是orxFrame继承体系的一部分。另一方面Object应该置于其Camera所关联的 Viewport中。

详细说明

通常我们需要首先载入配置文件,创建时钟和注册回调的Update函数,最后创建主要的Object信息。关于实现的详情,请联系前面的教程。

虽然这次我们创建了4个视口,却没有什么新东西,仅仅是以下4行代码。

pstViewport = orxViewport_CreateFromConfig("Viewport1");

orxViewport_CreateFromConfig("Viewport2");

orxViewport_CreateFromConfig("Viewport3");

orxViewport_CreateFromConfig("Viewport4");

正如你所看到的,我们只使用了 Viewport1的引用,以便后面进行操作。

让我们直接跳到Update函数的代码。

首先我们通过捕捉鼠标的坐标, 设置士兵的位置。我们已经在frame tutorial里实现过了。这里我们做了一样的事情,但在4个视口中工作的都很完美。当鼠标离开视口时,世界坐标的指针,将被orxNull值所代替, 也就不会触发士兵的移动了。

orxVECTOR vPos;

if(orxRender_GetWorldPosition(orxMouse_GetPosition(&vPos), &vPos) != orxNULL)

{

orxVECTOR vSoldierPos;

orxObject_GetWorldPosition(pstSoldier, &vSoldierPos);

vPos.fZ = vSoldierPos.fZ;

orxObject_SetPosition(pstSoldier, &vPos);

}

在操作视口之前,我们先关注下视口所关联的摄像机,我们可以移动,旋转和缩放它。获 取摄像机的代码如下所示:

pstCamera = orxViewport_GetCamera(pstViewport);

非常简单。让我们实现旋转。 ((其他方向仅仅只有部分代码,但是逻辑是一样的)).

if(orxInput_IsActive("CameraRotateLeft"))

{

orxCamera_SetRotation(pstCamera, orxCamera_GetRotation(pstCamera) + orx2F(-4.0f) * _pstClockInfo->fDT);

}

我们再次看到旋转的角度时间并 不依赖于FPS而且可以做时间的伸缩控制(译者注:比代码依然很简单。

现在让们来看看视口的数据配置情况。如慢动作) 因为用的是时钟的DT。

我 们再次看到旋转的角度时间并不依赖于FPS而是时钟的DT。我们也可以通过设置System这个配置选项来设置旋转速度,而不是使用硬编码。

实现缩放如下:

if(orxInput_IsActive("CameraZoomIn"))

{

orxCamera_SetZoom(pstCamera, orxCamera_GetZoom(pstCamera) * orx2F(1.02f));

}

因为这个代码没有使用时钟信息,所以他将会被时钟频率和帧率所影响。

最后让我们移动摄像机。

orxCamera_GetPosition(pstCamera, &vPos);

if(orxInput_IsActive("CameraRight"))

{

vPos.fX += orx2F(500) * _pstClockInfo->fDT;

}

orxCamera_SetPosition(pstCamera, &vPos);

好 了,与摄像机有关的先到这里吧。

在下面的配置中我们将看到,同一个摄像机被连接到两个不同的视口。操作摄像机将同时 影响两个视口。

我们可以直接修改视口的位置和尺寸,如下所示:

orxFLOAT fWidth, fHeight, fX, fY;

orxViewport_GetRelativeSize(pstViewport, &fWidth, &fHeight);

if(orxInput_IsActive("ViewportScaleUp"))

{

fWidth *= orx2F(1.02f);

fHeight*= orx2F(1.02f);

}

orxViewport_SetRelativeSize(pstViewport, fWidth, fHeight);

orxViewport_GetPosition(pstViewport, &fX, &fY);

if(orxInput_IsActive("ViewportRight"))

{

fX += orx2F(500) * _pstClockInfo->fDT;

}

orxViewport_SetPosition(pstViewport, fX, fY);

如上 所示,没有什么惊奇的,非常简单。

让我们来接着看看 viewport的配置方面的东西。

[Viewport1]

Camera = Camera1

RelativeSize = (0.5, 0.5, 0.0)

RelativePosition = top left

BackgroundColor = (0, 100, 0) ~ (0, 255, 0)

[Viewport2]

Camera = Camera2

RelativeSize = @Viewport1

RelativePosition = top right

BackgroundColor = (100, 0, 0) ~ (255, 0, 0)

[Viewport3]

Camera = Camera3

RelativeSize = @Viewport1

RelativePosition = bottom left

BackgroundColor = (0, 0, 100) ~ (0, 0, 255)

[Viewport4]

Camera = @Viewport1

RelativeSize = @Viewport1

RelativePosition = bottom right

BackgroundColor = (255, 255, 0)#(0, 255, 255)#(255, 0, 255)

一共有3个摄像机,它们关联了4个视口,其中Camera1关联了 Viewport1和Viewport4。

我们注意到Viewport1的配置文件中relativeSize设置为 (0.5,0.5,0).它代表的意思在x轴和y轴方向上分别使用一半的显示尺寸(z轴被忽略)。也就是说,任何一个视口实际上显示部分的内容是可调的, 可以是全屏或者非全屏。

接下来我们注意到其他视口的RelativeSize属性被设置成@Viewport1。它的意 思是RelativeSize属性继承Viewport1的RelativeSize属性,也就是说它们的RelativeSize属性和 Viewport1的RelativeSize属性一样。我们也可以看到Viewport4的Camera属性被设置成@Viewport1,表明它继承 自Viewport1的摄像机。

为了避免视口在屏幕中互相重叠遮盖,我们可以设置RelativePosition属性为常量字 符或者使用vector(向量)设置它们的合理位置。

最后前三个视口使用随机的红色作为背景颜色,设置如下:

BackgroundColor = (200, 0, 0) ~ (255, 0, 0)

如果我们希望通过准确的随机颜色进行设置,可以使用一下列表的形式设置,随机的颜色 分别为黄、青和品红,设置如下:

BackgroundColor = (255, 255, 0)#(0, 255, 255)#(255, 0, 255)

这种使用方式是相当于在三个颜色(黄色,蓝绿色,品红)中进行随机。

最后让我们关注摄像机的设置。

[Camera1]

FrustumWidth = @Display.ScreenWidth

FrustumHeight = @Display.ScreenHeight

FrustumFar = 1.0

FrustumNear = 0.0

Position = (0.0, 0.0, -1.0)

[Camera2]

FrustumWidth = 400.0

FrustumHeight = 300.0

FrustumFar = 1.0

FrustumNear = 0.0

Position = (0.0, 0.0, -1.0)

[Camera3@Camera1]


基本属性frustum(视 锥),被摄像机所拍摄的世界空间的一部分,将被映射到视口显示。

NB:使用2D摄像机视锥的形状是 长方体

我们可以发现Camera3完 全继承自Camera1,它没有覆盖Camera1的任何属性。

NB:使用完全继承所有属性可以写成: [MySection@ParentSection]。

为什么实用两个不同的摄像头呢?仅仅因为可以有 两个不同的物理实体(physical entities):我们在代码中修改了Camera1的属性,而 Camara3将保持不变。

我们注意到Camera1的 FrustumWidth和FrustumHeight属性继承自Display的屏幕设置。

NB: 当继承某个属性,可以写成MyKey = @ParentSection.ParentKey.当两个key一样时,其中父选关键字可以省略如:SameKey = @ParentSection.

最后我们注意到Camera2具有较小的视锥。

也就是说Camera2只能看 到世界空间的较小部分。所以视口看起来具有了放大的效果。

资源

源代码: 05_Viewport.c

配置文件 05_Viewport.ini

1)very useful for making HUD & UI, for example

在HUD和UI中很有用

2) 其他方向仅仅只有部分代码,但是逻辑是一样的

3)composed of keywordstop,bottom,center,rightandleft

由关键字 top,bottom,center,right和left组成

4)the '~' character is used as a random operator between two numeric values

'~' 字符被用在两个数字之间,作为随机操作符

分享到:
评论

相关推荐

    Orx游戏引擎源码

    6. **编译与构建**:`bin` 目录下的文件和子目录可能包含了不同平台的可执行文件和库,这些是Orx在不同平台上运行所需的,反映了Orx的跨平台能力。 7. **授权协议**:`COPYRIGHT` 和 `LICENSE` 文件分别指明了Orx的...

    orx-install:ORx安装脚本

    什么是ORx? ORx的名称为“ Oh-Rex”,代表Outernet ReceiverX。“ X”代表自制设备。支持的设备和配置请注意,Raspberry Pi v1是目前唯一受支持的版本。 v2具有不支持的ARM v7处理器。 此存储库中的脚本支持以下...

    Orx: Portable Game Engine:Orx:便携式游戏引擎-开源

    Orx是一款强大的便携式游戏引擎,专注于2D游戏开发,以其轻量级、灵活性和易用性而受到开发者们的欢迎。作为一个开源项目,Orx提供了完全透明的源代码,鼓励社区参与,促进了代码的持续改进和创新。 Orx的核心设计...

    非典型2D游戏引擎 Orx 源码

    7. **脚本系统**:Orx 支持Lua脚本语言,让游戏逻辑可以与引擎分离,便于非程序员进行游戏逻辑编写。 8. **对象和类系统**:Orx 的实体-组件系统使对象能够根据需要组合不同的属性和行为,实现高度的复用和灵活性。...

    PELCON万用解码器使用说明.docx

    PELCON万用解码器是一款专为硬盘录像机和其他监控主机设计的前端控制设备,其主要功能在于实现对室内外云台、电动变焦镜头、摄像机电源、灯光、雨刷等辅助设备的精确控制。该解码器采用RS-485通讯方式,并能兼容多种...

    Suz-OrX-archive-refs-heads-master.zip

    标题"Suz-OrX-archive-refs-heads-master.zip"似乎是一个Git仓库的归档文件,通常包含了一个Git仓库在特定提交点的所有文件和目录。这种类型的文件经常用于代码备份、版本控制或者分享代码库。"refs-heads-master...

    IISURL重写组件(中文版)32位、64位rewrite_x32orx64_zh-CN.

    **IIS URL重写组件的功能与应用** 1. **URL规范化**:确保每个页面只有一个唯一的URL,避免由于多种访问方式导致的重复内容问题。 2. **SEO优化**:通过将动态参数转换为易于理解的静态URL,提升搜索引擎的抓取效率...

    C#实现类似淘宝图片局部放大功能源码.rar_C#图片放大_C#实现类似淘宝图片局部放大功能源码_Orx

    8. **测试与调试**:提供测试用例和调试建议,帮助理解代码并确保功能正确无误。 9. **整合进项目**:说明如何将这个功能集成到现有的C#应用程序中,可能包括引入必要的依赖和设置项目配置。 通过对这些知识点的...

    sublime-text-orx:ORX配置对崇高文本的支持

    ORX配置对崇高文本的支持 ... Orx为游戏开发提供了完整的框架,目前可在Windows(mingw和使用Visual Studio的本机),Linux(x86 / x86_64),MacOS X(ppc / x86),iPhone / iPod Touch / iPad和Android上运行。

    易语言4行代码实现ASCII转UniCode.zip

    在"易语言4行代码实现ASCII转Unicode"的项目中,我们关注的核心知识点是如何在易语言中用极少量的代码实现字符编码的转换。 ASCII(美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统,最初只使用7位二进制...

    解决win8 richtx32.ocx

    这是因为64位版本的Windows操作系统与32位组件之间存在兼容性问题,或者原有的richtx32.ocx文件已被损坏或缺失。 解决这个问题的方法有多种: 1. **重新注册ocx文件**:首先,你可以尝试在命令提示符下以管理员...

    ocaml-orx:Orx游戏引擎的OCaml绑定

    ocaml-orx-OCaml与Orx游戏库的绑定 是“一个开源,可移植,轻便,基于插件,数据驱动且非常易于使用的2D导向游戏引擎。” Orx本身是用C编写的。 该存储库提供绑定以使用OCaml中的Orx。 声音,图形,物理,输入处理...

    PELCON万用解码器使用说明.doc

    PELCON万用解码器是一款专为硬盘录像机和其他监控主机设计的前端控制设备,其主要功能包括控制室内外的云台、电动变焦镜头、摄像机电源、灯光以及雨刷等辅助设备。该解码器通过RS-485通信方式工作,并能兼容所有控制...

    rewrite_x32orx64_zh-CN

    **标题解析:** "rewrite_x32orx64_zh-CN" 这个标题表明这是一个针对中文用户(zh-CN)的关于“rewrite”技术的软件包,它同时提供了32位(x32)和64位(x64)版本的解决方案。"rewrite"通常指的是URL重写技术,用于管理...

    西门子PLCSTL编程小手册范本.doc

    - **LDBx/ABx/OBx/LDWx/AWx/OWx/LDDx/ADx/ODx/LDRx/ARx/ORx**: 用于比较两个数值,并根据比较结果设置输出。 - **NOT**: 对栈顶值取反。 - **EU/ED**: 用于检测上升沿和下降沿。 3. **逻辑控制指令**: - **=**...

    matlab中拟合中心线的代码-OrX:MatLab代码用于拟合定向膜脂质的31-PMAS旋转边带模式

    matlab中拟合中心线的代码关于OrX程序的注意事项: 最初由SR Kiihne撰写,2004年2月24日 定向的MAS nmr光谱 我最初是在来自Bruker实验的光谱上对此进行测试的:jr0203#22-26这些是31P MAS光谱,其自旋速率为500-...

    MSCOMCTL.OCX 64位

    Run-time error '339': Component 'MSCOMCTL.OCX' or one of its dependencies not correctly registered:a file is missing or invalid. win8操作步骤 ①解压压缩包 ②将解压出来的文件,剪切至 ...

    EPORNER 2.COM%20-%20[bpM0orx6f9R]%20

    EPORNER 2.COM%20-%20[bpM0orx6f9R]%20

    arcgis 10 图框工具5.2

    《ArcGIS 10 图框工具5.2详解与应用》 ArcGIS 10 图框工具5.2是一款专为ArcGIS 10及10.1版本设计的图框生成工具,它极大地简化了地图制图过程中的图框制作步骤,提高了工作效率。作为一款共享软件,它鼓励用户支持...

    Bernese5.0指导算例

    该campaign涉及了来自欧洲八个IGS(国际地球自转与参考系服务)站点的数据,这些站点均配备有GPS接收器,并有部分站点同时跟踪了GPS和GLONASS卫星信号。 3. 课程内容和结构 教程内容详细划分为星期一至星期五的各个...

Global site tag (gtag.js) - Google Analytics