【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 3117|回复: 4

【集合贴】地图编辑器的编写

[复制链接]
发表于 2006-12-8 14:58:48 | 显示全部楼层 |阅读模式
主  题:
地图编辑器的编写
目前我所知道的地图有以下两种方法制作

一,用地图编辑器拼结
    首先画好地图元素,然后裁剪成菱形小块,最后用地图编辑器拼结这些规格的小块
    问题:如何实现无缝拼结?
    1:画好不同块间的过度块,用地编拼结
    2:用算法实现(象帝国,星际等的地编都是如此,不过之前好象也要作好过度元素)

二,使用整屏地图
    象〈〈吕布与貂禅〉〉,之中好象有很多地图都是用整屏的图片的,是吗?
    如果能够使用整屏的图片,那如何实现层次遮挡????????

这些我也不知道是不是对的,望高手指教。并指点一些经典的相关网站、资源给我看看,学习学习,急着写地编,没有什么好的参考资料,望不吝赐教。谢了

回复人: skull() ( ) 信誉:100 2003-04-27 19:24:30z 得分:10
?
前阵子我写的一篇文章,希望对你有帮助。

主题:3d地形相关技术

* 地形纹理
大概分两种类型:rts型和fps型

**第一种:rts型。
和二维做法差不多,把地图分为很多block,每块block可能又由m*n个tile组成。每块block使用一张纹理。适合rts等俯视类型游戏,《魔兽3》、《魔域帝国》用到。
优点:图像精细,适合表现细致的场景。
缺点:渲染时纹理切换频繁。没法做大面积lod(level of detail),lod被限制在block内。由于block边缘顶点纹理坐标问题,导致block间没法共用顶点。

地貌间过渡处理: 如草地过渡到土地,简单的方法是让美术做好所有可能用到的不同地貌过渡的图片,程序计算拼接。复杂点的做法是程序计算纹理融合,在渲染是用多层纹理来解决过渡问题,《empire earth》,《c&c将军》使用类似做法。

特效处理:
水深效果:使用顶点色形成水下体积雾效果。

**第二种:fps型。
整个地形用一张基本纹理(如:1024*1024)铺满,这张纹理是由程序计算生成(terrain texture generation)。适合室外大场景游戏,如室外fps,飞行模拟。《battle field 1942》用到。
优点:任意的lod范围。无纹理切换问题。可以把计算好的地形lightmap融入基本纹理,一次渲染。
缺点:图像精度不够,解决方法是在渲染时上面加一层细节贴图,如:bumpmap,《ground control》用到。

*下面是一些常见的问题

**纹理生成计算方法
基本纹理每点像素由所处的海拔高度和坡度约束计算而得。可以理解为有一张横坐标为高度,纵坐标为坡度的纹理表,每点像素查表而来。资料见后。

**地形lightmap
明暗(shading):首先计算每个顶点的平均法向量,注意是共点平面的平均法向量,而不是某个面的法向量,然后用你的光照模型计算公式计算该点光照强度,如:i = cos<light,normal>*isun + ambient。顶点间光照用插值计算,如法向插值phong算法。
阴影(shadow):没看到太好的算法,一般光线求交算法速度太慢,目前我的想法是用硬件
作shadowvolume,渲染到一张纹理,然后保存。如果你有好的方法请告诉我。

**物体阴影
对静态物体,如房屋可事先渲染好融入terrain lightmap。
对动态物体,可用projection shadow,简单说就是从光源方向把物体影子渲染到一张纹理,然后通过使用纹理坐标生成(texcoordgen)和修改相应texture coordinates matrix,把这张图贴到地面渲染。

**地形渲染
用indexed方式按块渲染,注意顶点提交顺序,增加gpu vertex cache命中率。如果有lod,因为每次顶点数据是变化的,d3d实现时用dynamic vertex buffer,把顶点放入agp内存。

**lod(level of detail)
roam算法不适合现代硬件加速显卡,不要用。
可以看一下geommipmap lod和t-strip lod。网址见后。

