CREARE ELICOTTERI CON ROTORI PERSONALIZZATI

Dopo un po di sperimentazioni, ho pensato di trascrivere qui una procedura passo passo per la creazione di elicotteri con rotori personalizzati.

Non so dirvi se questa procedura valga per tutti e per tutte le versioni del gioco, ma dato che l'ho provata su più modelli e tutti sembrano funzionare correttamente la rilascio qui.

Ci ho messo po a capire il funzionamento corretto, perchè si su internet ci sono alcuni tutorial su come  fare, ma:

  • Sono scritti in inglese e traducendoli non sempre si riesce a fare tutto correttamente
  • Alcuni sono incompleti e non funzionano o tralasciano dettagli che per i meno esperti sono essenziali
  • Le versioni di Mod Tools recenti mi hanno creato non pochi problemi con i codici da inserire, come se le mod aggiornate funzionassero peggio delle originali.
  • Altri autori si rifiutano di aiutare se non vengono pagati e per una community questo mi sembra assai scorretto.

PROCEDURA COSI' COME SONO RIUSCITO A FARLA FUNZIONARE

Carattesristiche, colori e impostazioni di base dei modello

Partiamo dal modello 3d di base costituito da una fusoliera e da due rotori diversi, quello principale e quello di coda, presupponendo che sai già utilizzare i principali comandi del programma 3d di modellazione chiaramente.

Create i modelli 3d normalmente come qualsiasi altro veicolo del gioco, facendo in modo che il centro orizzontale (xz) del rotore principale combaci con il punto 0 degli assi del vostro programma di disegno 3d, e l'altezza (y) con l'altezza del vostro perno rotore. 

Assegnate i seguenti colori ai vertici, poi vi serviranno per importare il modello 3d in cities Skylines. 

Fusoliera

Create il normale modello con texture restando sempre intorno ai 3000-4000 tris, senza assegnare colori ai vertici.

Rotore principale fermo 255-8-0
Red 255
Green 8
Blue 0

Rotore principale in movimento 255-8-0
Red 85
Green 0
Blue 0

Rotore coda mov 10-0-255
Red 10
Green 0
Blue 255

Rotore coda fermo 255-8-255
Red 255
Green 8
Blue 255

Passiamo alle operazioni nell'editor

del gioco

1. Crea un nuovo PROP usando il modello "Fusoliera". Nomina la risorsa e il file con lo stesso nome "corpo" (il file finale dovrebbe essere corpo.corpo.crp)

2. Crea un nuovo PROP utilizzando il modello "Rotore principale". Fai in modo che il modello del rotore si posizioni correttamente sull'elicottero.
Nomina la risorsa e il file con lo stesso nome "Rotorprinc". (il file finale dovrebbe essere rotorprinc.rotorprinc.crp)

3. Crea un nuovo PROP utilizzando il modello "Rotore coda". Fai in modo che il modello del rotore si posizioni correttamente sull'elicottero
Nomina la risorsa e il file con lo stesso nome "Rotorcoda". (il file finale dovrebbe essere rotorcoda.rotorcoda.crp)

Prestate attenzione ad eventuali maiuscole e minuscole, spazi o trattini nei nomi.

4. Esci dal gioco e vai fino al desktop (Importante per annullare tutti i file temporanei creati)

5. Riavvia il gioco normalmente

6. Crea ora un nuovo VEICOLO utilizzando il modello "Fusoliera", partendo come modello campione dall'elicottero di default del gioco (eliambulanza, polizia, pompieri o passeggeri) 

7. Ora apri Mod Tools per applicare la vernice vertice dal PROP creato nel passaggio 1 e inserisci il seguente codice con copia/incolla Ctrl C/ Ctrl V (ovviamente senza le linee orizzontali di cornice)

_________________________________________________

