-
Автор темы
- #1
У меня есть такой код для 3-его лица, но в нем есть проблема. Когда персонаж подходит к стене и поворачивает камеру в направлении от стены, то камера захватывает затикстурье. Собственно сам вопрос: как это можно исправить не получив рывков камеры и багов с руками?
C++:
#include "Hooks.h"
#include "../../utils/system/entities.h"
#include "../../utils/math/Math.h"
#define distance_ 100
void* __fastcall hooks::OverrideView::OverrideView(CViewRender* pViewRender, CViewSetup* pViewSetup, void* a3, void* a4, void* a5, void* a6)
{
if (IsUninitialized)
return Original(pViewRender, pViewSetup, a3, a4, a5, a6);
pViewSetup->fov = 115;
pViewSetup->viewmodelFov = 115;
auto localPlayer = gEntities->GetLocalPlayerPawn();
if (!localPlayer)
return nullptr;
auto CalculateCameraPosition = [](Vector anchorPos, float distance, Vector viewAngles) -> Vector {
float yaw = DirectX::XMConvertToRadians(viewAngles.y);
float pitch = DirectX::XMConvertToRadians(viewAngles.x);
float x = anchorPos.x + distance * cosf(yaw) * cosf(pitch);
float y = anchorPos.y + distance * sinf(yaw) * cosf(pitch);
float z = anchorPos.z + distance * sinf(pitch);
return Vector{ x, y, z };
};
Vector adjustedCamViewAngle = reinterpret_cast<CCSGOInput*>(gInterfaces->input)->vecViewAngle;
adjustedCamViewAngle.x = -adjustedCamViewAngle.x;
pViewSetup->origin = CalculateCameraPosition(localPlayer->GetEyePosition(), -distance_, adjustedCamViewAngle);
Ray_t ray{};
GameTrace_t trace{};
TraceFilter_t filter{ 0x1C3003, localPlayer, NULL, 4 };
if (gInterfaces->engineTrace->TraceShape(&ray, localPlayer->GetEyePosition(), pViewSetup->origin, &filter, &trace)) {
if (trace.m_pHitEntity != nullptr) {
pViewSetup->origin = trace.m_vecEndPos - trace.m_vecNormal * (- 7.0f);
}
}
Vector p = Math::NormalizeAngles(Math::CalcAngle(pViewSetup->origin, localPlayer->GetEyePosition()));
Math::Interpolate(p, p, 100);
pViewSetup->angles = Vector{ p.x, p.y };
return Original(pViewRender, pViewSetup, a3, a4, a5, a6);
}