**射线与地形求交算法
把射线垂直投影到2d地面网格,顺着射线方向检测经过的每个格子,如果光线在格子里面的最低处大于格子四个顶点的最高处,则不可能有交点。

资料:
t-strip lod: http://chat.carleton.ca/~eszoka/tstriplod/tstrip.htm
geomipmap lod: http://www.flipcode.com/tutorials/geomipmaps.pdf
terraintexturegenerator(full source code):http://www.insanesoftware.de/index.php?page=freetools/terrain.php

my email: skull@hardcore3d.net  

top
回复人: renxiaoyu(一条直线,一个目标) ( ) 信誉:97 2003-04-27 19:48:22z 得分:0
?
for my friend-skull,
up,up,up
 楼主| 发表于 2006-12-8 14:59:11 | 显示全部楼层
top
回复人: aben_king(笨蝌蚪(qq11313693)) ( ) 信誉:100 2003-04-28 12:48:51z 得分:0
?
up
top
回复人: tao637(彼岸) ( ) 信誉:100 2003-04-28 22:43:51z 得分:0
?
消化先,等有疑问了。给你发邮件或是跟帖,谢了
top
回复人: tao637(彼岸) ( ) 信誉:100 2003-05-03 10:08:44z 得分:0
?
skull()兄,我需要的是针对2d图形的地图编辑器,目前大家正在关于争论中:关于使用矩形块还是使用菱形块实现45度斜视角?没有结果。
我们几个意气相投,第一次在游戏开发这个领域学习、研究和实践,没有经验和缺乏技术,所以,我们不知道使用矩形块还是使用菱形块实现45度斜视角孰好孰坏,存在什么技术上的难点和对将来整个游戏的开发会有什么样的作用和影响。望大家不吝赐教,谢过了。
 希望大家能给些参考资料和网址连接,我们需要这些。
top
回复人: 970361(是猫就应该抓老鼠) ( ) 信誉:93 2003-05-03 16:32:29z 得分:0
?
收藏
top
回复人: noslopforever(古老意念) ( ) 信誉:105 2003-05-03 17:14:16z 得分:0
?
一开始可以先试试矩形块吧,毕竟遮挡算法比较简单。做出来一个小游戏后再转菱形也不迟
top
回复人: nonocast(如果没有如果) ( ) 信誉:104 2003-05-06 08:09:40z 得分:0
?
可以去www.gpgame.net下个《圣剑英雄传ii》源代码参考一下,很不错的,说不定直接就能借鉴
----------------------
            may you succeed!
                   -----------------
top
回复人: powgu(古尔) ( ) 信誉:99 2003-05-07 17:58:36z 得分:0
?
up up。。。。。。。。。学习。
top
回复人: tao637(彼岸) ( ) 信誉:100 2003-05-07 19:32:30z 得分:0
?
用矩形块?
试试先。。。。。。。。。。。。。。。。。。。。。。。
谢过了!
top
回复人: skull() ( ) 信誉:100 2003-05-07 19:39:21z 得分:0
?
tao637(彼岸):
2d方面我没什么经验,记得以前看过一篇关于斜45度地图方面的文章,中文的,你找找吧。其实用3d渲染来做2d游戏也可以,有可能还是学习一下3d。
top
回复人: tao637(彼岸) ( ) 信誉:100 2003-05-07 19:44:49z 得分:0
?
我很欣赏星际和帝国的地编,不知哪为仁兄能分析分析他们实现的机制?

我们几个家伙现在状态很不佳,面对这样难以解决的问题,欲步不前了,只是疯狂的玩游戏,郁闷中。。。。。。。。。。
也许是面对问题,退缩了。有时候感叹我们这些年轻人怎么就没有一股冲劲?现在课都没有上,讨厌学校的那些老师,一个一个误人子弟。多希望能有些良师益友,大家共同学习,共同进步呀!
感谢大家对这个话题的关注,也希望你们一如既往的关注下去。

