有人知道小引擎里CCT的move函数中这行代码是干嘛的么

发布于

为什么在判断完是否在ground上之后就要在z轴上减去0.1啊。而且我尝试把它comment掉之后发现后面很多功能确实都不对了

3
评论 4
收藏 1
  • 老彼得
    FROM chatgpt 物理库判断是否在ground上添加0.1的偏移量是为了避免物体和地面之间的微小间隙。由于物理引擎中的碰撞检测是基于离散的离散时间步长进行的,因此当物体与地面接触时,它们之间可能会留下一些微小的间隙。这个偏移量可以确保物体始终在地面上,并且可以避免物体在地面上抖动或穿过地面
    2
    展开1条回复
  • Olorin
    Olorin
    单纯注掉红框中的代码是会出问题的,那一行是和上面构造world_transform时加上的 0.1f * Vector::UNIT_Z 呼应的。 判断角色控制器是否贴地时首先将当前位置向上偏移了 0.1m构造后续查询请求用的 world_transform,使用胶囊碰撞体向下扫掠 0.105m 检查是否贴地,然后再将 world_transform的偏移复原(向下偏移 0.1m,位置回到原来的 current_position)。 如果要去掉红框中的代码需要对称去掉构造 world_transform 时向上的偏移,否则每一帧移动时都会强行把当前位置往下拉 0.1m。 作为这部分代码的reviewer,我努力回想了一下一年前该作者实现这个作业时的想法: 检查贴地时当时实现的第一个版本使用的场景请求是从胶囊碰撞体底部发射射线检测 raycast; 射线检测存在的最大的问题是:如果起点已经穿插进入一个碰撞体,检测时该碰撞体会被忽略。 于是考虑到浮点数精度或者初始位置可能导致的轻微穿插的情形,为了得到符合直觉的贴地检测结果,便先将射线检测的起点回撤了 0.1m,然后检测的射线多延长了 0.1m; 后来测试又发现如果只是胶囊靠近底部其他部分接触到碰撞体而射线发射点悬空时,贴地检查又无法返回符合直觉的结果; 最后将场景请求修改为胶囊体扫掠,而当时为了解决射线检测初始穿插问题的代码就留下了。 而你很敏锐地发现了这一奇怪的做法,我也重新测试了一下,确实对称取消这个偏移功能依然是正常的。 PS:从这个开发过程也可以看到,游戏开发最大的难点在于,如何使用理性的代码去逼近人类微妙的直觉。
    2
    展开1条回复