var asset2 = PrefabCollection<PropInfo>.FindLoaded("corpo.corpo_Data");
Vector4[] tyres = new Vector4[] {
new Vector4(-0.739f, 0.328f, 1.421f, 0.328f),
new Vector4(0.739f, 0.328f, 1.421f, 0.328f),
new Vector4(-0.739f, 0.331f, -1.93f, 0.331f),
new Vector4(0.739f, 0.331f, -1.93f, 0.331f)
};
var asset = ToolsModifierControl.toolController.m_editPrefabInfo as VehicleInfo;
Color[] colors = new Color[asset2.m_mesh.vertices.Length];
for (int i = 0; i < asset2.m_mesh.vertices.Length; i++) colors[i] = asset2.m_mesh.colors[i];
asset.m_mesh.colors = colors; asset.m_generatedInfo.m_tyres = tyres;
_________________________________________________

8. Elimina tramite il pannello dell'editor la submesh predefinita del vecchio rotore

9. Aggiungi il tuo rotore personalizzato "Rotorprinc"
Ogni submesh rappresenta uno dei rotori dell'elicottero e assicurati che nell'editor vengano posizionati correttamente sul modello "Fusoliera",
altrimenti devi correggere il modello 3d che hai creato.

10. Inserisci il codice sotto in Mod Tools con copia/incolla Ctrl C/ Ctrl V (ovviamente senza le linee orizzontali di cornice)

_________________________________________________

var subMesh = 1; // vehicle sub mesh id, starting from 1
var asset2 = PrefabCollection<PropInfo>.FindLoaded("rotorprinc.rotorprinc_Data");
var asset = ToolsModifierControl.toolController.m_editPrefabInfo as VehicleInfo;
Color[] colors = new Color[asset2.m_mesh.vertices.Length];
for (int i = 0; i < asset2.m_mesh.vertices.Length; i++) colors[i] = asset2.m_mesh.colors[i];
asset.m_subMeshes[subMesh].m_subInfo.m_mesh.colors = colors;
_________________________________________________

11. Aggiungi il tuo rotore personalizzato "Rotorcoda"
Ogni submesh rappresenta uno dei rotori dell'elicottero e assicurati che nell'editor vengano posizionati correttamente sul modello "Fusoliera",
altrimenti devi correggere il modello 3d che hai creato.

12. Inserisci il codice sotto in Mod Tools con copia/incolla Ctrl C/ Ctrl V (ovviamente senza le linee orizzontali idi cornice)

________________________________________________

var subMesh = 2; // vehicle sub mesh id, starting from 2
var asset2 = PrefabCollection<PropInfo>.FindLoaded("rotorcoda.rotorcoda_Data");
var asset = ToolsModifierControl.toolController.m_editPrefabInfo as VehicleInfo;
Color[] colors = new Color[asset2.m_mesh.vertices.Length];
for (int i = 0; i < asset2.m_mesh.vertices.Length; i++) colors[i] = asset2.m_mesh.colors[i];
asset.m_subMeshes[subMesh].m_subInfo.m_mesh.colors = colors;
________________________________________________

13. Ora torna a lavorare sul tuo modello 3d e trova le coordinate esatte del punto di rotazione di ciascuno dei rotori e segnatele su un foglietto.
L'esempio del mio elicottero ha queste coordinate di rotazione (x y z) 

Rotorprinc: 0.000, 3.480, -0.000 per inserirli nel codice trasformali con questo formato

0.000f, 3.480f, -0.000f, 0.0f

Rotorcoda: 0.240, 3.440, -7.960 per inserirli nel codice trasformali con questo formato (x y z)

0.240f, 3.440f, -7.960f, 0.0f

14. Inserisci il codice per "Rotorprinc" sotto in Mod Tools con copia/incolla Ctrl C/ Ctrl V controllando di aver inserito correttamente i tuoi punti di rotazione
nel codice e lasciando sempre l'ultima coordinata "0.0f" cos' com'è.

_________________________________________________

