|
本帖最后由 vegetto 于 2023-1-12 09:32 编辑 ------------------------------ (2),对【 (人)、 (马、坦克)】、【(鸟、直升机)、飞机】、【(鱼、潜艇)、船】、炮 基于非地面地形类的场景物类型生成的障碍物的碰撞检测对运动的影响修正进行代码控制条件分化: 对于我们第(1)的地面碰撞检测来说,基本可以满足在野战场景里没有其他场景物类型的障碍物的运动,但是你既然用了场景物运动控制,就保不齐场景里有带碰撞体的场景物ai在运动比如战车坦克飞机,以及带场景物碰撞的其他军事障碍物比如堡垒沙包工事,以及战团原生的比较大的树木和石头。再者如果去攻城呢,又是大量建筑物,所以,对于碰撞判定对运动控制的影响及修正,我们仅仅来判断地面检测是不够的,还需要进行常规的障碍物碰撞判定。所以本要点(2)的内容就是对各种运动研究对象基于我上面的基础运动控制代码进行常规的障碍物碰撞判定的分化改写。未完待续,最近贴发太多有点写累了,毕竟我要讲的很多不是常规mod要用的东西。你们先看下我下面两个帖子的实例,了解最通用的非地形碰撞检测判定方法 场景物运动辅助及碰撞的妙用之制作自动生成复杂图案阵型系统https://bbs.mountblade.com.cn/thread-2094179-1-1.html 场景物运动控制模拟技能案例--混沌陨石(代码):https://bbs.mountblade.com.cn/thread-2096150-1-1.html 就比如我阵型系统回复层写的:“最后给你们总结的是:几种思维和处理方法。 1.注重模型手段和程序手段的结合。 2.借助场景物运动控制的便利,可以辅助agent人和particle粒子等其他系统进行更平滑更好的位移控制,并且我们记录坐标并不一定要知道XYZ值,像人和场景物都有自己的位置坐标,并且可以通过自身的位移来表达位置坐标的改变,这时候我们就可以化抽象为具体,将抽象的xyz值的坐标以场景物人等等的实物形式来持久保留和实时平稳控制。 3.碰撞检测的几种手段之一,除了胶囊的op判断,坐标点集合的距离判断,castray的射线判断,in sight视线范围或者屏幕坐标超出屏幕范围的视线模糊判断,特殊的对地形的高度值获取判断,还有就是利用: (position_get_distance_to_ground_level, ":var_19", pos2), #判断位置点下方的高度,此高度是计算下方的场景物碰撞点为高度h=0点 (position_get_distance_to_terrain, ":var_20", pos2), #判断位置点下方的高度,但是此高度是不计算下方的场景物碰撞点,以随机地形网格生成的最高地形点为高度h=0点 (store_sub, ":var_21", ":var_20", ":var_19"), #将两个高度值作差值 这种方式求差值,了解高空同一点下方是否存在prop的collision形式的碰撞体,这样比如差值是十几米,可能碰撞体在野战就是坦克,差值几十米,可能在攻城战就是 城墙,这样对不复杂场景做复杂场景物运动功能时进行一个高效不卡相对模糊快速的碰撞判定,然后做出相应的碰撞后运动反应。” 这些经验。 因为碰撞是一个情况比较多的东西,如果你假设周边碰撞都是固定不动的平面,那么最直接的方法,可以cast ray判定一定距离有碰撞,然后对wasd按键的位移条件进行屏蔽或者加一个可以避开碰撞的位移, 但是实际上遇到的碰撞体样式是多种多样,可静可动的。 比如你的碰撞是一个网状的格栅(一般这种碰撞体做的时候会做成平面也不会有什么影响)或碰撞体中间带大孔洞的比如涵洞,那么cast ray对精度要求上来需要多向多射线,否则直接穿孔测不到碰撞。 胶囊的op判断即prop_instance_intersects_with_prop_instance,对碰撞体的形状有要求,所以注定不是通用的判定手段,一般用于两个特定具有运动能力的对象。 而in sight视线类用法也会有局限且性能和精度上不适合通用ai。然后就是碰撞体存在运动时的判断延迟,特别是两个碰撞体相撞运动时互相磨蹭这种情况,对碰撞检测的精度要求更高,以及两个墙形成的90度夹出的墙角,顶部带突出的屋檐类碰撞外形,等等等等,导致你碰撞判定的时候,你不仅要考虑对当前位移方向即将遇到的碰撞产生的位移影响,还要根据影响位移去规避绕开碰撞后的复合运动去判断可能强制改向后的碰撞检测方向的调整,就需要各种综合条件综合手段去判断,否则在一个形状不是方方正正的、竖立面此起彼伏具有空洞或被碰撞体环绕的空间内、以及多个运动类物体碰撞遇到一起(比如8辆车同时像花瓣一样头部顶到一起,互相之间怎么让)等等复杂的场景环境,就免不了突然穿墙的可能。 其次,场景物自身是否含有较大碰撞体以及自身的尺寸大小也是对此类代码编写的复杂程度的影响因素之一,比如人这种运动特征的小型生物,碰撞检测就比较简单,就像我上面地面检测一样,因为人的运动位置点可以等效一个点,而坦克之类的机械需要等效一个平面;人的横向尺寸较小对周边障碍物检测时可以等效半径较小的圆柱体去考虑,这样对形体周边的任意检测点可以近似相等,但坦克这些庞然大物却要考虑自身复杂的多边形外形碰撞,以及选取合适的模型中心(即prop instance get pos以模型上哪个点为参考)(比如你坦克的pos在openbrf里是两个前轮的中心为原点还是两个后轮中心还是底盘中心,这个中心点选取,不仅对碰撞,对你的运动该怎么平移旋转修正都是有影响的),这个中心点pos和其碰撞外形各边角点的不同距离都会让你在判断不同方向上运动时的碰撞检测时需要分别分析设置合理的位移修正数值。以及部分碰撞判定手段还有对检测到的环境碰撞会不会可能是自身的情况做出判定和规避,就像我混沌陨石代码里写的,你用ground level还是cast ray,对于自身拥有坦克船体一样大的物体来说,有时你不能保证你检测到的碰撞是不是就是自己的,因而采用这种碰撞手段时就要考虑把碰撞检测的参考位置移到有效形体碰撞的边缘外,所以这也是形体大小的影响。 当然形体大小对碰撞检测精度的影响,并不是要求我们完全不穿模,而是不无限制的“穿墙”,穿模这种东西在骑砍2也不能避免,这个根据不同对象的形体大小和不同的制作者,有个穿模的最大容忍度即可,比如人就是比较小的生物,手稍微穿到墙里不要紧,最怕身体运动时陷到墙内1/3以上,甚至发生大穿模现象时,向碰撞内运动已经突破碰撞检测的条件,继续穿直至穿出碰撞面。或者坦克,我稍微一点板甲陷入墙里蹭到短时间不要紧,因为一个运动的碰撞面和凹凸不平的碰撞面来回挤压本身对检测精度较高,除非检测距离拉长,让坦克远远的距离障碍物就禁止再往障碍物方向移动。所以考虑时,一般你可以考虑是否需要一个安全保护距离,对周围障碍物有明显靠近的距离时就阻止这个方向的位移。比如飞机,按道理你撞墙和山会撞毁,所以这时候,你的设定可以考虑你明知道前面有山,还是按W前进,那直接撞毁吧,或者内定一个安全保护距离,假如按W前进时,前面检测到100米有个大山,那么你按W一般情况产生的move y位移就自动修正,加上如rotate x的位移,添加系统辅助帮助玩家傻瓜式自动规避碰撞。 所以一个完美的基于场景物制作的机械类生物类运动对象,目前应用的均不是尽善尽美,当前少数应用到的mod仅仅只能保持自己在海面野战这种建筑等障碍物场景物不多的情况下编写。 所以就实际应用来说,完美制作应用各类场景的模拟运动的这种一劳永逸的努力方向建议不要进行研究,将特殊机制应用特殊任务的特殊场景化会更好一点,比如飞机坦克特定在某战役场景野战等等,而对于修仙能飞的人这种可以忽略自身碰撞影响的对象来说,可以考虑多场景的通用化,可以agent和prop系统结合起来用,针对不同情形具体分析,比如步行多借助agent系统控制,飞行多借助prop系统控制,这样有合有分的编制手段。 这个具体的用例,我想想,我打算后面给你们两个我的用例作为参考,一个是我魔兽争霸mod的四大种族的飞行单位战车的机制做法(这个是我自己对ai怎么尽可能节省资源去应用顶点动画场景物运动的做法),一个是我刺客伍六七mod的飞檐走壁做法(基本完美适应各种奇形怪状的房子等立面),时间关系先不写,后面未完待续 |
| 大佬,骑砍能做汽车吗?就把攻城车的模型拿出来,让轮子自己转起来 |
| LZ辛苦了,虽然看不懂还是顶了,问大家个问题,编辑器里的动物用来做啥的,还有角色特性的skin2到skin15是怎么改的,我改了skin.txt但是没效果都是大个头女的。 |
顶顶顶, 整活到底!! |
挺好的,老彼得.![]() |
GMT+8, 2026-1-14 14:47 , Processed in 0.148911 second(s), 31 queries , Gzip On, MemCached On.
Powered by Discuz! X3.4 Licensed
© 2001-2023 Discuz! Team.