diff --git a/CameraAI~/CHANGELOG.md b/CameraAI~/CHANGELOG.md index babd7cd..20f6038 100644 --- a/CameraAI~/CHANGELOG.md +++ b/CameraAI~/CHANGELOG.md @@ -214,3 +214,7 @@ ## 0.4.5 - Rebuilt the frozen worker so portable prepared-template rotation conversion is included in the executable. +## 0.4.6 + +- Added a soft front-facing preference so safe candidates do not systematically place the actor's back toward the camera. +- Bumped candidate cache logic version to invalidate stale orientation candidates. diff --git a/CameraAI~/Tools~/CWCameraWorker/CWCameraWorker.exe b/CameraAI~/Tools~/CWCameraWorker/CWCameraWorker.exe index 84e133f..d5d38f0 100644 --- a/CameraAI~/Tools~/CWCameraWorker/CWCameraWorker.exe +++ b/CameraAI~/Tools~/CWCameraWorker/CWCameraWorker.exe @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:e25e3319e2538737ea5fd725b9a1fe5b85a7aa9f34763d76b659dd26b8ced4af -size 23444601 +oid sha256:456810ce63d758f3174fc5c9e2bad1dcac0f6ea0a2e7c6784d39d979b11f964c +size 23444760 diff --git a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/generate_hybrid.py b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/generate_hybrid.py index 9f4a2ab..96952ed 100644 --- a/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/generate_hybrid.py +++ b/CameraAI~/Tools~/CWCameraWorker/_internal/cwai_sources/repository/MachineLearning/CameraDirector/generate_hybrid.py @@ -122,15 +122,15 @@ SEED_VARIATION_MAX_NORMAL_CANDIDATES = 16 SEED_VARIATION_MAX_SELECTION_SCORE_DELTA = 2.0 GENERATION_PERFORMANCE_SCHEMA_VERSION = "hybrid-generation-performance-v1" PREPARATION_LOGIC_CONTRACT_VERSION = "hybrid-preparation-logic-v2" -CANDIDATE_LOGIC_CONTRACT_VERSION = "hybrid-candidate-logic-v15" +CANDIDATE_LOGIC_CONTRACT_VERSION = "hybrid-candidate-logic-v16-front-facing" CANDIDATE_CACHE_STAGE_VERSIONS = { "shotSegmentation": "data-driven-candidates-ranker-global-dag-v1", "shotPlanning": "hierarchical-or-legacy-reconciliation-replay-v3-static-budget", - "candidateRanking": ( - "template-rank-v11-adjacent-transition-v3-no-forced-side-alternation" + "candidateRanking": ( + "template-rank-v12-front-facing-adjacent-transition-v3-no-forced-side-alternation" ), "trajectoryRetargeting": ( - "retarget-v17-c2-yamo-turn-kinematics-semantic-baked-aim" + "retarget-v18-front-facing-c2-yamo-turn-kinematics-semantic-baked-aim" ), "compositionSafety": "person-safety-v9-derived-semantic-envelope", "variationPool": ( @@ -4685,6 +4685,23 @@ def retarget_template_to_shot( motion_quality["motionSelectionAdjustment"] + translation_kinematic_penalty ) + root_forward = train.quat_rotate( + root_rotation, + np.broadcast_to( + np.asarray([0.0, 0.0, 1.0], dtype=np.float32), + root_rotation.shape[:1] + (3,), + ), + ) + camera_offset = camera_world_position - root_position + camera_offset /= np.maximum( + np.linalg.norm(camera_offset, axis=1, keepdims=True), + 1e-5, + ) + front_facing_alignment = float( + np.median(np.sum(root_forward * camera_offset, axis=1)) + ) + front_facing_penalty = max(0.0, -front_facing_alignment) * 3.0 + quality_score += front_facing_penalty transition_state = adjacent_transition.build_transition_state( camera_world_position, camera_world_rotation, @@ -4744,6 +4761,8 @@ def retarget_template_to_shot( "realizedMotionType": realized_motion_type, "composition": composition_metrics, "motionQuality": motion_quality, + "frontFacingAlignment": front_facing_alignment, + "frontFacingPenalty": front_facing_penalty, "qualityScore": float(quality_score), } diff --git a/CameraAI~/package.json b/CameraAI~/package.json index 9344ca0..0e155d0 100644 --- a/CameraAI~/package.json +++ b/CameraAI~/package.json @@ -1,6 +1,6 @@ { "name": "com.mingle.cw-ai", - "version": "0.4.5", + "version": "0.4.6", "displayName": "Mingle Camera Work AI", "description": "Self-contained high-quality Unity Timeline camera generation with an embedded prepared reference library, per-shot editable clips, and A/B review tools.", "unity": "6000.0",