企业服务***:010-
分类:||||||
| 找简历 | 找招聘会
新功能体验区
热门职位招聘:
3D游戏地图招聘信息
3D游戏地图最新招聘信息
3D游戏地图招聘频道为用户提供大量的3D游戏地图招聘信息最新3D游戏地图招聘信息,感谢您使用3D游戏地图招聘平台
最新职位招聘:
最新行业招聘:
根据城市搜索招聘信息:
根据产品搜索招聘信息:
根据职位搜索人才简历:
根据城市搜索人才简历:
版权所有: &
相关网站:Copyright &
&&人才中介服务许证RC0712292
京公网安备21Google打造3D完整世界地图 将有望用于游戏设计
Google即将打造以Android为作业系统的实验原型机,用来描绘真实世界的立体空间地图,让扩增实境(AR)等运用可以进化到崭新的境界。这项计划名为“Project Tango”,由曾参与开发Kinect技术的Johnny Lee主导。这部机器有着特制的硬件架构与摄影机,让携带这台手机的使用者可以完整透过摄影机,在虚拟世界中描绘真实世界的样貌。
Google指出,这项计划的主要目的是要打造一个更完善的世界地图,与此同时这项技术也可以被应用在游戏设计上。
Project Tango的主导者Johnny Lee表示:“这项计划的目的,是希望移动设备通过人们的视角,去了解空间及动作的概念”。
据了解,Google预备在今年3月将200台原型机送至有意愿将这个技术应用到制作地图工具、游戏应用,或是开发新算法的开发者手中。对于这一领域有兴趣的玩家即日起也可至官网注册申请加入。
Project Tango的概念主要是透过一个可以捕捉动态影像的摄影机以及景深感应器,让手机回传的资料有助于打造更加准确的3D立体地图。初期这项计划的目标,是希望可以建立更加精确的室内空间地图,未来也可望将这个技术应用到扩增实境的游戏,或是帮助视力受损的残障人士规划更加精确的导航路线。
值得注意的是,“Project Tango”主导者Johnny Lee先前在这项领域就已尝试进行过许多有趣的实验,其中包括以简单的摄影机及Wii动态侦测器,来让电视中的影像根据自己所在的位置进行运算,进而打造出一个虚拟的3D立体视觉画面。除此之外,他也曾经协助微软开发 Kinect的动态捕捉技术。
您可能还喜欢
近日谷歌正在邀请一些 YouTube 明星和其他创作者,为旗下虚拟现实平台 Daydream 生产独家内容,据悉该平台将在未来数周内后推出。
韩国开发商Maverick Games表示他们非常关心日本市场,所以预计将于2016年,在日本推出它们的RPG手游新作《信天翁计划》,并表示:“让玩家能有在真实世界中探险的体验”。
2017腾讯游戏家盛典于10月15日在海南三亚举办,现场发布了全新的腾讯游戏全用户平台“腾讯游戏家”。
由网易代理《狼人杀-官方唯一正版》发布会于今日14:00在上海举行,电竞女神小苍率主播天团空降现场。
繁华世界只玩不同
扫描二维码
下载differ客户端
热门搜索:
广州联亿网络科技有限公司
Copyright 2009- Inc. All rights reserved.
地址:广州市天河区天河路490号壬丰大厦1801
***:020-地图的数据以及区域的信息是场景的重要组成部分,这些数据同时存在客户端和服务器,而且都是由编辑器生成的。那么保存的文件数据结构是怎样的?一张3D的场景地图又是怎样处理这些数据的?同时告诉大家这里同样只是讲的理论与设计,理论和设计往往都很空洞,但是却很灵活,需要靠每个人怎么运用。
区域和格子
& 从上面的截图可以看出游戏场景其实是由格子来区分的,不管是矩形的格子还是其他形状的格子也好,一张地图不可能只有一个点(即多点组成一张地图)。在3D场景中似乎格子的位置总伴随着高度信息,所以让人感觉有些迷茫,其实我们可以将这些格子平铺成一张图。
& 如上面的最后一张图,是地形的剖面图,不过是横切面,如果我们看一下纵切面的话,就可以将3D的地图进行2D的转换。其实地图还是由一张平面图组成,只是多了Y轴的数据,也就是我们常说的地表高度。
&&由指定格式的数据组成,在服务器和客户端的主要作用是用来寻路(点击地图走路,以及自动寻路)。
&&一个场景一般情况下会有区域的划分,因为这些区域会有自己特殊的事件,如一个玩家加入该区域会产生某个事件,就像我们玩游戏的时候忽然触发了剧情一样,这都是区域的事件。
&&有了指定的数据结构后,文件才能被正常的读取,而地图的数据一般是由编辑器生成,所以也必须规定文件的数据结构。
& & 1.&文件数据
& & & 武侠世界/天龙八部的场景地图数据格式为:[文件头][单元数据][单元数据]&& 单元数据的数量为地图横长* 地图纵长。
& & & &code.
typedef struct map_header_struct {
int16_ //文件标记,用来区分是不是地图数据文件
int32_ //X方向大小 横长
int32_ //Y方向大小 纵长
} map_header_t; //文件头信息
typedef struct map_unit_struct {
int16_ //标识信息
||_ WalkDisable
-是否禁止地面上行走的OBJ穿越
1不可穿越]
|__ FlyDisable
-是否禁止空中飞行的OBJ穿越
1不可穿越]
int8_ //高度
int8_ //预留字段
} map_unit_t; //单元数据信息
& & 2.&对象数据
& & &整个对象也就是整张地图的数据,在武侠世界/天龙八部中采用的是左手坐标系,而在服务器其实用不着空间的坐标也就是Y轴的数据,将地图切割后就是一张平面的图,这张平面的图一般都是矩形。
& & &X坐标&左为0、右为最大(也可以说是地图横长)
& & &Y坐标 上为0、下为最大(也可以说是地图纵长)
& & &code.
/* 完整的地图示意图 */
___________
|_________|
& &&地图划分成一个个格子,而组成区域的也是格子,以下为一个区域的基本数据。
& & 1.&RECT(矩形格子)
& & &&left 左、top 高度、right 右、bottom 底部。
& & 2.&区域ID
& & 3.&脚本ID
算法(选择排序)
& 1、简单选择排序
& &&简单选择排序基本思想是将最小的数据移动到第一个位置并交换数据,比如有N个元素,一次将最小的元素移动到第一个位置并交换数据,那么剩下的就只剩下N-1个数据,将剩下的N-1的序列的数据最小的数据移动到该剩下序列的第一个位置,这样移动N次之后,序列便成了有序的序列。
#include &stdio.h&
#include &stdint.h&
#include &inttypes.h&
* 简单选择排序基本思想是将最小的数据移动到第一个位置并交换数据,比如有N个元素,
* 第一次将最小的元素移动到第一个位置并交换数据,那么剩下的就只剩下N-1个数据
* 再将剩下的N-1的序列的数据最小的数据移动到该剩下序列的第一个位置,这样移动N次
* 之后,序列便成了有序的序列。
//简单选择排序
void selectsort(int32_t array[], int32_t length);
//数组打印
void displayarray(int32_t array[], int32_t length);
int32_t main(int32_t argc, char *argv[]) {
int32_t array[] = {32, 1, 6, 9, 37, 88, 47, 35, 99};
int32_t length = sizeof(array) / sizeof(array[0]);
selectsort(array, length);
printf("sort result: ");
displayarray(array, length);
void selectsort(int32_t array[], int32_t length) {
int32_t i, j,
//将第i个元素与第i+1...length个元素比较,将最小的元素放在第i个位置
for (i = 0; i & length - 1; ++i) {
for (k = i + 1; k & ++k) { //最小元素的序号为j
if (array[k] & array[j])
if (j != i) { //如果序号i不等于j,则需要加序号i和序号j的元素交换
temp = array[i];
array[i] = array[j];
array[j] =
printf("the %d times sort result: ", i + 1);
displayarray(array, length);
void displayarray(int32_t array[], int32_t length) {
for (i = 0; i & ++i)
printf("%4d", array[i]);
printf("\n");
& & result.
& 2、堆排序
& &&堆排序算法实现比较复杂,它主要适用于大规模的数据排序,比如在10万个数据元素中找出前10个最小或是最大的元素,使用该算法效率最高。
#include &stdio.h&
#include &stdint.h&
#include &inttypes.h&
* 堆排序算法实现比较复杂,它主要适用于大规模的数据排序,比如在10万个数据元素
* 中找出前10个最小或是最大的元素,使用该算法效率最高。
//数组打印
void displayarray(int32_t array[], int32_t length);
//调整array[pos1...pos2],使其成为一个大顶堆
void adjustheap(int32_t array[], int32_t pos1, int32_t pos2);
//创建大顶堆
void createheap(int32_t array[], int32_t length);
//利用堆排序算法对数组进行排序
void heapsort(int32_t array[], int32_t length);
int32_t main(int32_t argc, char *argv[]) {
int32_t array[] = {32, 1, 6, 9, 37, 88, 47, 35, 99};
int32_t length = sizeof(array) / sizeof(array[0]);
printf("before sort: ");
displayarray(array, length);
heapsort(array, length);
printf("after sort: ");
displayarray(array, length);
void displayarray(int32_t array[], int32_t length) {
for (i = 0; i & ++i)
printf("%4d", array[i]);
printf("\n");
void adjustheap(int32_t array[], int32_t pos1, int32_t pos2) {
temp = array[pos1]; //临时存放根节点
for (i = 2 * pos1 + 1; i &= pos2; i *= 2 + 1) {
if (i & pos2 && array[i] & array[i + 1]) //从关键字较大的子节点向下筛选
++i; //i为关键字较大的节点的下标
if (temp & array[i]) break; //如果子节点的值小于根节点的值,则不进行交换
array[pos1] = array[i];
array[pos1] = //将根节点插入到正确的位置
void createheap(int32_t array[], int32_t length) {
for (i = length / 2 - 1; i &= 0; --i) //从序号length / 2 - 1开始建立大顶堆
adjustheap(array, i, length - 1);
void heapsort(int32_t array[], int32_t length) {
createheap(array, length); //创建堆
for (i = length - 1; i & 0; --i) { //将堆顶元素与最后一个元素交换,重新调整堆
temp = array[0];
array[0] = array[i];
array[i] =
printf("the %d sort times: ", length - i);
displayarray(array, length);
adjustheap(array, 0, i - 1); //将array[0...i-1]调整为大顶堆
& & result.
阅读(...) 评论()