Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

Исходник Рисуем 3D Box

Energy Reload
Забаненный
Забаненный
Статус
Оффлайн
Регистрация
20 Авг 2017
Сообщения
1,206
Реакции
330
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
У новых пользователей, которые начинают изучать данный движок имеются вопросы как нарисовать тот или иной объект.

Сама функция рисовки не отличает от рисовки в в любом другом CryEngine
C++:
Expand Collapse Copy
void Box3D(IEntity*pEnt, DWORD Color)
{
      AABB bBox;
      pEnt->GetWorldBoundsCenter(bBox);
      Vec3 Min, Max, vVec1, vVec2, vVec3, vVec4, vVec5, vVec6, vVec7, vVec8;
      Max = bBox.max;
      Min = bBox.min;
 
      vVec3 = Min;
      vVec3.x = Max.x;
      vVec4 = Min;
      vVec4.y = Max.y;
      vVec5 = Min;
      vVec5.z = Max.z;
      vVec6 = Max;
      vVec6.x = Min.x;
      vVec7 = Max;
      vVec7.y = Min.y;
      vVec8 = Max;
      vVec8.z = Min.z;
 
      if (!WorldToScreen(Min, vVec1))
          return;
      if (!WorldToScreen(Max, vVec2))
          return;
      if (!WorldToScreen(vVec3, vVec3))
          return;
      if (!WorldToScreen(vVec4, vVec4))
          return;
      if (!WorldToScreen(vVec5, vVec5))
          return;
      if (!WorldToScreen(vVec6, vVec6))
          return;
      if (!WorldToScreen(vVec7, vVec7))
          return;
      if (!WorldToScreen(vVec8, vVec8))
          return;
 
       DrawLine(vVec1, vVec5, Color);
       DrawLine(vVec2, vVec8, Color);
       DrawLine(vVec3, vVec7, Color);
       DrawLine(vVec4, vVec6, Color);
       DrawLine(vVec1, vVec3, Color);
       DrawLine(vVec1, vVec4, Color);
       DrawLine(vVec8, vVec3, Color);
       DrawLine(vVec8, vVec4, Color);
       DrawLine(vVec2, vVec6, Color);
       DrawLine(vVec2, vVec7, Color);
       DrawLine(vVec5, vVec6, Color);
       DrawLine(vVec5, vVec7, Color);
}

Структура AABB
C++:
Expand Collapse Copy
struct AABB
{
    Vec3 min;
    Vec3 max;

    enum type_reset { RESET };

    inline Vec3 GetCenter() const
    {
        return (min + max)*0.5f;
    }

    inline bool IsEmpty() const
    {
        return min == max;
    }

};

C++:
Expand Collapse Copy
class IEntity
{
public:
        __int64 GetWorldBoundsCenter(AABB &bbox)
    {
        typedef __int64(__thiscall* pFunc)(PVOID, AABB&);
        return vFun_Call<pFunc>(this, virtual_index)(this, bbox);
    }

В зависимости от версии движка, данная функция может отличаться.
C++:
Expand Collapse Copy
bool WorldToScreen(Vec3 vEntPos, Vec3& vOut)
{
    bool result =0;
     VecToScreen pVecToScreen;
     pVecToScreen.toX = vEntPos.x;
     pVecToScreen.toY = vEntPos.y;
     pVecToScreen.toZ = vEntPos.z;
     pVecToScreen.outX = &vOut.x;
     pVecToScreen.outY = &vOut.y;
     pVecToScreen.outZ = &vOut.z;
    if (!IRenderer::Singleton()->ProjectToScreen(&pVecToScreen))return result;
 
     vOut.x *= (IRenderer::Singleton()->GetWidth() * 0.01f);
     vOut.y *= (IRenderer::Singleton()->GetHeight() * 0.01f);
     vOut.z *= 1.0f;
     result=((vOut.z < 1.0f) && (vOut.x > 0) && (vOut.x < (float)IRenderer::Singleton()->GetWidth()) && (vOut.y > 0) && (vOut.y < (float)IRenderer::Singleton()->GetHeight()));
    return result;
}

Структура VecToScreen
C++:
Expand Collapse Copy
struct VecToScreen
{
public:
    float toX;
    float toY;
    float toZ;
    float* outX;
    float* outY;
    float* outZ;
};
if (!IRenderer::Singleton()->ProjectToScreen(&pVecToScreen))return result;

Как инициализировать класс IRenderer у каждого свой метод.
ProjectToScreen
C++:
Expand Collapse Copy
class IRenderer
{
public:
        bool ProjectToScreen(VecToScreen* pVecToScreen)
    {
        typedef bool(__thiscall* oProjectToScreen)(PVOID, VecToScreen*);
        return vFun_Call<oProjectToScreen>(this, virtyual_func)(this, pVecToScreen);
    }

GetWidth, GetHeight - получение разрешения экрана.
 
Последнее редактирование:
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Назад
Сверху Снизу