Вопрос Вид от 3-его лица

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
25 Фев 2023
Сообщения
6
Реакции
0
У меня есть такой код для 3-его лица, но в нем есть проблема. Когда персонаж подходит к стене и поворачивает камеру в направлении от стены, то камера захватывает затикстурье. Собственно сам вопрос: как это можно исправить не получив рывков камеры и багов с руками?
C++:
Expand Collapse Copy
#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);
}
 
У меня есть такой код для 3-его лица, но в нем есть проблема. Когда персонаж подходит к стене и поворачивает камеру в направлении от стены, то камера захватывает затикстурье. Собственно сам вопрос: как это можно исправить не получив рывков камеры и багов с руками?
C++:
Expand Collapse Copy
#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);
}
Как ты исправил эту проблему?

1733479307524.png

Игрок движется а камера нет
 
В каком плане не движется? Статична на карте или вокруг игрока ?
 
В каком плане не движется? Статична на карте или вокруг игрока ?
вокруг игрока тоесть сам игрок движется а камера вокруг него нет все время в одном положении
Буду благодарен за ответ.

Я вероятно знаю решение твой проблемы
 
Последнее редактирование:
вокруг игрока тоесть сам игрок движется а камера вокруг него нет все время в одном положении
Буду благодарен за ответ.

Я вероятно знаю решение твой проблемы
Все дело в строчке кода на позиции 46. Она отвечает за вращение камеры по новым векторам, грубо говоря это новые направления по которым движется камера вокруг игрока.
 
Все дело в строчке кода на позиции 46. Она отвечает за вращение камеры по новым векторам, грубо говоря это новые направления по которым движется камера вокруг игрока.
а что является angles можешь скинуть свой ViewSetup и какой Interpolate

class CViewSetup
{
public:
unsigned char pad0[0x490];
float flOrthoLeft; // 0x0494
float flOrthoTop; // 0x0498
float flOrthoRight; // 0x049C
float flOrthoBottom; // 0x04A0
unsigned char pad1[0x38];
float flFov; // 0x04D8
float flFovViewmodel; // 0x04DC
Vector_t vecOrigin; // 0x04E0
unsigned char pad2[0xC]; // 0x04EC
Vector_t angView; // 0x04F8
unsigned char pad3[0x14]; // 0x0504
float flAspectRatio; // 0x0518
unsigned char pad4[0x71];
BYTE nSomeFlags;
};

Вот мой но почемуто камера не вертится
а что является angles можешь скинуть свой ViewSetup и какой Interpolate

class CViewSetup
{
public:
unsigned char pad0[0x490];
float flOrthoLeft; // 0x0494
float flOrthoTop; // 0x0498
float flOrthoRight; // 0x049C
float flOrthoBottom; // 0x04A0
unsigned char pad1[0x38];
float flFov; // 0x04D8
float flFovViewmodel; // 0x04DC
Vector_t vecOrigin; // 0x04E0
unsigned char pad2[0xC]; // 0x04EC
Vector_t angView; // 0x04F8
unsigned char pad3[0x14]; // 0x0504
float flAspectRatio; // 0x0518
unsigned char pad4[0x71];
BYTE nSomeFlags;
};

Вот мой но почемуто камера не вертится

не знаешь ли ты в чем у меня проблема и почему камера не двигается
 
Последнее редактирование:
GetEyePosition функу дай
 
У меня есть такой код для 3-его лица, но в нем есть проблема. Когда персонаж подходит к стене и поворачивает камеру в направлении от стены, то камера захватывает затикстурье. Собственно сам вопрос: как это можно исправить не получив рывков камеры и багов с руками?
C++:
Expand Collapse Copy
#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);
}
тут дебажить надо, смотреть чё да как, мб вьюангл говно
 
Окей, а есть каких-либо общие советы к этой проблеме если именно решения нет?
Да есть вероятность решения получения нормально положения глаз и уже написать отдельную функцию GetEyePosThirdPerson в которой при получение ты добавляешь уже к самому x расстояние камеры точно также чтобы она двигалась нормальна либо же чисто обновить xyz на регуляре и смотреть от поворотов мышки данная проблема похоже на thirdpersonMaymode когда тупо не можешь двигать камерой можно покопатся в коде dll и посмотреть ее работу и понять что мы так делаем неправильно с камерой НО ОТВЕТ ЛЕГКИЙ ЛЕНИВО!
 
  • Мне нравится
Реакции: mj12
Назад
Сверху Снизу