Quantcast

Jump to content

» «
Photo

[C++| Source] Camera Matrix (Right, Forward, Up, Position)

1 reply to this topic
HeresOtis
  • HeresOtis

    SA C++ Whiz

  • Feroci
  • Joined: 29 Apr 2011
  • United-States

#1

Posted 04 June 2017 - 06:14 AM Edited by HeresOtis, 04 June 2017 - 06:15 AM.

I have adapted this from ScripthookDotNet source. All credits to them.

GTA V Coordinate System
x +ve = right, -ve = left | pitch
y +ve = front, -ve = behind | roll
z +ve = up, -ve = down | yaw
#include <Psapi.h>

uintptr_t FindPattern(const char *pattern, const char *mask)
{
	MODULEINFO module = {};
	GetModuleInformation(GetCurrentProcess(), GetModuleHandle(nullptr), &module, sizeof(MODULEINFO));

	auto *address = reinterpret_cast<const char *>(module.lpBaseOfDll), *address_end = address + module.SizeOfImage;
	const auto mask_length = static_cast<size_t>(strlen(mask) - 1);

	for (size_t i = 0; address < address_end; address++)
	{
		if (*address == pattern[i] || mask[i] == '?')
		{
			if (mask[i + 1] == '\0')
			{
				return reinterpret_cast<uintptr_t>(address) - mask_length;
			}
			i++;
		}
		else
		{
			i = 0;
		}
	}

	return 0;
}

struct Vec3
{
	float x, y, z;
};

void GetGameplayCameraVectors()
{
	uintptr_t address = FindPattern("\x48\x8B\xC7\xF3\x0F\x10\x0D", "xxxxxxx") - 0x1D;
	address = address + *reinterpret_cast<int*>(address) + 4;
	uint64_t* _gamePlayCameraAddr = reinterpret_cast<uint64_t*>(*reinterpret_cast<int*>(address + 3) + address + 7);
	Vec3 right = *(Vec3*)(*_gamePlayCameraAddr + 0x1F0);	
	// right.x = *(float*)(*_gamePlayCameraAddr + 0x1F0);
	// right.y = *(float*)(*_gamePlayCameraAddr + 0x1F4);
	// right.z = *(float*)(*_gamePlayCameraAddr + 0x1F8);

	Vec3 forward = *(Vec3*)(*_gamePlayCameraAddr + 0x200);
	// forward.x = *(float*)(*_gamePlayCameraAddr + 0x200);
	// forward.y = *(float*)(*_gamePlayCameraAddr + 0x204);
	// forward.z = *(float*)(*_gamePlayCameraAddr + 0x208);

	Vec3 up = *(Vec3*)(*_gamePlayCameraAddr + 0x210);
	// up.x = *(float*)(*_gamePlayCameraAddr + 0x210);
	// up.y = *(float*)(*_gamePlayCameraAddr + 0x214);
	// up.z = *(float*)(*_gamePlayCameraAddr + 0x218);

	Vec3 pos = *(Vec3*)(*_gamePlayCameraAddr + 0x220);	
	// pos.x = *(float*)(*_gamePlayCameraAddr + 0x220);
	// pos.y = *(float*)(*_gamePlayCameraAddr + 0x224);
	// pos.z = *(float*)(*_gamePlayCameraAddr + 0x228);
}

unknown modder
  • unknown modder

    Bon Jon Bovi

  • Members
  • Joined: 04 Jul 2012
  • United-Kingdom

#2

Posted 04 June 2017 - 02:52 PM Edited by unknown modder, 04 June 2017 - 02:54 PM.

You've turned not nice looking code I wrote in the shvdn source and made it worse.

A nicer way of doing it would be to define a matrix struct 

struct alignas(0x10) vector3_t {
	float x;
	float y;
	float z;
	// float w;//probably not important
};

struct alignas(0x10) matrix_t {
	vector3_t right;
	vector3_t forward;
	vector3_t up;
	vector3_t position;
};

then just return the pointer to that matrix. If you wanna be really smart you can define the vector3_t as a xmm register for faster operations on them

  • Fun 2 likes this




1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users