找回密码
 点一下
查看: 3781|回复: 12

关于如何使镜头高度不随地形变化

[复制链接]
发表于 2014-1-1 20:23:03 | 显示全部楼层 |阅读模式
众所周知,魔兽里镜头高度会随地形变化。
镜头位置如果处于高地,那么镜头高度也会变高,反之亦然。

这个变化的高度是一个采样的计算值,不知道具体算法没办法推算出来。
我们只能通过本地函数来计算这个值
GetCameraTargetPositionZ - GetLocationZ(Location(GetCameraTargetPositionX(),GetCameraTargetPositionY()))
可惜的是,这些函数是有一定延迟的,而且因为是本地函数,还需要花费一定的时间来同步数据

这个问题困扰了我很久

然后今天终于解决了........
call SetCameraTargetController(u, x, y, false)

u一个位置固定在地图中心的单位,因为位置固定,所以镜头高度的变化值在该点是固定的
x,y是你想要的镜头坐标......

这样写,镜头高度波动一直不会变化,通过修改x,y就能修改镜头位置了........然后你可以随意修改镜头高度

对于做需要固定镜头高度的系统,比如什么3D视角镜头移动之类的........很有用呢
发表于 2014-1-1 23:07:56 | 显示全部楼层
对锁定视角的地图来说真是好方法~

镜头系列都是本地函数,所以应该不需要同步来着的...
试了下用GetCameraTargetPositionZ和CAMERA_FIELD_ZOFFSET来调整,结果屏幕各种抖动~
目测就是希瓦说的函数本身的延迟引起的?

不知道有没有不锁定镜头的方法呢...

点评

镜头抖动可以在前面加一个移动镜头到x点,这样就不会抖动了吧  详情 回复 发表于 2019-9-22 13:15
回复

使用道具 举报

发表于 2014-1-2 09:06:01 | 显示全部楼层
好好棒 但是xy如果是当前值的话也会获取延时
回复

使用道具 举报

 楼主| 发表于 2014-1-2 12:49:20 | 显示全部楼层
本帖最后由 希瓦 于 2014-1-2 13:55 编辑
夜の星 发表于 2014-1-1 23:07
对锁定视角的地图来说真是好方法~

镜头系列都是本地函数,所以应该不需要同步来着的...

本地函数的话,如果需要对不可异步的东西进行处理的话
还是需要同步吧...

不锁定镜头也有点思路....
PanCameraToWithZ里可以设置OffsetZ,使用这个函数移动镜头之后,镜头高度在一段时间内不会低于OffsetZ
但是这个函数移动镜头是缓慢移动的,而且高度是渐进的
PanCameraToTimedWithZ如果时间设置太短了的话,也是没有用的

好吧,其实这个方法比锁镜头的方法更直接有效....
只是由于获取当前镜头坐标的函数的延迟...实际应用还是有一些问题
然后由于需要移动镜头的时间,还不能方便的设置镜头高度。
而且,这个函数只能保证镜头高度不会低于某个值,如果遇到足够高的高地的话,镜头高度还是会发生变化的。
也就是说OffsetZ不能设置得太低......


刚才又测试了一下,和记忆有些出入

PanCameraToTimedWithZ在0.00秒时无效,0.01秒也是有效的...
也就是说移动时间的问题解决了

但是还是存在三个问题:
1. 该函数无法保证地形高度高于某个值时,镜头高度不会发生改变。
2. 按下F10,再按一下F10,高度会还原.......(使用其他移动镜头的函数也会导致镜头高度还原)
3. 当使用此函数将镜头位置移动到“当前镜头位置时”,镜头高度有一定几率不会发生变化....

星如果有兴趣的话,一起来研究吧~~
回复

使用道具 举报

 楼主| 发表于 2014-1-2 12:50:47 | 显示全部楼层
ckpig 发表于 2014-1-2 09:06
好好棒 但是xy如果是当前值的话也会获取延时

是的,所以只有锁定镜头的时候可以用得上了
回复

使用道具 举报

发表于 2014-1-2 13:25:05 | 显示全部楼层
看了好久……突然明白3D视角为什么需要了……呵呵……居然变白痴了……

不过说起来,锁定镜头似乎还有一种固定镜头源的锁定方式,虽然尝试过,可是完全想不到需要用在什么地方……也没遇到过这么用的地图……果然是鸡肋功能么……
回复

使用道具 举报

发表于 2014-1-2 20:32:50 | 显示全部楼层
本帖最后由 夜の星 于 2014-1-2 20:34 编辑

镜头对于每个玩家来说,本来就是异步数据,所以不涉及其他的东西的话,应该可以不考虑同步问题的...