var subMesh = 1;
var FlipXZ = false;
var tires = 4;
Vector4[] tireParams = new Vector4[tires];
tireParams[0] = new Vector4(-0.000f, 3.222f, -0.000f, 0.0f);
tireParams[1] = new Vector4(-0.000f, 3.222f, -0.000f, 0.0f);
var fxz = 0.0f; if(FlipXZ) fxz = 1.0f;
var shader = Shader.Find("Custom/Vehicles/Vehicle/Rotors");
var asset = ToolsModifierControl.toolController.m_editPrefabInfo as VehicleInfo;
if(asset.m_subMeshes[subMesh].m_subInfo.m_material != null)
asset.m_subMeshes[subMesh].m_subInfo.m_material.shader = shader;
if(asset.m_subMeshes[subMesh].m_subInfo.m_lodMaterial != null)
asset.m_subMeshes[subMesh].m_subInfo.m_lodMaterial.shader = shader;
asset.m_subMeshes[subMesh].m_subInfo.m_material.SetFloat("_FlipTyreRotationXZ", fxz);
asset.m_subMeshes[subMesh].m_subInfo.m_generatedInfo.m_tyres = tireParams;
if(FlipXZ) asset.m_subMeshes[subMesh].m_subInfo.m_UIPriority = 120122;
_________________________________________________

15. Inserisci il codice per "Rotorprinc" sotto in Mod Tools con copia/incolla Ctrl C/ Ctrl V controllando di aver inserito correttamente i tuoi punti di rotazione
nel codice e lasciando sempre l'ultima coordinata "0.0f" cos' com'è.

_________________________________________________

var subMesh = 2;
var FlipXZ = false;
var tires = 4;
Vector4[] tireParams = new Vector4[tires];
tireParams[0] = new Vector4(0.318f, 2.166f, 6.576f, 0.0f);
tireParams[1] = new Vector4(0.318f, 2.166f, 6.576f, 0.0f);
var fxz = 0.0f; if(FlipXZ) fxz = 1.0f;
var shader = Shader.Find("Custom/Vehicles/Vehicle/Rotors");
var asset = ToolsModifierControl.toolController.m_editPrefabInfo as VehicleInfo;
if(asset.m_subMeshes[subMesh].m_subInfo.m_material != null)
asset.m_subMeshes[subMesh].m_subInfo.m_material.shader = shader;
if(asset.m_subMeshes[subMesh].m_subInfo.m_lodMaterial != null)
asset.m_subMeshes[subMesh].m_subInfo.m_lodMaterial.shader = shader;
asset.m_subMeshes[subMesh].m_subInfo.m_material.SetFloat("_FlipTyreRotationXZ", fxz);
asset.m_subMeshes[subMesh].m_subInfo.m_generatedInfo.m_tyres = tireParams;
if(FlipXZ) asset.m_subMeshes[subMesh].m_subInfo.m_UIPriority = 120122;
________________________________________________

16. AVVISO I codici sono presi da vari forum e pagine web e modificati  e per me funzionano così, se ci dovesse essere qualche problema o soluzioni alternative,  o le versioni aggiornate di Mod Tools dovessero creare problemi scrivete sui forum di assistenza e fate sapere qui per le modifiche.

17. Modificare le posizioni delle luci e le altre caratteristiche in base al vostro modello con l'editor di gioco come fate con tutti i modelli.

18. Salvate con il vostro nome il modello e verificate in game il funzionamento dei rotori. Se i rotori non ruotano come vorreste o vi sembrano fuori asse,
è necessario rimettere mano al modello 3d di partenza ed accertarsi che tutte le coordinate inserite nei vari codici e i colori dei vertici siano corretti e ripetere la procedura.

Modeli creati

Ho già creato alcuni modelli di elicotteri di servizio e passeggeri utilizzando questa procedura, e sembrano tutti funzionare correttamente in game. A breve uno per volta saranno rilasciati in download.

Tutti i post dei vari modelli sono disponibili nella relativa categoria del sito  e alcuni video sul funzionamento degli stessi sono disponibili sul canale youtube

I commenti sono chiusi.