Comme la version précédente ne me convenait pas, j’ai décidé de reprendre la façon de calculer le vent. Je voulais quelque chose de plus prédictible, de plus simple à mettre en œuvre et que l’on puisse interroger pour n’importe quel point de la carte.

voila le résultat :

Capture d’écran 2013-03-10 à 23.23.15 - copie

Actuellement les effets sont un peu exagérés, mais c’est pour pouvoir visualiser facilement les effets des côtes sur la direction et la force du vent.

L’algorithme est assez simple, il consiste à chercher dans un certain rayon (actuellement 300 unités) autour du point concerné si il y a de la terre. Pour ça on « lance » des rayons et pour chaque rayon on calcule la somme des altitudes trouvées.

IMG_0001

La somme des altitudes trouvées (pondérée par la distance au point que l’on étudie) permet de calculer un effet en force et direction sur le vent général (vent synoptique). Pour les rayons proches du sens du vent général, la déviation est faible, mais la force du vent est diminuée. Par contre pour les rayons aux alentours de 45° du vent, la déviation sera plus importante. Pour les rayons proches de la perpendiculaire du vent la force sera augmentée.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public Vector3f getWindComposant(Vector3f location) {
    Vector3f currWind = mainWindDir.mult(data.globalWindSpeed);
    for (int angleDeg = -180; angleDeg < 0; angleDeg += stepAngleDeg) {
        float direction = data.globalWindDirection + (FastMath.DEG_TO_RAD * angleDeg);
        Vector3f dirToExplore = new Quaternion().fromAngleAxis(direction, Vector3f.UNIT_Y).mult(Vector3f.UNIT_Z);
        float heightCoeff = 0;
            for (int displacement = -maxDisplacement; displacement <= maxDisplacement; displacement += stepDisplacement) {
            if (displacement == 0) {
                continue;
            }
            Vector3f posToExplore = location.add(dirToExplore.mult(displacement));
            float height = inGameState.getTerrainHeight(posToExplore);
            heightCoeff += FastMath.abs((float) stepDisplacement / (float) displacement) * height;
        }
        heightCoeff = (heightCoeff * data.globalWindSpeed) / coeffSum;
        float deviationAngle = data.globalWindDirection + (FastMath.DEG_TO_RAD * ((2 * angleDeg) + 180f));
        Vector3f deviation = new Quaternion().fromAngleAxis(deviationAngle, Vector3f.UNIT_Y).mult(Vector3f.UNIT_Z).mult(heightCoeff);
        currWind.addLocal(deviation);
    }
    float currWindspeed2 = currWind.lengthSquared();
    if (currWindspeed2 > (maxWindSpeed * maxWindSpeed)) {
        currWind.normalizeLocal().multLocal(maxWindSpeed);
    } else if (currWindspeed2 < 1) {
        currWind.normalizeLocal();
    }
    return currWind;
}