Merge pull request #1 from RuanLucasGD/implement-method-to-check-if-world-position-is-within-camera-view
Implement method to check if world position is within camera view
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
#include "Engine/Core/Math/Viewport.h"
|
||||
#include "Engine/Content/Assets/Model.h"
|
||||
#include "Engine/Content/Content.h"
|
||||
#include "Engine/Engine/Screen.h"
|
||||
#include "Engine/Serialization/Serialization.h"
|
||||
#if USE_EDITOR
|
||||
#include "Editor/Editor.h"
|
||||
@@ -120,6 +121,37 @@ void Camera::ProjectPoint(const Vector3& worldSpaceLocation, Float2& cameraViewp
|
||||
cameraViewportSpaceLocation = Float2(clipSpaceLocation);
|
||||
}
|
||||
|
||||
bool Camera::IsPointOnView(const Vector3& worldSpaceLocation) const
|
||||
{
|
||||
Camera* mainCamera = Camera::GetMainCamera();
|
||||
|
||||
if (!mainCamera)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Vector3 cameraUp = mainCamera->GetTransform().GetUp();
|
||||
Vector3 cameraForward = mainCamera->GetTransform().GetForward();
|
||||
Vector3 directionToPosition = (worldSpaceLocation- mainCamera->GetPosition()).GetNormalized();
|
||||
|
||||
if (Vector3::Dot(cameraForward, directionToPosition) < 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Quaternion lookAt = Quaternion::LookRotation(directionToPosition, cameraUp);
|
||||
Vector3 lookAtDirection = lookAt * Vector3::Forward;
|
||||
Vector3 newWorldLocation = mainCamera->GetPosition() + lookAtDirection;
|
||||
|
||||
Float2 windowSpace = Float2();
|
||||
Float2 screenSize = Screen::GetSize();
|
||||
|
||||
mainCamera->ProjectPoint(newWorldLocation, windowSpace);
|
||||
|
||||
return (windowSpace.X >= 0 && windowSpace.X <= screenSize.X) &&
|
||||
(windowSpace.Y >= 0 && windowSpace.Y <= screenSize.Y);
|
||||
}
|
||||
|
||||
Ray Camera::ConvertMouseToRay(const Float2& mousePosition) const
|
||||
{
|
||||
return ConvertMouseToRay(mousePosition, GetViewport());
|
||||
|
||||
@@ -168,6 +168,13 @@ public:
|
||||
/// <param name="viewport">The viewport.</param>
|
||||
API_FUNCTION() void ProjectPoint(const Vector3& worldSpaceLocation, API_PARAM(Out) Float2& cameraViewportSpaceLocation, API_PARAM(Ref) const Viewport& viewport) const;
|
||||
|
||||
/// <summary>
|
||||
/// Checks if the 3d point of the world is in the camera's field of view.
|
||||
/// </summary>
|
||||
/// <param name="worldSpaceLocation">World Position (XYZ)</param>
|
||||
/// <returns>Returns true if the point is within the field of view</returns>
|
||||
API_FUNCTION() bool IsPointOnView(const Vector3& worldSpaceLocation) const;
|
||||
|
||||
/// <summary>
|
||||
/// Converts the mouse position to 3D ray.
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user