搜索
楼主: ttbs123

再回答我这个问题少年一下,如何判断2人之间障碍物

[复制链接]
 楼主| 发表于 2008-12-16 16:35:20 | 显示全部楼层 来自 广东深圳

回复: 再回答我这个问题少年一下,如何判断2人之间障碍物

Post by jim_yang
你可以看看这个帖子
http://forums.alliedmods.net/showthread.php?t=74780&highlight=visible
好像跟我问的问题差不多,看不懂英文,是不是也没办法解决?
回复

使用道具 举报

发表于 2008-12-16 16:42:36 | 显示全部楼层 来自 北京朝阳

回复: 再回答我这个问题少年一下,如何判断2人之间障碍物

  1. bool FBoxVisible (edict_t *pEdict, edict_t *pTargetEdict, Vector *pvHit, unsigned char *ucBodyPart) // KWo - 24.02.2008 - rewritten...
  2. {
  3.    int i;
  4.    int RenderFx;                 // KWo - 22.03.2008
  5.    int RenderMode;               // KWo - 22.03.2008
  6.    Vector RenderColor;           // KWo - 22.03.2008
  7.    float RenderAmount;           // KWo - 22.03.2008
  8.    float LightLevel;               // KWo - 23.03.2008
  9.    bool SemiTransparent = false; // KWo - 22.03.2008
  10.    *ucBodyPart = 0;
  11.    Vector vecEnDirection = pTargetEdict->v.angles;
  12.    // don't look through water
  13.    if (((pEdict->v.waterlevel != 3) && (pTargetEdict->v.waterlevel == 3))
  14.        || ((pEdict->v.waterlevel == 3) && (pTargetEdict->v.waterlevel == 0)))
  15.       return (FALSE);
  16. // KWo - 22.03.2008 - added invisibility check
  17.    RenderFx = pTargetEdict->v.renderfx;
  18.    RenderMode = pTargetEdict->v.rendermode;
  19.    RenderColor = pTargetEdict->v.rendercolor;
  20.    RenderAmount = pTargetEdict->v.renderamt;
  21.    if (((RenderFx == kRenderFxExplode) || (pTargetEdict->v.effects & EF_NODRAW))
  22.       && !(pTargetEdict->v.oldbuttons & IN_ATTACK)) // kRenderFxExplode is always invisible even for mode kRenderNormal
  23.    {
  24.       return (FALSE);
  25.    }
  26.    else if (((RenderFx == kRenderFxExplode) || (pTargetEdict->v.effects & EF_NODRAW))
  27.       && (pTargetEdict->v.oldbuttons & IN_ATTACK))
  28.    {
  29.       SemiTransparent = true;
  30.    }
  31.    else if ((RenderFx != kRenderFxHologram) && (RenderMode != kRenderNormal)) // kRenderFxHologram is always visible no matter what is the mode
  32.    {
  33.       if (RenderFx == kRenderFxGlowShell)
  34.       {
  35.          if ((RenderAmount <= 20.0) && (RenderColor.x <= 20)
  36.             && (RenderColor.y <= 20) && (RenderColor.z <= 20))
  37.          {
  38.             if (!(pTargetEdict->v.oldbuttons & IN_ATTACK))
  39.             {
  40.                return (FALSE);
  41.             }
  42.             else
  43.             {
  44.                SemiTransparent = true;
  45.             }
  46.          }
  47.          else if ((RenderAmount <= 60.0) && (RenderColor.x <= 60)
  48.             && (RenderColor.y <= 60) && (RenderColor.z <= 60))
  49.          {
  50.             SemiTransparent = true;
  51.          }
  52.       }
  53.       else
  54.       {
  55.          if (RenderAmount <= 20)
  56.          {
  57.             if (!(pTargetEdict->v.oldbuttons & IN_ATTACK))
  58.             {
  59.                return (FALSE);
  60.             }
  61.             else
  62.             {
  63.                SemiTransparent = true;
  64.             }
  65.          }
  66.          else if (RenderAmount <= 60)
  67.          {
  68.             SemiTransparent = true;
  69.          }
  70.       }
  71.    }
  72. // KWo - 26.03.2008 - added darkness check
  73.    LightLevel = UTIL_IlluminationOf(pTargetEdict);
  74. //   ALERT(at_logged,"[DEBUG] Bot %s checks the illumination of %s. It's = %f.\n",
  75. //      STRING(pEdict->v.netname), STRING(pTargetEdict->v.netname), LightLevel);
  76.    if ((LightLevel < 3.0) && (!(pTargetEdict->v.effects & EF_DIMLIGHT)) /* && (!g_bIsOldCS15) */ && !(pTargetEdict->v.oldbuttons & IN_ATTACK))
  77.    {
  78.       return (FALSE);
  79.    }
  80.    else if (((LightLevel < 10.0) || (pTargetEdict->v.oldbuttons & IN_ATTACK)) && (!(pTargetEdict->v.effects & EF_DIMLIGHT)) /* && (!g_bIsOldCS15) */)
  81.    {
  82.       SemiTransparent = true; // in this case we can notice the enemy, but not so good...
  83.    }
  84.    TraceResult tr;
  85.    Vector vecLookerOrigin = GetGunPosition (pEdict);
  86.    Vector vecTarget = pTargetEdict->v.origin;
  87.    // Check direct Line to waist
  88.    UTIL_TraceLine (vecLookerOrigin, vecTarget, ignore_monsters, ignore_glass, pEdict, &tr);
  89.    if (tr.flFraction == 1.0)
  90.    {
  91.       *pvHit = tr.vecEndPos;
  92.       *ucBodyPart |= WAIST_VISIBLE;
  93.    }
  94.    MAKE_VECTORS (vecEnDirection);
  95.    // Check direct Line to head
  96.    vecTarget = vecTarget + pTargetEdict->v.view_ofs + Vector(0.0, 0.0, 3.0);
  97.    UTIL_TraceLine (vecLookerOrigin, vecTarget, ignore_monsters, ignore_glass, pEdict, &tr);
  98.    if ((tr.flFraction == 1.0) && (!SemiTransparent)) // if the player is rendered, his head cannot be good seen...
  99.    {
  100.       *pvHit = tr.vecEndPos;
  101.       *ucBodyPart |= HEAD_VISIBLE;
  102.    }
  103.    if (*ucBodyPart != 0)
  104.       return (TRUE);
  105.    // Nothing visible - check randomly other Parts of Body
  106.    for (i = 0; i < 6; i++)
  107.    {
  108.       vecTarget = pTargetEdict->v.origin;
  109.       switch(i)
  110.       {
  111.          case 0: // left arm
  112.          {
  113.             vecTarget.x -= 10.0 * gpGlobals->v_right.x;
  114.             vecTarget.y -= 10.0 * gpGlobals->v_right.y;
  115.             vecTarget.z += 8.0;
  116.             break;
  117.          }
  118.          case 1: // right arm
  119.          {
  120.             vecTarget.x += 10.0 * gpGlobals->v_right.x;
  121.             vecTarget.y += 10.0 * gpGlobals->v_right.y;
  122.             vecTarget.z += 8.0;
  123.             break;
  124.          }
  125.          case 2: // left leg
  126.          {
  127.             vecTarget.x -= 10.0 * gpGlobals->v_right.x;
  128.             vecTarget.y -= 10.0 * gpGlobals->v_right.y;
  129.             vecTarget.z -= 12.0;
  130.             break;
  131.          }
  132.          case 3: // right leg
  133.          {
  134.             vecTarget.x += 10.0 * gpGlobals->v_right.x;
  135.             vecTarget.y += 10.0 * gpGlobals->v_right.y;
  136.             vecTarget.z -= 12.0;
  137.             break;
  138.          }
  139.          case 4: // left foot
  140.          {
  141.             vecTarget.x -= 10.0 * gpGlobals->v_right.x;
  142.             vecTarget.y -= 10.0 * gpGlobals->v_right.y;
  143.             vecTarget.z -= 24.0;
  144.             break;
  145.          }
  146.          case 5: // right foot
  147.          {
  148.             vecTarget.x += 10.0 * gpGlobals->v_right.x;
  149.             vecTarget.y += 10.0 * gpGlobals->v_right.y;
  150.             vecTarget.z -= 24.0;
  151.             break;
  152.          }
  153.       }
  154. /*
  155.       vecTarget.x += RANDOM_FLOAT (pTargetEdict->v.mins.x, pTargetEdict->v.maxs.x);
  156.       vecTarget.y += RANDOM_FLOAT (pTargetEdict->v.mins.y, pTargetEdict->v.maxs.y);
  157.       vecTarget.z += RANDOM_FLOAT (pTargetEdict->v.mins.z, pTargetEdict->v.maxs.z);
  158. */
  159.       UTIL_TraceLine (vecLookerOrigin, vecTarget, dont_ignore_monsters, ignore_glass, pEdict, &tr);
  160.       if ((tr.flFraction <= 1.0) && (tr.pHit == pTargetEdict))
  161.       {
  162.          // Return seen position
  163.          *pvHit = tr.vecEndPos;
  164.          *ucBodyPart |= CUSTOM_VISIBLE;
  165.          return (TRUE);
  166.       }
  167.    }
  168.    return (FALSE);
  169. }
复制代码
这个是机器人如何判断是否能够看见另一个人,仅供参考
回复

使用道具 举报

 楼主| 发表于 2008-12-16 16:48:00 | 显示全部楼层 来自 广东深圳

回复: 再回答我这个问题少年一下,如何判断2人之间障碍物

再次感谢,我等一下回家后慢慢来消化。。。。
回复

使用道具 举报

发表于 2008-12-16 18:47:43 | 显示全部楼层 来自 广东惠州

回复: 再回答我这个问题少年一下,如何判断2人之间障碍物

回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注个册吧

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