努力中。。。。。。。。。。。
 楼主| 发表于 2006-12-8 14:59:23 | 显示全部楼层
top
回复人: noslopforever(古老意念) ( ) 信誉:105 2003-05-09 19:51:11z 得分:5
?
其实星际和帝国就是斜45度视角的游戏,就是菱形块游戏,其实如果仔细研究的话,也不是特别复杂,一个星期撑死了。
关键不在于遮挡算法,而是在于整个游戏的组织,包括引擎,游戏逻辑,数据的组织。这才是比较麻烦的地方。
祝你们成功。
top
回复人: guoyin007(过瘾) ( ) 信誉:85 2003-05-10 12:09:35z 得分:5
?
遮挡算法本来不很复杂,但是要优化就不知道该怎么来了
创建一个二维数组来表示大的菱形块,比如对角长度为128或256,他们也是存储精灵信息的连表头,哪个精灵在这个菱形块中就在那里加上,并保持连表顺序为精灵y轴升序就可以啦。可是要要优化起来,我就不知道该怎么办了,因为那样还是嫌不够快
top
回复人: meidoudou2002(quixl) ( ) 信誉:99 2003-05-11 13:31:23z 得分:0
?
谁写过3d图形的地图编辑器?
或者见过类似的软件?
请告诉我一下,我的qq 16015167
top
回复人: tao637(彼岸) ( ) 信誉:100 2003-05-11 20:03:32z 得分:0
?
noslopforever(天堂里的死神) :
能不能把你的研究成果给大家看看?

不知道这两个地图编辑器如何实现两个相临菱形块间的无缝拼结呢?这个算法可能会很复杂,百思不得其解,望指教,谢谢



top
回复人: noslopforever(古老意念) ( ) 信誉:105 2003-05-11 21:05:21z 得分:0
?
相邻菱形块的无缝拼接?这个是不是美工的责任呢?由美工画好所有可能的tile,再实时由程序生成tiles是一件~~厄~~听起来很恐怖的事情。

如果你要看矩形的,推荐看看《圣剑群英传》,如果是菱形的,可以看看《pc游戏编程入门篇》,里面介绍了一种画家算法。
top
回复人: tao637(彼岸) ( ) 信誉:100 2003-05-11 21:44:45z 得分:0
?
你所说的无缝拼结是美工的职责?
这样好象也行,在用地图编辑器拼结地图的时候,我们可以在两个临界的块中加入一个过度块,使拼结起来的地图不至于不连续。
不过在用算法实现无缝拼结时,美工是不是也需要画好多有可能的tiles,再由程序根据具体的地形选择具体的过度tile,对吗?
我想知道,用算法实现无缝拼结和直接拼图实现无缝拼结,对美工和对程序各有什么好处和弊端

另外,暗黑中的随机地图机制,有时如何实现的呢?

回去准备以下资料,研究研究,再来讨论,谢过!
top
回复人: 8alang8(alang) ( ) 信誉:100 2003-05-13 15:38:32z 得分:0
?
关于无缝拼接,我来介绍一个范例:

可以看看文明ii的地图设计。
下载一个civii,在目录下可以找到几个gif文件,就是游戏中用到的所有图片。
文明采用的是2d菱形地图,terranin1.gif中左下角的那幅图就表达了其中心思想:
在边缘处使用dither混合两个方块的边界。

这个方法很简单,但是效果不是很好(相对现在的很多画面华丽的来说)。英雄无敌中的地图据我估计用的也是这个方法,但是效果要好些。为了加强效果,可以扩大dither的范围,也可以设计多个dither随机选择使用。

……
下面是另一种效果较好的方式。可以参考星际等游戏。
首先抽象定义出地形的基本特征:比如:
  地形: a,b,c,d,e等
  地貌: 平地、高地、边缘地带等
