游戏开发论坛

 找回密码
 立即注册
搜索
楼主: sjinny

关于物体的移动

[复制链接]

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2003-11-12 11:40:00 | 显示全部楼层

Re:关于物体的移动

这个应该是碰撞监测的工作,如果你只是检测将要发生的碰撞那肯定是不完整的,完整的碰撞检测应该包括将要发生和已经发生及正在发生3种情况。如果你的碰撞检测系统包括了这3种情况,就不应该出现这种问题。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2003-11-12 22:26:00 | 显示全部楼层

Re:关于物体的移动

tarkey,你是不是说,碰撞检测的正确性要倚赖于FPS?
congy,请问怎么理解“正在发生”这个概念呢?

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2003-11-13 09:38:00 | 显示全部楼层

Re:关于物体的移动

不全是,你看这个例子:
假设你的FPS为1,那么也就是说每秒你更新一次,在这一秒之类的所有状态的改变,都是无法表现在画面上的。所以不能等渲染出来以后再做碰撞检测,否则就会出现你所说的情况。

碰撞检测是应该在渲染以前做,也就是在更新状态的时候做。

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2003-11-13 15:18:00 | 显示全部楼层

Re:关于物体的移动

正在发生就是刚好两个物体间碰撞的临界点。
tarkey说得很对,要在render之前先更新状态。
简单写一下:

while(游戏循环){

    Update();  // 更新游戏物体状态,计算检查是否发生碰撞
    Render();  // 渲染
}

A -〉运动物体 B->静止物体,简单起见,只判断 x 轴方向的碰撞,初始 A->pos.x < B->pos.x. A 的速率是 d
Update(){
    A.pos.x += d;
    // 已发生碰撞和正在发生碰撞
    if (A.pos.x >= B.pos.x)  {
       // 重新设置 A 的位置
    }
}

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2003-11-14 13:12:00 | 显示全部楼层

Re:关于物体的移动

我是这样想的:
假设每t秒更新一次物体状态,那么如果在这个t秒内发生了碰撞呢?
如果是状态来决定坐标的模式,那么其实是在一段时间内选取了若干个瞬间,根据各个瞬间之间的时间差来计算各个瞬间时物体的坐标,那么也只能判断这些瞬间是否发生了碰撞。比如两个使用包围球的物体,如果在某个瞬间他们没有碰撞,也就是他们的包围球没有相交,然后在下一个检测瞬间他们的包围球也没有相交,那么这样就会认为仍然没有发生碰撞,但是如果在这两个瞬间之间的某个时间发生了碰撞呢?
关于运动速度:
我是这样想的:
每个对象都有两个数据成员:
加速度
速度
它们都是矢量。另外,还有物体的坐标。
在每次更新状态时,会检测得到距离上次检测的时间,也就是在上次更新了坐标后这个物体又运动了多长时间。然后根据加速度、速度、时间和上次更新得到的坐标,计算出目前的新坐标;但是这样,在这个运动过程中发生了什么就不得而知了~~

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2003-11-14 15:10:00 | 显示全部楼层

Re:关于物体的移动

这就是之所以很多粒子系统都没有碰撞的原因。
粒子足够小,小的在一桢之内就能将它忽略掉。
其他的情况下,你所说的不存在。
除非你碰撞的两个实体都是象素级单位的。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2003-11-14 22:41:00 | 显示全部楼层

Re:关于物体的移动

倒,原来这些问题还是很难避免的啊?只不过一般不会遇到这些问题而已~~
那么就涉及另一个问题:物体的速度要控制在什么范围内?
其实问题的本质就是,物体运动得太快,且物体(包围球)太小~~
所以,应该定义一个最大速度~~
也许还可以定义一个碰撞检测最大时间间隔T,然后得保证只要两次相邻碰撞检测之间的时间间隔在不大于T的话,那么即使上次两个物体的包围球相切,且相对速度达到了最大限速,这次检测时也能确保它们的包围球是相交的~~这样,应该不会有什么问题了吧?
具体也就是在每次碰撞检测时,先得到时间间隔,如果小于或等于T,那么就按照这个时间间隔计算物体运动,如果大于T那么就按照T计算运动,这样,在电脑足够快时,碰撞检测会非常即时精细,如果电脑太慢,那么也不会出现碰撞检测出错,但是要以FPS降低为代价~~
但是还有问题:最大速度、最大时间间隔T,这些都与物体的大小,也就是包围球的尺寸有关,那么怎么确定这些量呢?

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2003-11-14 23:57:00 | 显示全部楼层

Re:关于物体的移动

我觉得你还是没有明白,第一,不可能存在你所说的 “每t秒更新一次物体状态” 这种情况,因为在每一桢在 render 前都要更新状态,也就是所谓的碰撞检测,每一秒钟都有几十桢,除非你的运动加速度超过了人眼的视觉停留极限,这样的话就可以不计算速度,比如像CS中的子弹,它是没有速度的,当玩家开枪时的那一时刻,就立即判断子弹是否击中目标,而不是靠速度来检测碰撞,否则的话就会出现玩家开枪之后过了一段时间地人才爆头的错误现象。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2003-11-15 12:19:00 | 显示全部楼层

Re:关于物体的移动

晕,难道“每t秒更新一次物体状态”中的t就一定要>1吗?
要知道碰撞检测的意义不仅仅在于render,还和游戏本身有关~~
一个物体的运动速度太快时,要渲染出来的确没什么用了,但是即使速度再快,该发生的碰撞还是要 发生的~~
比如空战中,两架战斗机高速运动时,如果发生正对相撞,那么相对速度是非常快的,但是总不能因为人眼忙不过来,就让一架飞机穿过另一架而不相撞吧?
至于子弹,比如雷神之锤,大多数子弹都是有速度的,而且其实还挺慢,人物能躲掉子弹。我觉得把高速物体的速度忽略并不好~~特别像飞机这样的高速物体,虽然速度快,但是还是会因为玩家的操作而使运动轨迹改变,所以没法像CS里的子弹那样在一开始就判断碰撞情况~~

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2003-11-15 12:41:00 | 显示全部楼层

Re:关于物体的移动

其实这是一个观察点距离选择的问题,就像一列高速运动的火车,当我们离远看时速度并不快,可但我们距离很近时才干觉得他的高速。我并没有说因为速度过快而不检测碰撞,而是说当观察点离运动物体很近时,比如CS中的子弹,可以忽略速度直接以当前点为射线检测碰撞。还有你说的高速飞机问题,一般飞机游戏都是以某一视角作为参照的,或者飞机本身,假如以地面为参照的话,一定是以很远的视角去看,但大家都知道,我们的视点离运动物体越远,物体运动的速度越慢,当观察者以很近的距离去看飞机是,将什么也看不清楚,因为速度太快。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-24 06:18

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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