Другое С/С++ Вопрос - Ответ

tanksoftik

Новичок
8
1
как можно реализовать функцию convertScreenCoordsToWorld3D с луа на плюсы
чат гпт выдовал такой код

C++:
#include <plugin.h>
#include <game_sa/CCamera.h>
#include <game_sa/CWorld.h>
#include <game_sa/CColPoint.h>

bool ConvertScreenCoordsToWorld3D(float screenX, float screenY, float& outX, float& outY, float& outZ)
{
    auto viewMatrix = *(RwMatrix*)0xB6FA2C;
    CCamera* cam = TheCamera;

    float screenW = static_cast<float>(*reinterpret_cast<DWORD*>(0xC17044));
    float screenH = static_cast<float>(*reinterpret_cast<DWORD*>(0xC17048));

    float nx = (2.0f * screenX / screenW) - 1.0f;
    float ny = 1.0f - (2.0f * screenY / screenH); // перевёрнутый Y

    CVector forward(viewMatrix.at.x, viewMatrix.at.y, viewMatrix.at.z);
    CVector right(viewMatrix.right.x, viewMatrix.right.y, viewMatrix.right.z);
    CVector up(viewMatrix.up.x, viewMatrix.up.y, viewMatrix.up.z);

    float fov = cam->m_fFOV;
    float aspect = screenW / screenH;
    float fovRad = fov * 3.14159f / 180.0f;
    float tanFov = tanf(fovRad / 2.0f);

    CVector rayDir = forward + right * nx * aspect * tanFov + up * ny * tanFov;
    rayDir.Normalise();

    CVector camPos = *cam->GetGameCamPosition();
    CVector rayEnd = camPos + rayDir * 3000.0f; // дальность луча

    CColPoint col;
    CEntity* pHitEntity = nullptr;

    // трассировка с фильтрацией воды и прочего
    if (CWorld::ProcessLineOfSight(
            camPos, rayEnd, col, pHitEntity,
            true, true, true, true, false, true, false))
    {
        outX = col.m_vecPoint.x;
        outY = col.m_vecPoint.y;
        outZ = col.m_vecPoint.z;
        return true;
    }

    return false;
}
но он работает очень плохо и неправильно
 

AdCKuY_DpO4uLa

Адский дрочер
Друг
342
750
как можно реализовать функцию convertScreenCoordsToWorld3D с луа на плюсы
чат гпт выдовал такой код

C++:
#include <plugin.h>
#include <game_sa/CCamera.h>
#include <game_sa/CWorld.h>
#include <game_sa/CColPoint.h>

bool ConvertScreenCoordsToWorld3D(float screenX, float screenY, float& outX, float& outY, float& outZ)
{
    auto viewMatrix = *(RwMatrix*)0xB6FA2C;
    CCamera* cam = TheCamera;

    float screenW = static_cast<float>(*reinterpret_cast<DWORD*>(0xC17044));
    float screenH = static_cast<float>(*reinterpret_cast<DWORD*>(0xC17048));

    float nx = (2.0f * screenX / screenW) - 1.0f;
    float ny = 1.0f - (2.0f * screenY / screenH); // перевёрнутый Y

    CVector forward(viewMatrix.at.x, viewMatrix.at.y, viewMatrix.at.z);
    CVector right(viewMatrix.right.x, viewMatrix.right.y, viewMatrix.right.z);
    CVector up(viewMatrix.up.x, viewMatrix.up.y, viewMatrix.up.z);

    float fov = cam->m_fFOV;
    float aspect = screenW / screenH;
    float fovRad = fov * 3.14159f / 180.0f;
    float tanFov = tanf(fovRad / 2.0f);

    CVector rayDir = forward + right * nx * aspect * tanFov + up * ny * tanFov;
    rayDir.Normalise();

    CVector camPos = *cam->GetGameCamPosition();
    CVector rayEnd = camPos + rayDir * 3000.0f; // дальность луча

    CColPoint col;
    CEntity* pHitEntity = nullptr;

    // трассировка с фильтрацией воды и прочего
    if (CWorld::ProcessLineOfSight(
            camPos, rayEnd, col, pHitEntity,
            true, true, true, true, false, true, false))
    {
        outX = col.m_vecPoint.x;
        outY = col.m_vecPoint.y;
        outZ = col.m_vecPoint.z;
        return true;
    }

    return false;
}
но он работает очень плохо и неправильно

либо самопальная хуета, которую я отрыл когда-то очень давно

