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;
}