然后,对于每种地貌定义一个自身循环的title,在对没两种地貌之间衔接的地方定义一个过渡。
比如:
    aaaa/bbb
    aaa/bbbb
    aaaa\bbb
    aaaaa\bb
其中关键在于/和\区域。他们两边的方块属于过度地带,需要特殊处理。它隔开了不同类型的基本地貌,使得情况大大简化了。现在假定我们增加一种地貌c,并不需要考虑c的边缘要如何和a、b同时融合,只需要分别定义一个和a融合的过度地貌,和b融合的地貌就可以了。显示地图时,只要判断一个方块是否是边缘,如果是边缘则两边各是什么地形,选相应的一个过度地貌就行了。实际显示时是这样的:
    aaaaabbb
    aaaabbbb
    aaaabbbb
    aaaaabbb
大写字目表示的是特殊的过度方块。

现在的问题就是同类型地貌自身的title的制作问题,这个就简单多了,好不好就看美工的本事了。
为了增加地貌的丰富程度,同一种地貌可以定义几种略有变化的外观,显示的时候随机选一个就可以了(比如星际地图中就有这种技术,仔细看同是草地的相邻的方块,不是完全相同的,大面积的草地看起来也就不死板了)。

top
回复人: wltsui(-无招胜有招-) ( ) 信誉:100 2003-05-14 11:14:07z 得分:0
?
暗黑中的随机地图机制,有时如何实现的!

有人研究过吗?
top
回复人: noslopforever(古老意念) ( ) 信誉:105 2003-05-14 20:41:12z 得分:0
?
随机地图的关键不仅仅在于tile的拼接和选择问题,也是在于整个地图数组的生成上。记得原来看过一篇贴子里面讨论过这个问题……
top
回复人: 970361(是猫就应该抓老鼠) ( ) 信誉:93 2003-05-21 18:23:11z 得分:0
?
哦,好东西,看看
top
回复人: inshua(孟昭) ( ) 信誉:98 2003-05-21 18:52:29z 得分:0
?
看文明三的吧,人家都把资源公开了,想怎么抄都行
发表于 2006-12-21 15:20:09 | 显示全部楼层

呵呵 这个东西我以前做过。

用矩型块.

地图基本分为 背景(Tile) 修饰(MidTile) 物体(Objects) 三个层

玩家处于 MidTile和Objects之间.

Tile用96*64的矩形块。

MidTile使用48*32的矩形块,如其所名,他是用来修饰Tile的就如修饰土与草之间的连接.

Objects 宽度必须是固定的值并且于MidTile一致高度可以不固定(因为为了产生遮挡效果)

另外没必要另外做数据来标志地图的某个Cell是否可移动

See:

struct MapCellInfo{

WORD BakIndex; //Tile层

WORD MidIndex; //MidTile层

WORD FrtIndex; //Objects层

}

BakIndex, MidIndex, FrtIndex分别代表了三个层的图象数据索引

可取的最大值是65535,但是一般一个图象库文件的图片数量都不至于到65535这个值

所以可以投机取巧来产生移动标记

See:

if (BakIndex&0x8000)//不可移动

WORD RealImgIdx = BakIndex & 0x7FFF;

So: 如此一来索引号只能用到的最大值是0x7FFF

以上是背景数据的索引。

关于中间的修饰层数据,不必要具有移动标记

See: Objects层

上面说到玩家是于MidTile与Objects之间的 那么当绘制完Tile和MidTile后就是绘制Sprite了

最后还剩下Objects层

同理我们还是使用:

if (FrtIndex&0x8000) //不可移动

{

WORD RealImgIdx = FrnIndex&0x7fff;

if (!RealImgIdx) //这只是处于遮挡区域什么都不要做,处于改位置的人物加一层Alpha混合

return;

else //Draw you Objects

}

so just so easy!

try to Known!

 楼主| 发表于 2006-12-22 13:48:49 | 显示全部楼层
哦?是这样的吗?那么一般存成什么格式的文件保存信息呢?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-2-6 07:10

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表