U5.5 Feinschliff: aufrechte Haltung, kleinere Bastion und Balliste
calm in figure.json dämpft Kopf, Hals, Wirbelsäule und Hüfte in Leerlauf und Gang für die sechs Figuren ohne echten Kopf (Gang 34 -> 11 Grad Neigung beim Herdhüter); Basaltbastion skaliert 0,84, Glasballiste auf 1,9 m Länge. Tests grün, Fingerabdrücke unverändert. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
c144a96706
commit
dd78c8dbfe
35 changed files with 55325 additions and 55237 deletions
|
|
@ -265,11 +265,11 @@
|
|||
"props": []
|
||||
},
|
||||
"inputs_sha256": {
|
||||
"tools/meshy/g07/figure.json": "6d7066a42c7c4b71ad6f7bb7569311cc7210156fde9a7fadc0eddc5bd6a00c7f",
|
||||
"tools/meshy/g07/figure.json": "b33bf1f6580bc1d683354f04956442869727699e01c7456cfc8fdcfc879a9f42",
|
||||
"assets-source/meshy/g07/aschenwerfer-skelett.glb": "d9b311fdc33d18df89dcdd3a88be879079ac40d48f9e14d8ded90ed4c532be7f",
|
||||
"assets-source/meshy/g07/aschenwerfer-animationen.glb": "6211206d4df5bfc3dee511cca1a92f31a8a19a23986265d30f169339589f7e11"
|
||||
},
|
||||
"source_sha256": "4d5cdab415e4bfa97abe420f7457d4e1cddd67b9a76c23ccb6f9313a2fd8ea4e",
|
||||
"source_sha256": "c933c6a13c2938f90f3eb063bcabb98ffddd9ab2deb55e808c32009ab2965bf3",
|
||||
"removed_modifiers": 0,
|
||||
"kind": "skinned",
|
||||
"fps": 24.0,
|
||||
|
|
@ -486,6 +486,6 @@
|
|||
"meshes_without_uv": [],
|
||||
"triangles": 25282,
|
||||
"fbx": "Assets/Luneraria/Art/Characters/aschenwerfer.fbx",
|
||||
"fbx_bytes": 3234540,
|
||||
"fbx_bytes": 3232540,
|
||||
"ok": true
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -265,11 +265,11 @@
|
|||
"props": []
|
||||
},
|
||||
"inputs_sha256": {
|
||||
"tools/meshy/g04/figure.json": "e958eb4b42c8ec9409333b175a8f2a7de9c48c0a114d53baf8409374d504789b",
|
||||
"tools/meshy/g04/figure.json": "892798e08fced79757056488cf500ddf03f64582987a3e1e64addb9e2c90abbf",
|
||||
"assets-source/meshy/g04/basaltbastion-skelett.glb": "b11b840bfae8bd157c1155945d4964ca31f7c36fc3043c2442c28e8ffc1f4807",
|
||||
"assets-source/meshy/g04/basaltbastion-animationen.glb": "5e3dc878f1ac1de23f25cedf5e694f4f60a10929bebec6b0e38f6b86f8c79cfa"
|
||||
},
|
||||
"source_sha256": "4d5cdab415e4bfa97abe420f7457d4e1cddd67b9a76c23ccb6f9313a2fd8ea4e",
|
||||
"source_sha256": "c933c6a13c2938f90f3eb063bcabb98ffddd9ab2deb55e808c32009ab2965bf3",
|
||||
"removed_modifiers": 0,
|
||||
"kind": "skinned",
|
||||
"fps": 24.0,
|
||||
|
|
@ -301,14 +301,14 @@
|
|||
],
|
||||
"bounds_unity": {
|
||||
"min": [
|
||||
-1.194,
|
||||
-1.003,
|
||||
0.0,
|
||||
-0.5224
|
||||
-0.4388
|
||||
],
|
||||
"max": [
|
||||
1.194,
|
||||
2.1,
|
||||
0.5224
|
||||
1.003,
|
||||
1.764,
|
||||
0.4388
|
||||
]
|
||||
}
|
||||
},
|
||||
|
|
@ -338,14 +338,14 @@
|
|||
],
|
||||
"bounds_unity": {
|
||||
"min": [
|
||||
-1.1906,
|
||||
-1.0001,
|
||||
-0.0,
|
||||
-0.5222
|
||||
-0.4387
|
||||
],
|
||||
"max": [
|
||||
1.1924,
|
||||
2.0997,
|
||||
0.5241
|
||||
1.0016,
|
||||
1.7637,
|
||||
0.4402
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -387,14 +387,14 @@
|
|||
"empties": {},
|
||||
"bounds_unity": {
|
||||
"min": [
|
||||
-1.194,
|
||||
-1.003,
|
||||
-0.0,
|
||||
-0.5224
|
||||
-0.4388
|
||||
],
|
||||
"max": [
|
||||
1.194,
|
||||
2.1,
|
||||
0.5241
|
||||
1.003,
|
||||
1.764,
|
||||
0.4402
|
||||
]
|
||||
},
|
||||
"clips": [
|
||||
|
|
@ -486,6 +486,6 @@
|
|||
"meshes_without_uv": [],
|
||||
"triangles": 25178,
|
||||
"fbx": "Assets/Luneraria/Art/Characters/basaltbastion_meshy.fbx",
|
||||
"fbx_bytes": 3437660,
|
||||
"fbx_bytes": 3435820,
|
||||
"ok": true
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -169,32 +169,32 @@
|
|||
"height": 1.3865,
|
||||
"leg_x": 0.4311,
|
||||
"weapon_z": 1.1316,
|
||||
"tip_y": -1.2943,
|
||||
"back_y": 1.232,
|
||||
"tip_y": -0.9734,
|
||||
"back_y": 0.9266,
|
||||
"bow_x": 0.9306,
|
||||
"bow_y": 0.0911
|
||||
"bow_y": 0.0685
|
||||
},
|
||||
"rig_scale": 0.9671,
|
||||
"weights": {
|
||||
"Pelvis": 3922,
|
||||
"Spine": 1159,
|
||||
"Weapon": 9305,
|
||||
"Gear": 823,
|
||||
"Pelvis": 4782,
|
||||
"Spine": 1616,
|
||||
"Weapon": 7790,
|
||||
"Gear": 957,
|
||||
"Draw": 0,
|
||||
"Bolt": 0,
|
||||
"Quarrel": 284,
|
||||
"Limb.L": 221,
|
||||
"LimbTip.L": 397,
|
||||
"Limb.R": 190,
|
||||
"LimbTip.R": 428,
|
||||
"Thigh.L": 2413,
|
||||
"Shin.L": 2104,
|
||||
"Tarsus.L": 598,
|
||||
"Foot.L": 647,
|
||||
"Thigh.R": 2289,
|
||||
"Shin.R": 2128,
|
||||
"Tarsus.R": 709,
|
||||
"Foot.R": 649
|
||||
"Quarrel": 227,
|
||||
"Limb.L": 325,
|
||||
"LimbTip.L": 387,
|
||||
"Limb.R": 249,
|
||||
"LimbTip.R": 417,
|
||||
"Thigh.L": 2435,
|
||||
"Shin.L": 1968,
|
||||
"Tarsus.L": 759,
|
||||
"Foot.L": 588,
|
||||
"Thigh.R": 2309,
|
||||
"Shin.R": 1993,
|
||||
"Tarsus.R": 873,
|
||||
"Foot.R": 591
|
||||
},
|
||||
"clips": {
|
||||
"ability": {
|
||||
|
|
@ -261,12 +261,12 @@
|
|||
}
|
||||
},
|
||||
"inputs_sha256": {
|
||||
"tools/meshy/build_figure.py": "4d5cdab415e4bfa97abe420f7457d4e1cddd67b9a76c23ccb6f9313a2fd8ea4e",
|
||||
"tools/meshy/g06/figure.json": "157eeb4a1737ba23381fdf7665b73756b6a7427b02fe8074a1e15d206d15c81e",
|
||||
"tools/meshy/build_figure.py": "c933c6a13c2938f90f3eb063bcabb98ffddd9ab2deb55e808c32009ab2965bf3",
|
||||
"tools/meshy/g06/figure.json": "00719cd095645ea43c939560bd946d9ff688dfc7f6f2ac9de3b84e4c57736993",
|
||||
"assets-source/meshy/g06/glasballiste-modell.glb": "1e7efc1943c3c622e122f68d9dc954c3ae262a13eed66fecf1c8b26d97bcbb5a",
|
||||
"assets-source/meshy/g06/glasballiste-rig-phase19.blend": "3fae885ac47e031fc6cadd6fb5010774405548eca9a5d96e7e1a4859e7f7d590"
|
||||
},
|
||||
"source_sha256": "e67cdc167c162edddaa8e7d03f92e4574bf1c04ff0bbc60727ca49691e4d0b80",
|
||||
"source_sha256": "ff14c7425b5099b580fbd66aedc4d983d6433679f495092006d358c30e9b6123",
|
||||
"removed_modifiers": 0,
|
||||
"kind": "skinned",
|
||||
"fps": 24.0,
|
||||
|
|
@ -300,12 +300,12 @@
|
|||
"min": [
|
||||
-0.9194,
|
||||
0.0,
|
||||
-1.232
|
||||
-0.9266
|
||||
],
|
||||
"max": [
|
||||
0.9306,
|
||||
1.3865,
|
||||
1.2943
|
||||
0.9734
|
||||
]
|
||||
}
|
||||
},
|
||||
|
|
@ -335,14 +335,14 @@
|
|||
],
|
||||
"bounds_unity": {
|
||||
"min": [
|
||||
-0.9115,
|
||||
-0.0,
|
||||
-1.2321
|
||||
-0.9116,
|
||||
-0.0002,
|
||||
-0.9272
|
||||
],
|
||||
"max": [
|
||||
0.9199,
|
||||
0.92,
|
||||
1.389,
|
||||
1.2979
|
||||
0.9769
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -380,13 +380,13 @@
|
|||
"bounds_unity": {
|
||||
"min": [
|
||||
-0.9194,
|
||||
-0.0,
|
||||
-1.2321
|
||||
-0.0002,
|
||||
-0.9272
|
||||
],
|
||||
"max": [
|
||||
0.9306,
|
||||
1.389,
|
||||
1.2979
|
||||
0.9769
|
||||
]
|
||||
},
|
||||
"clips": [
|
||||
|
|
@ -478,6 +478,6 @@
|
|||
"meshes_without_uv": [],
|
||||
"triangles": 25392,
|
||||
"fbx": "Assets/Luneraria/Art/Characters/glasballiste_meshy.fbx",
|
||||
"fbx_bytes": 2783260,
|
||||
"fbx_bytes": 2784988,
|
||||
"ok": true
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -260,11 +260,11 @@
|
|||
"props": []
|
||||
},
|
||||
"inputs_sha256": {
|
||||
"tools/meshy/g09/figure.json": "b8fbf09467fb1a5bb4d21f460e3fb461036b271ef572b2763f2f83de95ed00a4",
|
||||
"tools/meshy/g09/figure.json": "422b877a0bdea26ef5686a13501e79137bc54ed0769e1c05ccd1fc1e6f551c8e",
|
||||
"assets-source/meshy/g09/herdhueter-skelett.glb": "713603b1de0beb153981506678d6715307b5b251e9354fbcda2658a86660c0c4",
|
||||
"assets-source/meshy/g09/herdhueter-animationen.glb": "c7a5c7338c29a2eb316fe650ca3b708ea533c8d84c07f9fa9d865351eefcce6b"
|
||||
},
|
||||
"source_sha256": "4d5cdab415e4bfa97abe420f7457d4e1cddd67b9a76c23ccb6f9313a2fd8ea4e",
|
||||
"source_sha256": "c933c6a13c2938f90f3eb063bcabb98ffddd9ab2deb55e808c32009ab2965bf3",
|
||||
"removed_modifiers": 0,
|
||||
"kind": "skinned",
|
||||
"fps": 24.0,
|
||||
|
|
@ -481,6 +481,6 @@
|
|||
"meshes_without_uv": [],
|
||||
"triangles": 25139,
|
||||
"fbx": "Assets/Luneraria/Art/Characters/herdhueter.fbx",
|
||||
"fbx_bytes": 3170028,
|
||||
"fbx_bytes": 3166988,
|
||||
"ok": true
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -265,11 +265,11 @@
|
|||
"props": []
|
||||
},
|
||||
"inputs_sha256": {
|
||||
"tools/meshy/g08/figure.json": "dcc6a39adf61d5815555a7abc2f99e3da6b493a0e47c65e21bf1d2e8553b961b",
|
||||
"tools/meshy/g08/figure.json": "fa9ab63b81d91063a41be5bfd06e8b3fbcef2fc38b06ff65eee5da6e495189f7",
|
||||
"assets-source/meshy/g08/kraterrufer-skelett.glb": "b2bd4f91696195b1afeb8a8d7b6fe777eb59785257100654f56fb71e4936923f",
|
||||
"assets-source/meshy/g08/kraterrufer-animationen.glb": "cb303a4a5023804e81c28af464cbcb69bb22171ece826c3b5d84023452a085b8"
|
||||
},
|
||||
"source_sha256": "4d5cdab415e4bfa97abe420f7457d4e1cddd67b9a76c23ccb6f9313a2fd8ea4e",
|
||||
"source_sha256": "c933c6a13c2938f90f3eb063bcabb98ffddd9ab2deb55e808c32009ab2965bf3",
|
||||
"removed_modifiers": 0,
|
||||
"kind": "skinned",
|
||||
"fps": 24.0,
|
||||
|
|
@ -486,6 +486,6 @@
|
|||
"meshes_without_uv": [],
|
||||
"triangles": 25500,
|
||||
"fbx": "Assets/Luneraria/Art/Characters/kraterrufer.fbx",
|
||||
"fbx_bytes": 3339692,
|
||||
"fbx_bytes": 3337532,
|
||||
"ok": true
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -261,14 +261,15 @@
|
|||
"lod1_vertices": 2505,
|
||||
"welded_triangles": 20145,
|
||||
"lod0_screen": 0.2
|
||||
}
|
||||
},
|
||||
"props": []
|
||||
},
|
||||
"inputs_sha256": {
|
||||
"tools/meshy/g03/figure.json": "6934efc31f06faeafa189ba5f399b66d1c6662871aa9fce0e6b6c44a1add9dd8",
|
||||
"tools/meshy/g03/figure.json": "e42f13c9f70259afabc6cae4a4517b7ed5921b12639e3d52119136204de11a58",
|
||||
"assets-source/meshy/g03/schlackenwacht-skelett.glb": "0c6477bdcb262c36b5df2d7de1580742ea2dc6f51aa7259ef4273c97f9bb7b29",
|
||||
"assets-source/meshy/g03/schlackenwacht-animationen.glb": "fdde8ad1b5ef713d4df1beb2c307054e1c83eaf552c8ddd986b11698aa159ec4"
|
||||
},
|
||||
"source_sha256": "9eb17a4e3dc7029b7031f3be85f6676877c521788835137eb199c352c5b35aa4",
|
||||
"source_sha256": "c933c6a13c2938f90f3eb063bcabb98ffddd9ab2deb55e808c32009ab2965bf3",
|
||||
"removed_modifiers": 0,
|
||||
"kind": "skinned",
|
||||
"fps": 24.0,
|
||||
|
|
@ -485,6 +486,6 @@
|
|||
"meshes_without_uv": [],
|
||||
"triangles": 25142,
|
||||
"fbx": "Assets/Luneraria/Art/Characters/schlackenwacht.fbx",
|
||||
"fbx_bytes": 3268972,
|
||||
"fbx_bytes": 3266956,
|
||||
"ok": true
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -260,11 +260,11 @@
|
|||
"props": []
|
||||
},
|
||||
"inputs_sha256": {
|
||||
"tools/meshy/g10/figure.json": "7af89173257a5e480af8d549feebad21bd8db412e19aa6fbb1b4b975848d893c",
|
||||
"tools/meshy/g10/figure.json": "f0b3a72d68b713b168444c318abee3ad1400c902f304b1fb0a8f2c2a96f693ab",
|
||||
"assets-source/meshy/g10/sonnenesse-skelett.glb": "103c4ef8eda9f180343938a69e2950a0dc554eed436ef5ebc1536b35fc1f887a",
|
||||
"assets-source/meshy/g10/sonnenesse-animationen.glb": "9f9b4495a0edf06f59860c2df95ba247d112654cfefa6ec5c6340298c5ba46d6"
|
||||
},
|
||||
"source_sha256": "4d5cdab415e4bfa97abe420f7457d4e1cddd67b9a76c23ccb6f9313a2fd8ea4e",
|
||||
"source_sha256": "c933c6a13c2938f90f3eb063bcabb98ffddd9ab2deb55e808c32009ab2965bf3",
|
||||
"removed_modifiers": 0,
|
||||
"kind": "skinned",
|
||||
"fps": 24.0,
|
||||
|
|
@ -481,6 +481,6 @@
|
|||
"meshes_without_uv": [],
|
||||
"triangles": 25460,
|
||||
"fbx": "Assets/Luneraria/Art/Characters/sonnenesse.fbx",
|
||||
"fbx_bytes": 3379420,
|
||||
"fbx_bytes": 3377708,
|
||||
"ok": true
|
||||
}
|
||||
|
|
|
|||
Binary file not shown.
File diff suppressed because it is too large
Load diff
|
|
@ -249,6 +249,16 @@ Hinweis: Die Projektdateien des .NET-Harness (`tools/dotnet/*/*.csproj`) fehlten
|
|||
| Befund | Größenrangfolge stimmt; Basaltbastion und Glasballiste deutlich größer; Meshy-Heer einheitlicher, in der Lane-Weite schwerer zu unterscheiden; Helligkeit gleich |
|
||||
| Commits | `luneraria/u5.5-heer` |
|
||||
|
||||
## U5.5 · Feinschliff
|
||||
|
||||
| Punkt | Ergebnis |
|
||||
| --- | --- |
|
||||
| Tests | EditMode 29/29, PlayMode 14/14 (Verify A–I 718/0), Player-Selbsttest 30/30, Asset-Prüfung ohne Fehler |
|
||||
| Parität | Fingerabdrücke unverändert (`DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`) |
|
||||
| Inhalt | Aufrechte Haltung in Leerlauf und Gang für sechs Figuren (`calm`), Basaltbastion ×0,84, Glasballiste 1,9 m lang; keine Credits |
|
||||
| Bild | `screenshots/u5.5-feinschliff/` |
|
||||
| Commits | `luneraria/u5.5-feinschliff` |
|
||||
|
||||
## Ausblick
|
||||
|
||||
Der Pilot entscheidet über eine Serie weiterer Meshy-Figuren (Kosten je Figur, Lizenz, Stilgleichheit). Offen bleiben außerdem Künstler-Sculpts für Anatomie/Gesicht/Haar, LOD und Material-Atlanten sowie die Build-Module für Windows und Linux.
|
||||
|
|
|
|||
|
|
@ -682,3 +682,12 @@ Befund:
|
|||
- **Nicht geprüft:** Animationen im Gegeneinander (Treffer, Tod) nur stichprobenweise in den Kampfbildern.
|
||||
|
||||
Vorschläge (offen, nicht umgesetzt): Ruhehaltung ohne Vorneigung für die Kessel-Figuren (eigener Leerlauf-Clip oder Kopfknochen ruhig stellen), die Basaltbastion auf rund 1,9 m Breite skalieren, die Glasballiste kürzen; eine eigene Erscheinung für die Heldin.
|
||||
|
||||
## U5.5 · Feinschliff nach der Gesamtprüfung
|
||||
|
||||
Stand 10. Oktober 2026, Zweig `luneraria/u5.5-feinschliff` (auf `luneraria/u5.5-heer`). Die zwei Vorschläge der Gesamtprüfung, ohne neue Meshy-Aufträge:
|
||||
|
||||
1. **Aufrechte Haltung** für die Figuren ohne echten Kopf (Schlackenwacht, Basaltbastion, Aschenwerfer, Kraterrufer, Herdhüter, Sonnenesse). `build_figure.py` kennt `calm` in `figure.json`: In `idle` und `walk` behalten die genannten Knochen nur einen Teil ihrer Drehung (Kopf und Hals 0, Wirbelsäule 0,3, Hüfte 0,4). Beim Herdhüter sinkt die Rumpfneigung im Gang von im Mittel 34° auf 11° (höchstens 46° → 16°), im Leerlauf blickt der Ofen nicht mehr nach unten; die Füße bleiben am Boden (tiefster Zeh 1–5 cm). Kesselschale und Kraterschale sind von oben wieder zu sehen.
|
||||
2. **Kleinere Grundfläche:** Basaltbastion mit `scale` 0,84 auf 2,01 × 1,76 × 0,88 m (vorher 2,39 × 2,10); sie bleibt die höchste Figur der Glutpakt. Glasballiste mit `length` 1,9 m entlang der Achse gestaucht (vorher 2,53 m, Breite 1,85 m und Höhe unverändert; `build_machine.py`, starre Teile vertragen das).
|
||||
|
||||
Prüfung: Export aller sieben Figuren 23/0 und bytegleich wiederholbar, Asset-Prüfung ohne Fehler, EditMode 29/29, PlayMode 14/14 (Verify 718/0), Fingerabdrücke unverändert, Player-Selbsttest 30/30. Bilder des Heeres: `screenshots/u5.5-feinschliff/` (gleiche Motive wie `u5.5-heer/nachher/`).
|
||||
|
|
|
|||
|
|
@ -1197,7 +1197,7 @@
|
|||
{
|
||||
"check": "bounds_axes_scale",
|
||||
"ok": true,
|
||||
"detail": "\"largest difference 0.00005 m; unity (-1.194, 0.000, -0.522) (1.194, 2.100, 0.524)\""
|
||||
"detail": "\"largest difference 0.00004 m; unity (-1.003, 0.000, -0.439) (1.003, 1.764, 0.440)\""
|
||||
},
|
||||
{
|
||||
"check": "skinned_mesh",
|
||||
|
|
@ -1241,14 +1241,14 @@
|
|||
"meshes_without_uv_and_tangents": 0,
|
||||
"degenerate_triangles_dropped": 0,
|
||||
"bounds_min": [
|
||||
-1.194001,
|
||||
-4.58623581E-05,
|
||||
-0.522353053
|
||||
-1.0029608,
|
||||
-3.852526E-05,
|
||||
-0.438776553
|
||||
],
|
||||
"bounds_max": [
|
||||
1.19400084,
|
||||
2.10000014,
|
||||
0.524057269
|
||||
1.00296068,
|
||||
1.76400018,
|
||||
0.440208077
|
||||
],
|
||||
"clips": [
|
||||
{
|
||||
|
|
@ -1889,7 +1889,7 @@
|
|||
{
|
||||
"check": "bounds_axes_scale",
|
||||
"ok": true,
|
||||
"detail": "\"largest difference 0.00003 m; unity (-0.919, 0.000, -1.232) (0.931, 1.389, 1.298)\""
|
||||
"detail": "\"largest difference 0.00003 m; unity (-0.919, 0.000, -0.927) (0.931, 1.389, 0.977)\""
|
||||
},
|
||||
{
|
||||
"check": "skinned_mesh",
|
||||
|
|
@ -1934,13 +1934,13 @@
|
|||
"degenerate_triangles_dropped": 0,
|
||||
"bounds_min": [
|
||||
-0.9193895,
|
||||
-2.81888861E-05,
|
||||
-1.23211074
|
||||
-0.000174398971,
|
||||
-0.9272205
|
||||
],
|
||||
"bounds_max": [
|
||||
0.930610538,
|
||||
1.38899112,
|
||||
1.29790878
|
||||
1.38901818,
|
||||
0.9769348
|
||||
],
|
||||
"clips": [
|
||||
{
|
||||
|
|
|
|||
11
docs/port/logs/u5.5-feinschliff/player-smoke.json
Normal file
11
docs/port/logs/u5.5-feinschliff/player-smoke.json
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"build": "OSXPlayer player, 6000.3.20f1, release",
|
||||
"device": "Mac17,2; Apple M5; Apple M5",
|
||||
"graphics_api": "Metal",
|
||||
"resolution": "1920x1080",
|
||||
"seconds": 11.6,
|
||||
"passed": ["Startbildschirm sichtbar", "Partie wartet: Spielcontroller und Treiber aus", "vor dem Start kein HUD", "„Allein spielen“ bedienbar", "Offline: Startbildschirm verborgen", "Offline: Spielcontroller und Treiber laufen", "Offline: HUD sichtbar", "Offline: neue Partie, Sitz 1 (Mid)", "Offline: Planung", "Offline: lokale Sitzung", "„Startaufstellung“ bedienbar", "Startaufstellung gekauft (3 Einheiten)", "„Bereit“ bedienbar", "Bereit: Kampf beginnt", "Kampf: Figuren im Feld", "„Menü“ bedienbar", "Verlassen-Dialog mit „Zum Menü“", "Zurück: Startbildschirm sichtbar", "Zurück: HUD verborgen", "Zurück: Spielcontroller und Treiber aus", "Zurück: Sitzung beendet", "Zurück: keine Figuren im Feld", "Zurück: Kamera ruht", "Zurück: „Allein spielen“ bedienbar", "Zweite Partie: Startbildschirm verborgen, HUD sichtbar", "Zweite Partie: neue Partie in der Planung", "SSAO folgt der Einstellung", "Option „Umgebungsverdeckung“ sichtbar", "Option schaltet SSAO um", "Option stellt SSAO zurück"],
|
||||
"failed": [],
|
||||
"photos": ["00-startbildschirm.jpg", "01-planung.jpg", "02-kampf.jpg", "03-verlassen.jpg", "04-zurueck-im-startbildschirm.jpg", "05-zweite-partie.jpg", "06-optionen.jpg"],
|
||||
"result": "PASS"
|
||||
}
|
||||
11
docs/port/logs/u5.5-feinschliff/scene-frame-rates.json
Normal file
11
docs/port/logs/u5.5-feinschliff/scene-frame-rates.json
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{
|
||||
"match": "seed 2, bots, speed 24x",
|
||||
"core_hash": "DCE95C96556F3A1A",
|
||||
"core_steps": 12690,
|
||||
"runs": [
|
||||
{"target": "30 fps", "frames": 815, "seconds": 27.155, "measured_fps": 30.013, "max_steps_per_frame": 20, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true},
|
||||
{"target": "60 fps", "frames": 1626, "seconds": 27.105, "measured_fps": 59.989, "max_steps_per_frame": 10, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true},
|
||||
{"target": "120 fps", "frames": 3222, "seconds": 26.914, "measured_fps": 119.716, "max_steps_per_frame": 10, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true},
|
||||
{"target": "unlimited", "frames": 85548, "seconds": 26.813, "measured_fps": 3190.509, "max_steps_per_frame": 6, "steps": 12690, "hash": "DCE95C96556F3A1A", "winner": 1, "same_as_core": true}
|
||||
]
|
||||
}
|
||||
16
docs/port/logs/u5.5-feinschliff/vertical-function-test.json
Normal file
16
docs/port/logs/u5.5-feinschliff/vertical-function-test.json
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
{
|
||||
"runs": [
|
||||
{"label": "match-seed2", "seed": 2, "start_round": 1, "extra_gold": 0, "speed": 6, "winner": 1, "end_note": "Ancient von Blau zerstört.", "steps": 12690, "hash": "DCE95C96556F3A1A", "core_hash": "DCE95C96556F3A1A", "same_as_core": true,
|
||||
"units_alive_max": 84, "heroes_alive_max": 4, "boss_log": ["round 8: won team 1 ", "round 9: deployed team 1 bot"],
|
||||
"rounds": [{"round": 1, "combat_seconds": 44.9, "lost": [], "boss": "none", "end": "cleared"}, {"round": 2, "combat_seconds": 57.1, "lost": [], "boss": "none", "end": "cleared"}, {"round": 3, "combat_seconds": 54.1, "lost": [], "boss": "none", "end": "cleared"}, {"round": 4, "combat_seconds": 62.9, "lost": [], "boss": "none", "end": "cleared"}, {"round": 5, "combat_seconds": 60.7, "lost": [], "boss": "none", "end": "cleared"}, {"round": 6, "combat_seconds": 62.1, "lost": [], "boss": "none", "end": "cleared"}, {"round": 7, "combat_seconds": 66.5, "lost": ["blau_bot_outer"], "boss": "none", "end": "cleared"}, {"round": 8, "combat_seconds": 89.65, "lost": ["rot_top_outer", "rot_top_inner"], "boss": "won", "end": "cleared"}, {"round": 9, "combat_seconds": 136.55, "lost": ["blau_bot_inner", "blau_base_2", "blau_base_1", "blau_ancient"], "boss": "deployed", "end": "core"}],
|
||||
"events": ["round 7: blau_bot_outer destroyed", "round 8: rot_top_outer destroyed", "round 8: rot_top_inner destroyed", "round 8: grotto boss won", "round 9: blau_bot_inner destroyed", "round 9: blau_base_2 destroyed", "round 9: blau_base_1 destroyed", "round 9: blau_ancient destroyed", "round 9: grotto boss deployed"],
|
||||
"shots": ["01-runde1-aufmarsch", "02-runde1-mid-kampf", "03-turm-faellt", "04-turm-ruine", "05-grotte-bosskampf", "06-held-kaempft", "07-boss-auf-der-lane", "08-ancient-faellt", "09-ancient-ruine", "10-ende-uebersicht"],
|
||||
"performance": null},
|
||||
{"label": "match-seed9-round21", "seed": 9, "start_round": 21, "extra_gold": 4000, "speed": 6, "winner": 0, "end_note": "Ancient von Rot zerstört.", "steps": 4195, "hash": "7B8E43AEFC0D60C5", "core_hash": "7B8E43AEFC0D60C5", "same_as_core": true,
|
||||
"units_alive_max": 125, "heroes_alive_max": 6, "boss_log": [],
|
||||
"rounds": [{"round": 21, "combat_seconds": 121.8, "lost": ["rot_mid_outer", "rot_top_outer", "rot_mid_inner"], "boss": "none", "end": "cleared"}, {"round": 22, "combat_seconds": 87.95, "lost": ["rot_top_inner", "rot_base_1", "blau_bot_outer", "rot_base_2", "rot_ancient"], "boss": "none", "end": "core"}],
|
||||
"events": ["round 21: rot_mid_outer destroyed", "round 21: rot_top_outer destroyed", "round 21: rot_mid_inner destroyed", "round 22: rot_top_inner destroyed", "round 22: rot_base_1 destroyed", "round 22: blau_bot_outer destroyed", "round 22: rot_base_2 destroyed", "round 22: rot_ancient destroyed"],
|
||||
"shots": ["11-welle21-uebersicht", "12-welle21-kampf", "13-ancient-rot-faellt", "14-welle-ende"],
|
||||
"performance": {"window": "20 s real time at 1x speed, unlimited frame rate, round 21", "frames": 48619, "fps": 2430.937, "frame_ms_avg": 0.411, "frame_ms_p95": 0.42, "simulation_ms_per_frame": 0.004, "views_ms_per_frame": 0.129, "units_alive_max": 116}}
|
||||
]
|
||||
}
|
||||
BIN
docs/port/screenshots/u5.5-feinschliff/01-aufstellung-nah.jpg
Normal file
BIN
docs/port/screenshots/u5.5-feinschliff/01-aufstellung-nah.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 718 KiB |
BIN
docs/port/screenshots/u5.5-feinschliff/02-aufstellung-lane.jpg
Normal file
BIN
docs/port/screenshots/u5.5-feinschliff/02-aufstellung-lane.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 738 KiB |
BIN
docs/port/screenshots/u5.5-feinschliff/03-kampf-nah.jpg
Normal file
BIN
docs/port/screenshots/u5.5-feinschliff/03-kampf-nah.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 667 KiB |
BIN
docs/port/screenshots/u5.5-feinschliff/04-kampf-lane.jpg
Normal file
BIN
docs/port/screenshots/u5.5-feinschliff/04-kampf-lane.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 666 KiB |
BIN
docs/port/screenshots/u5.5-feinschliff/05-kampf-weit.jpg
Normal file
BIN
docs/port/screenshots/u5.5-feinschliff/05-kampf-weit.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 628 KiB |
|
|
@ -24,7 +24,7 @@ import sys
|
|||
from pathlib import Path
|
||||
|
||||
import numpy as np
|
||||
from mathutils import Matrix, Vector
|
||||
from mathutils import Matrix, Quaternion, Vector
|
||||
|
||||
FPS = 24
|
||||
CLIP_ORDER = ['idle', 'walk', 'attack_a', 'attack_b', 'hit', 'ability', 'death']
|
||||
|
|
@ -382,6 +382,19 @@ def build(figure_path, source_root, unity_root):
|
|||
hips = pose['Hips']
|
||||
hips[0][3] = start.x
|
||||
hips[2][3] = start.z
|
||||
calm = figure.get('calm', {})
|
||||
if name in calm.get('clips', []):
|
||||
# Upright stance (U5.5 review): the library idle looks around and the orc walk hunches
|
||||
# 30-50 degrees forward, which hides the cauldrons, ovens and shields of figures without
|
||||
# a real head. Listed bones keep only a share of their rotation (0 = rest pose).
|
||||
for pose in samples:
|
||||
for bone, share in calm['bones'].items():
|
||||
basis = pose.get(bone)
|
||||
if basis is None:
|
||||
continue
|
||||
loc, rot, scale = basis.decompose()
|
||||
rot = Quaternion().slerp(rot, share)
|
||||
pose[bone] = Matrix.LocRotScale(loc, rot, scale)
|
||||
sampled[name] = (spec, samples, (first, last))
|
||||
for obj in loose:
|
||||
bpy.data.objects.remove(obj, do_unlink=True)
|
||||
|
|
@ -413,6 +426,11 @@ def build(figure_path, source_root, unity_root):
|
|||
mesh.select_set(True)
|
||||
bpy.context.view_layer.objects.active = meshes[0]
|
||||
bpy.ops.object.parent_clear(type='CLEAR_KEEP_TRANSFORM')
|
||||
# Optional uniform scale of the whole figure (figure.json "scale"; U5.5 review: footprint).
|
||||
factor = figure.get('scale', 1.0)
|
||||
for mesh in meshes:
|
||||
mesh.scale = mesh.scale * factor
|
||||
arm.scale = arm.scale * factor
|
||||
bpy.ops.object.transform_apply(location=True, rotation=True, scale=True)
|
||||
bpy.ops.object.select_all(action='DESELECT')
|
||||
arm.select_set(True)
|
||||
|
|
@ -428,7 +446,7 @@ def build(figure_path, source_root, unity_root):
|
|||
clips = {}
|
||||
for name in CLIP_ORDER:
|
||||
spec, samples, frames = sampled[name]
|
||||
action = write_clip(arm, name, samples, unit)
|
||||
action = write_clip(arm, name, samples, unit * figure.get('scale', 1.0))
|
||||
seconds = (len(samples) - 1) / FPS
|
||||
action['loop'] = bool(spec.get('loop', False))
|
||||
if 'contact_frame' in spec:
|
||||
|
|
|
|||
|
|
@ -71,7 +71,7 @@ def keep_main_islands(mesh, share):
|
|||
return len(drop)
|
||||
|
||||
|
||||
def place(mesh, width):
|
||||
def place(mesh, width, length=None):
|
||||
"""Uniform scale to the figure's width; feet on the ground, centred over them."""
|
||||
data = mesh.data
|
||||
co = np.array([v.co[:] for v in data.vertices])
|
||||
|
|
@ -81,6 +81,10 @@ def place(mesh, width):
|
|||
feet = co[co[:, 2] < low + 0.08 * (co[:, 2].max() - low)]
|
||||
offset = np.array([feet[:, 0].mean(), feet[:, 1].mean(), low])
|
||||
co -= offset
|
||||
if length:
|
||||
# Shorter along the figure's axis only (U5.5 review: the ballista overlapped its
|
||||
# neighbours); rigid parts take a non-uniform scale without visible distortion.
|
||||
co[:, 1] *= length / (co[:, 1].max() - co[:, 1].min())
|
||||
data.vertices.foreach_set('co', co.ravel())
|
||||
data.update()
|
||||
return co, scale
|
||||
|
|
@ -218,7 +222,7 @@ def build(figure_path, source_root, unity_root):
|
|||
bpy.context.view_layer.objects.active = mesh
|
||||
bpy.ops.object.transform_apply(location=True, rotation=True, scale=True)
|
||||
dropped = keep_main_islands(mesh, figure.get('min_island_share', 0.01))
|
||||
co, model_scale = place(mesh, figure['width'])
|
||||
co, model_scale = place(mesh, figure['width'], figure.get('length'))
|
||||
new = landmarks(co)
|
||||
|
||||
with bpy.data.libraries.load(str(source_root / figure['rig_blend'])) as (src, dst):
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
"glow": {"hue": [0, 42], "saturation": 0.6, "value": 0.5, "metal_below": 0.5},
|
||||
"lod": {"triangles": 5000, "sharp_degrees": 50, "lod0_screen": 0.2},
|
||||
"palette": {"rock": {"color": "41434b", "strength": 0.8}, "metal": {"color": "c99645", "strength": 1.0}},
|
||||
"calm": {"clips": ["idle", "walk"], "bones": {"neck": 0.0, "Head": 0.0, "Spine": 0.3, "Spine01": 0.3, "Spine02": 0.3, "Hips": 0.4}},
|
||||
"clips": {
|
||||
"idle": {"source": "Idle", "loop": true},
|
||||
"walk": {"source": "Slow_Orc_Walk", "seconds": 2.8, "loop": true},
|
||||
|
|
|
|||
|
|
@ -9,6 +9,8 @@
|
|||
"glow": {"hue": [0, 42], "saturation": 0.6, "value": 0.5, "metal_below": 0.5},
|
||||
"lod": {"triangles": 5000, "sharp_degrees": 50, "lod0_screen": 0.2},
|
||||
"palette": {"rock": {"color": "41434b", "strength": 0.8}, "metal": {"color": "c99645", "strength": 1.0}},
|
||||
"calm": {"clips": ["idle", "walk"], "bones": {"neck": 0.0, "Head": 0.0, "Spine": 0.3, "Spine01": 0.3, "Spine02": 0.3, "Hips": 0.4}},
|
||||
"scale": 0.84,
|
||||
"clips": {
|
||||
"idle": {"source": "Idle", "loop": true},
|
||||
"walk": {"source": "Slow_Orc_Walk", "seconds": 2.8, "loop": true},
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@
|
|||
"armature": "GlassRig",
|
||||
"rig_landmarks": {"weapon_z": 1.17, "hip_z": 0.8, "leg_x": 0.26, "tip_y": -1.0, "back_y": 0.36, "bow_x": 0.89, "bow_y": 0.03},
|
||||
"width": 1.85,
|
||||
"length": 1.9,
|
||||
"bone_regions": {"Bolt": {"y_max": -0.75}, "Quarrel": {"y_max": -0.75}, "Draw": {"y_max": -99}},
|
||||
"min_island_share": 0.01,
|
||||
"material": "AI_Glasballiste",
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
"glow": {"hue": [0, 42], "saturation": 0.6, "value": 0.5, "metal_below": 0.5},
|
||||
"lod": {"triangles": 5000, "sharp_degrees": 50, "lod0_screen": 0.2},
|
||||
"palette": {"rock": {"color": "41434b", "strength": 0.8}, "metal": {"color": "c99645", "strength": 1.0}},
|
||||
"calm": {"clips": ["idle", "walk"], "bones": {"neck": 0.0, "Head": 0.0, "Spine": 0.3, "Spine01": 0.3, "Spine02": 0.3, "Hips": 0.4}},
|
||||
"clips": {
|
||||
"idle": {"source": "Idle", "loop": true},
|
||||
"walk": {"source": "Slow_Orc_Walk", "seconds": 2.8, "loop": true},
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
"glow": {"hue": [0, 42], "saturation": 0.6, "value": 0.5, "metal_below": 0.5},
|
||||
"lod": {"triangles": 5000, "sharp_degrees": 50, "lod0_screen": 0.2},
|
||||
"palette": {"rock": {"color": "41434b", "strength": 0.8}, "metal": {"color": "c99645", "strength": 1.0}},
|
||||
"calm": {"clips": ["idle", "walk"], "bones": {"neck": 0.0, "Head": 0.0, "Spine": 0.3, "Spine01": 0.3, "Spine02": 0.3, "Hips": 0.4}},
|
||||
"clips": {
|
||||
"idle": {"source": "Idle", "loop": true},
|
||||
"walk": {"source": "Slow_Orc_Walk", "seconds": 2.8, "loop": true},
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
"glow": {"hue": [0, 42], "saturation": 0.6, "value": 0.5, "metal_below": 0.5},
|
||||
"lod": {"triangles": 5000, "sharp_degrees": 50, "lod0_screen": 0.2},
|
||||
"palette": {"metal": {"color": "c99645", "strength": 1.0}},
|
||||
"calm": {"clips": ["idle", "walk"], "bones": {"neck": 0.0, "Head": 0.0, "Spine": 0.3, "Spine01": 0.3, "Spine02": 0.3, "Hips": 0.4}},
|
||||
"clips": {
|
||||
"idle": {"source": "Idle", "loop": true},
|
||||
"walk": {"source": "Slow_Orc_Walk", "seconds": 2.8, "loop": true},
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@
|
|||
"glow": {"hue": [0, 42], "saturation": 0.6, "value": 0.5, "metal_below": 0.5},
|
||||
"lod": {"triangles": 5000, "sharp_degrees": 50, "lod0_screen": 0.2},
|
||||
"palette": {"metal": {"color": "c99645", "strength": 1.0}},
|
||||
"calm": {"clips": ["idle", "walk"], "bones": {"neck": 0.0, "Head": 0.0, "Spine": 0.3, "Spine01": 0.3, "Spine02": 0.3, "Hips": 0.4}},
|
||||
"clips": {
|
||||
"idle": {"source": "Idle", "loop": true},
|
||||
"walk": {"source": "Slow_Orc_Walk", "seconds": 2.8, "loop": true},
|
||||
|
|
|
|||
Loading…
Reference in a new issue