C++:
void CalcScreenCoors(CVector* vecWorld, CVector* vecScreen)
    {
        D3DXMATRIX m((float*)(0xB6FA2C));

        DWORD* dwLenX = (DWORD*)(0xC17044);
        DWORD* dwLenY = (DWORD*)(0xC17048);

        vecScreen->x = (vecWorld->z * m._31) + (vecWorld->y * m._21) + (vecWorld->x * m._11) + m._41;
        vecScreen->y = (vecWorld->z * m._32) + (vecWorld->y * m._22) + (vecWorld->x * m._12) + m._42;
        vecScreen->z = (vecWorld->z * m._33) + (vecWorld->y * m._23) + (vecWorld->x * m._13) + m._43;

        double    fRecip = (double)1.0 / vecScreen->z;
        vecScreen->x *= (float)(fRecip * (*dwLenX));
        vecScreen->y *= (float)(fRecip * (*dwLenY));
    }

    void CalcWorldCoors(CVector* vecScreen, CVector* vecWorld)
    {
        D3DXMATRIXA16 m((float*)(0xB6FA2C));

        D3DXMATRIXA16 minv;
        memset(&minv, 0, sizeof(D3DXMATRIXA16));
        m._44 = 1.0f;

        D3DXMatrixInverse(&minv, NULL, &m);

        DWORD* dwLenX = (DWORD*)(0xC17044);
        DWORD* dwLenY = (DWORD*)(0xC17048);

        float fRecip = 1.0f / vecScreen->z;
        vecScreen->x /= fRecip * (*dwLenX);
        vecScreen->y /= fRecip * (*dwLenY);

        vecWorld->x = vecScreen->z * minv._31 + vecScreen->y * minv._21 + vecScreen->x * minv._11 + minv._41;
        vecWorld->y = vecScreen->z * minv._32 + vecScreen->y * minv._22 + vecScreen->x * minv._12 + minv._42;
        vecWorld->z = vecScreen->z * minv._33 + vecScreen->y * minv._23 + vecScreen->x * minv._13 + minv._43;
    }
 

moreveal

Известный
Модератор
944
655
как можно реализовать функцию convertScreenCoordsToWorld3D с луа на плюсы
чат гпт выдовал такой код

C++:
#include <plugin.h>
#include <game_sa/CCamera.h>
#include <game_sa/CWorld.h>
#include <game_sa/CColPoint.h>

bool ConvertScreenCoordsToWorld3D(float screenX, float screenY, float& outX, float& outY, float& outZ)
{
    auto viewMatrix = *(RwMatrix*)0xB6FA2C;
    CCamera* cam = TheCamera;

    float screenW = static_cast<float>(*reinterpret_cast<DWORD*>(0xC17044));
    float screenH = static_cast<float>(*reinterpret_cast<DWORD*>(0xC17048));

    float nx = (2.0f * screenX / screenW) - 1.0f;
    float ny = 1.0f - (2.0f * screenY / screenH); // перевёрнутый Y

    CVector forward(viewMatrix.at.x, viewMatrix.at.y, viewMatrix.at.z);
    CVector right(viewMatrix.right.x, viewMatrix.right.y, viewMatrix.right.z);
    CVector up(viewMatrix.up.x, viewMatrix.up.y, viewMatrix.up.z);

    float fov = cam->m_fFOV;
    float aspect = screenW / screenH;
    float fovRad = fov * 3.14159f / 180.0f;
    float tanFov = tanf(fovRad / 2.0f);

    CVector rayDir = forward + right * nx * aspect * tanFov + up * ny * tanFov;
    rayDir.Normalise();

    CVector camPos = *cam->GetGameCamPosition();
    CVector rayEnd = camPos + rayDir * 3000.0f; // дальность луча

    CColPoint col;
    CEntity* pHitEntity = nullptr;

    // трассировка с фильтрацией воды и прочего
    if (CWorld::ProcessLineOfSight(
            camPos, rayEnd, col, pHitEntity,
            true, true, true, true, false, true, false))
    {
        outX = col.m_vecPoint.x;
        outY = col.m_vecPoint.y;
        outZ = col.m_vecPoint.z;
        return true;
    }

    return false;
}
но он работает очень плохо и неправильно
напрямую с мунлодера спиздил взял, пусть тебе и скинули уже ответ, но зато оно идентично луашному convertScreenCoordsToWorld3D:
C++:
#include <d3d9.h>
#include <d3dx9.h>

void convertScreenCoordsToWorld3D(float screenX, float screenY, float depth, float* outX, float* outY, float* outZ)
{
    static const uintptr_t pGameCamera = 0x0B6F028;
    static const uintptr_t pRsGlobal   = 0x0C17040;

    D3DXMATRIX cameraMatrix;
    std::memcpy(&cameraMatrix, reinterpret_cast<void*>(pGameCamera + 0xA04), sizeof(D3DXMATRIX));

    cameraMatrix._44 = 1.0f;
    D3DXMATRIX inverseMatrix;
    if (!D3DXMatrixInverse(&inverseMatrix, nullptr, &cameraMatrix))
        return;

    int screenWidth  = *reinterpret_cast<int*>(pRsGlobal + 4);
    int screenHeight = *reinterpret_cast<int*>(pRsGlobal + 8);
    if (screenWidth <= 0 || screenHeight <= 0 || depth == 0.0f)
        return;

    double invDepth = 1.0 / static_cast<double>(depth);
    double normX = static_cast<double>(screenX) / (screenWidth * invDepth);
    double normY = static_cast<double>(screenY) / (screenHeight * invDepth);

    auto dx = static_cast<float>(normX);
    auto dy = static_cast<float>(normY);
    auto dz = depth;

    *outX = inverseMatrix._11 * dx + inverseMatrix._21 * dy + inverseMatrix._31 * dz + inverseMatrix._41;
    *outY = inverseMatrix._12 * dx + inverseMatrix._22 * dy + inverseMatrix._32 * dz + inverseMatrix._42;
    *outZ = inverseMatrix._13 * dx + inverseMatrix._23 * dy + inverseMatrix._33 * dz + inverseMatrix._43;
}
 
Последнее редактирование:
  • Нравится
Реакции: ARMOR