试了试PanCameraToTimedWithZ,发觉这个其实是这样的性质:
1.平移之后没有时间限制的,但会被以下操作取消效果:
    鼠标中键
    F10,F9等UI界面,右上红叉
    鼠标点击小地图
    PanCameraToTimed
    等等......

2.高度大于地图上最高处的话,就可以不发生高度变化

3.平移过程中会暂时禁止上下左右,以及鼠标进行镜头移动

4.平移过程中,不刷新SetCameraField(CAMERA_FIELD_ZOFFSET, ...)的效果,直到(1)中情况发生

5.移动到当前位置,就是希瓦上面提到的:
call PanCameraToTimedWithZ(GetCameraTargetPositionX(), GetCameraTargetPositionY(), ...)
因为X和Y方向上都已经无需平移了,所以第一次计时器循环就终止了,解决方案的话,X或Y上面+1就行~

所以感觉可能是BLZ自己的问题吧,并不是在所有镜头操作中都考虑了Z,所以这个Z无法被保留...
各个函数间的冲突问题挺严重的...
试过计时器周期PanCamera,但是不现实,会打断方向键、鼠标移动镜头的(性质3)

因为内部函数自己都没协调好Z轴的处理问题,所以估计用这个也很难做出能用的系统...
在想是不是还是通过类似取样之类的手段,“平滑”地处理掉高度的变化呢...
回复

使用道具 举报

 楼主| 发表于 2014-1-2 23:25:54 | 显示全部楼层
夜の星 发表于 2014-1-2 20:32
镜头对于每个玩家来说,本来就是异步数据,所以不涉及其他的东西的话,应该可以不考虑同步问题的...

试 ...

星测试得真细致呢~~

我也想起来了,第一次测试出现的问题估计是我把“时间”和“高度”两个参数填反了的缘故....

这几个函数都是用来制作电影的函数,估计当时暴雪也没想那么多
只是提供一个临时拥有俯视效果的镜头函数吧

用这些函数来做什么系统估计有些压力………………
回复

使用道具 举报

 楼主| 发表于 2014-1-2 23:30:53 | 显示全部楼层
夜の星 发表于 2014-1-2 20:32
镜头对于每个玩家来说,本来就是异步数据,所以不涉及其他的东西的话,应该可以不考虑同步问题的...

试 ...

“取样”是指直接通过位置计算出镜头高度吗?
不知道具体的抽样算法,要得出精确的值估计有点困难呢
可以先试试每32*32取一个点试试....

点评

说是取样,不如说是类似“预测”之类的吧~ 获取函数存在延迟,那么是不是可以通过估算玩家镜头移动的方向,然后获取该方向再移动一定距离的位置的地形数据来进行计算...误差什么的就想办法圆滑掉,让变化不那么明  详情 回复 发表于 2014-1-4 19:38
回复

使用道具 举报

发表于 2014-1-3 09:33:19 | 显示全部楼层
本帖最后由 lo 于 2014-1-3 09:43 编辑

不知道可以测试啊……猜测一个可用的取样方法,然后取样、计算、应用,只要得出一个好用的就行了……不过,感觉上,镜头的取样应该是和镜头距离有关,镜头越近,取样范围越小;镜头越远,取样范围越大……
因为看不懂你们说的具体是啥,所以lo就不做苦工了……


突然想去两个东西,一个是夜の星的火墙,一个是小鸟的平地漫步者
回复

使用道具 举报

发表于 2014-1-3 16:11:30 | 显示全部楼层
话说Timed填0和非0完全是两种运行方式 实在是太凶残了
回复

使用道具 举报

发表于 2014-1-4 19:38:32 | 显示全部楼层
希瓦 发表于 2014-1-2 23:30
“取样”是指直接通过位置计算出镜头高度吗?
不知道具体的抽样算法,要得出精确的值估计有点困难呢
可 ...

说是取样,不如说是类似“预测”之类的吧~

获取函数存在延迟,那么是不是可以通过估算玩家镜头移动的方向,然后获取该方向再移动一定距离的位置的地形数据来进行计算...误差什么的就想办法圆滑掉,让变化不那么明显就行...

不过也只是想法,估计也不太可能真的这样去做~
或者其实不一定苛求镜头的修正速度,让高度变化不那么明显就行~
回复

使用道具 举报

发表于 2019-9-22 13:15:36 | 显示全部楼层
夜の星 发表于 2014-1-1 23:07
对锁定视角的地图来说真是好方法~

镜头系列都是本地函数,所以应该不需要同步来着的...

镜头抖动可以在前面加一个移动镜头到x点,这样就不会抖动了吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-4-26 13:39 , Processed in 0.250746 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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