RedM Camera Helper: A Comprehensive Camera Utility for Game Development
- Published on
- • 4 mins read•--- views
RedM Camera Helper Utility
The CameraHelper utility is a powerful tool for RedM game developers who need to interact with the game camera system. This utility provides a comprehensive set of functions for camera manipulation, coordinate conversion, and entity detection through raycasting.
Features
The utility includes several key functions that make camera-related operations more manageable:
- Camera position and rotation tracking
- Coordinate system conversions
- Raycasting for entity detection
- Mathematical utilities for camera calculations
Implementation
Here's the complete implementation of the CameraHelper utility:
CameraHelper = {
GetPosition = function()
return GetGameplayCamCoord()
end,
GetRotation = function(unk)
return GetGameplayCamRot(unk)
end,
DegToRad = function (degs)
return degs * 3.141592653589793 / 180
end,
RotationToDirection = function(rotation)
local z = math.rad(rotation.z)
local x = math.rad(rotation.x)
local num = math.abs(math.cos(x))
return vector3(-math.sin(z) * num, math.cos(z) * num, math.sin(x))
end,
WorldToScreenRel = function(worldCoords)
local check, x, y = GetScreenCoordFromWorldCoord(worldCoords.x, worldCoords.y, worldCoords.z)
if not check then
return false
end
screenCoordsx = (x - 0.5) * 2.0
screenCoordsy = (y - 0.5) * 2.0
return true, screenCoordsx, screenCoordsy
end,
ScreenToWorld = function(giveX, giveY)
local camVec2, camVec21
camRot = CameraHelper.GetRotation(2) + vec3(0, 45.0, 0.0)
camPos = CameraHelper.GetPosition()
direction = CameraHelper.RotationToDirection(camRot)
camVec3 = camRot + vec3(10.0, 0.0, 0.0)
camVec31 = camRot + vec3(-10.0, 0.0, 0.0)
camVec32 = camRot + vec3(0.0, 0.0, -10.0)
direction1 = CameraHelper.RotationToDirection(camRot + vec3(0.0, 0.0, 10.0)) - CameraHelper.RotationToDirection(camVec32)
direction2 = CameraHelper.RotationToDirection(camVec3) - CameraHelper.RotationToDirection(camVec31)
local rad = CameraHelper.DegToRad(camRot.y)
camVec33 = (direction1 * math.cos(rad)) - (direction2 * math.sin(rad))
camVec34 = (direction1 * math.sin(rad)) + (direction2 * math.cos(rad))
local find, screenX, screenY = CameraHelper.WorldToScreenRel(((camPos + (direction * 10.0)) + camVec33) + camVec34)
if not find then
return camPos + (direction * 10.0)
else
camVec2 = vec2(screenX, screenY)
end
local find2, screenX2, screenY2 = CameraHelper.WorldToScreenRel(camPos + (direction * 10.0))
if not find2 then
return camPos + (direction * 10.0)
else
camVec21 = vec2(screenX2, screenY2)
end
if math.abs(camVec2.x - camVec21.x) < 0.001 or math.abs(camVec2.y - camVec21.y) < 0.001 then
return camPos + (direction * 10.0)
end
local x = (giveX - camVec21.x) / (camVec2.x - camVec21.x)
local y = (giveY - camVec21.y) / (camVec2.y - camVec21.y)
return ((camPos + (direction * 10.0)) + (camVec33 * x) + (camVec34 * y))
end,
RaycastForEntity = function(screenCoord, ignoreEntity, maxDistance)
local world = CameraHelper.ScreenToWorld(screenCoord.x, screenCoord.y)
local camVec3 = CameraHelper.GetPosition()
local camVec4 = world - camVec3
camVec4 = norm(camVec4)
local ray = StartShapeTestRay(camVec3 + (camVec4 * 1.0), camVec3 + (camVec4 * maxDistance), -1, ignoreEntity)
local _, _, _, _, entity = GetShapeTestResult(ray)
return entity
end
}
Function Documentation
Camera Position and Rotation
GetPosition()
Returns the current position of the gameplay camera as a vector3.
local cameraPosition = CameraHelper.GetPosition()
GetRotation(unk)
Returns the current rotation of the gameplay camera. The unk parameter is typically set to 2.
local cameraRotation = CameraHelper.GetRotation(2)
Coordinate Conversions
WorldToScreenRel(worldCoords)
Converts world coordinates to screen relative coordinates.
local success, screenX, screenY = CameraHelper.WorldToScreenRel(worldCoords)
ScreenToWorld(giveX, giveY)
Converts screen coordinates to world coordinates.
local worldCoords = CameraHelper.ScreenToWorld(0.5, 0.5)
Entity Detection
RaycastForEntity(screenCoord, ignoreEntity, maxDistance)
Performs a raycast from the screen position to detect entities.
local entity = CameraHelper.RaycastForEntity(
vec2(0.5, 0.5), -- Screen position vector2
PlayerPedId(), -- Ignore self
10.0 -- Max distance
)
Utility Functions
DegToRad(degs)
Converts degrees to radians.
local radians = CameraHelper.DegToRad(90)
RotationToDirection(rotation)
Converts a rotation vector to a direction vector.
local direction = CameraHelper.RotationToDirection(rotation)
Example Usage
Here's a practical example of using the CameraHelper to detect an entity in the middle of the screen:
local entity = CameraHelper.RaycastForEntity(
vec2(0.5, 0.5), -- Screen position vector2
PlayerPedId(), -- Ignore self
10.0 -- Max distance
)
print(entity) -- Prints the detected entity ID
License
This utility is released under the MIT License. See the original source for full license text.
Credits
Original implementation by kasuganosoras.
Conclusion
The CameraHelper utility provides a robust foundation for camera-related operations in RedM development. Whether you're working on a complex camera system or simply need to detect entities in the player's view, this utility offers the essential functions you need.
Join Our Community!
Get help, share ideas, get free scripts, and connect with other RedM enthusiasts in our Discord server.
Join Discord