载入中...
搜索中...
未找到
CombatCamera.cpp
浏览该文件的文档.
2
3#include <cmath>
4
5namespace eve::combat {
6namespace {
7
8bool finite3(CombatVector3 value) { return std::isfinite(value.x) && std::isfinite(value.y) && std::isfinite(value.z); }
9
10double lengthXZ(CombatVector3 value) { return std::hypot(value.x, value.z); }
11
12CombatVector3 normalizedXZ(CombatVector3 value) {
13 const double magnitude = lengthXZ(value);
14 if (magnitude <= 0.0) return {0.0, 0.0, 1.0};
15 return {value.x / magnitude, 0.0, value.z / magnitude};
16}
17
18} // namespace
19
21 if (!finite3(player) || !finite3(playerFacing)) return Result<void>::failure(
22 Diagnostic::error(DiagnosticCode::InvalidArgument, "camera player pose is invalid", "player"));
23 if (lockTarget && !finite3(*lockTarget)) return Result<void>::failure(
24 Diagnostic::error(DiagnosticCode::InvalidArgument, "camera lock target is invalid", "lockTarget"));
25 if (!std::isfinite(distance) || distance <= 0.0) return Result<void>::failure(
26 Diagnostic::error(DiagnosticCode::InvalidArgument, "camera distance is invalid", "distance"));
27 if (!std::isfinite(height) || !std::isfinite(lookHeight)) return Result<void>::failure(
28 Diagnostic::error(DiagnosticCode::InvalidArgument, "camera height is invalid", "height"));
29 return Result<void>::success();
30}
31
33 auto valid = request.validate();
34 if (!valid) return Result<CombatCameraView>::failure(valid.status());
35
36 CombatVector3 back = normalizedXZ({-request.playerFacing.x, 0.0, -request.playerFacing.z});
37 CombatVector3 look = {request.player.x, request.player.y + request.lookHeight, request.player.z};
38 if (request.lockTarget) {
39 look = {(request.player.x + request.lockTarget->x) * 0.5,
40 (request.player.y + request.lockTarget->y) * 0.5 + request.lookHeight,
41 (request.player.z + request.lockTarget->z) * 0.5};
42 CombatVector3 toTarget{request.lockTarget->x - request.player.x, 0.0, request.lockTarget->z - request.player.z};
43 if (lengthXZ(toTarget) > 1e-6) back = normalizedXZ({-toTarget.x, 0.0, -toTarget.z});
44 }
46 view.lookAt = look;
47 view.eye = {request.player.x + back.x * request.distance, request.player.y + request.height,
48 request.player.z + back.z * request.distance};
50}
51
52} // namespace eve::combat
double value
Lock-on framing math owned by combat, consumed by any camera.
const GltfImportRequest & request
bool valid
glm::mat4 view
static Diagnostic error(DiagnosticCode code, std::string message, std::string path={}, DiagnosticDetails details={}, std::string source={})
Construct an error diagnostic with the standard error severity.
Definition Diagnostic.h:125
Move-only operation result carrying either a value or Status.
Definition Result.h:155
static Result success(T value)
Construct a successful result owning value.
Definition Result.h:164
static Result failure(Status status)
Construct a failed result from a structured status.
Definition Result.h:175
static Result< CombatCameraView > solve(const CombatCameraFramingRequest &request)
Solve one view from owning request data.
Framing inputs for a two-subject combat camera.
std::optional< CombatVector3 > lockTarget
Result< void > validate() const
Reject non-finite poses or non-positive distance/height.
Owning eye/look-at pair; camera modules apply this without owning combat state.
Finite 3D combat vector.