|
11精币
void MultiplyMatrices(float* out, float* a, float* b)
{
int size = 16;
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
float sum = 0.f;
for (int k = 0; k < 4; k++)
{
sum = sum + a[i * 4 + k] * b[k * 4 + j];
}
out[i * 4 + j] = sum;
}
}
}
BOOL WorldToScreen(const Vector3& pos, Vector2* screenPos)
{
BYTE buff[128];
float viewMatrix[16], projMatrix[16], viewProjMatrix[16];
ReadProcessMemory(g_handle, (LPVOID)(噜阿噜 + Matrix), &buff, 128, 0);
memcpy(viewMatrix, buff, 64);
memcpy(projMatrix, &buff[16 * sizeof(float)], 64);
MultiplyMatrices(viewProjMatrix, viewMatrix, projMatrix);
// 裁剪坐标ClipCoordinates
Vector4 clipCoords;
clipCoords.x = pos.x * viewProjMatrix[0] + pos.y * viewProjMatrix[4] + pos.z * viewProjMatrix[8] + viewProjMatrix[12];
clipCoords.y = pos.x * viewProjMatrix[1] + pos.y * viewProjMatrix[5] + pos.z * viewProjMatrix[9] + viewProjMatrix[13];
//clipCoords.z = pos.x * viewProjMatrix[2] + pos.y * viewProjMatrix[6] + pos.z * viewProjMatrix[10] + viewProjMatrix[14];
clipCoords.w = pos.x * viewProjMatrix[3] + pos.y * viewProjMatrix[7] + pos.z * viewProjMatrix[11] + viewProjMatrix[15];
// 不在视野范围
if (clipCoords.w < 1.0f) return FALSE;
// 计算标准设备坐标 Normalized Device Coordinates, NDC
float x, y;
x = clipCoords.x / clipCoords.w;
y = clipCoords.y / clipCoords.w;
// 计算屏幕坐标
(*screenPos).x = ((float)g_gameWindowSize.x / 2.f * x) + (x + (float)g_gameWindowSize.x / 2.f);
(*screenPos).y = -((float)g_gameWindowSize.y / 2.f * y) + (y + (float)g_gameWindowSize.y / 2.f);
return TRUE;
}
|
|