平地と山の合成
ここまでに作った2種類の地形を合成していきます。使うのはSelectのmoduleですが、これがなかなか複雑です。
<module name="Module_Output" type="Select">
<property name="controlModule" value="Module_A"/>
<property name="sourceModule1" value="Module_B"/>
<property name="sourceModule2" value="Module_C"/>
<property name="bounds" value="0,100"/>
<property name="edgeFalloff" value="0.3"/>
</module>
合成したい2つの地形をsourceMoudule1、sourceModule2にそれぞれ設定し、controllModuleには別の波を設定します。これは処理速度も考えてFastNoiseで作成したものをそのまま入れるのがいいでしょう。このcontrollModuleと次に設定するboundsの組み合わせが、2つのsourceModuleが現れる比率を決めます。controllModuleがboundsの範囲内の時sourceModule2が、範囲外の時sourceModule1が生成結果になります。
物は試しです。生成してみましょう。continentMixedのmoduleでは、continentControllerが0以下の時にlandScaledが、continentControllerが0以上の時にmountainScaledが生成されるようにしています。(continentControllerが100を超えることはありません。)
<terrain_generator name="vanilla" use_old_final="false">
<module name="landBase" type="FastBillow">
<property name="frequency" value="0.1"/>
</module>
<module name="landScaled" type="ScaleBiasOutput">
<property name="sourceModule" value="landBase"/>
<property name="scale" value="0.14"/>
<property name="bias" value="0.25"/>
</module>
<module name="mountainBase" type="FastRidgedMultifractal">
<property name="frequency" value="1"/>
</module>
<module name="mountainScaled" type="ScaleBiasOutput">
<property name="sourceModule" value="mountainBase"/>
<property name="scale" value="0.5"/>
<property name="bias" value="0.65"/>
</module>
<module name="continentController" type="FastNoise">
<property name="frequency" value="0.1"/>
</module>
<module name="continentMixed" type="Select">
<property name="controlModule" value="continentController"/>
<property name="sourceModule1" value="landScaled"/>
<property name="sourceModule2" value="mountainScaled"/>
<property name="bounds" value="0,100"/>
</module>
<module name="scaleBiasOutput" type="ScaleOutput">
<property name="sourceModule" value="continentMixed"/>
<property name="scale" value="160"/>
<property name="bias" value="0"/>
</module>
<module name="clampOutput" type="ClampOutput">
<property name="sourceModule" value="scaleBiasOutput"/>
<property name="bounds" value="-50,158"/>
</module>
<output module="clampOutput"/>
</terrain_generator>
生成結果を見ると、平地と山の地域に分かれていることが分かります。ここでboundの左側の値を+方向にずらす、つまりboundsの範囲を狭めると、山が占める割合が減っていきます。(右に行くほどboundsの左側が1.5に近づきます。)
そして、controllerModuleのfrequencyを増やすことで、ひとつひとつの平地・山両方の面積が減ります。逆に値を減らすことで面積は広くなります。Selectのboundsと、controlModuleのfrequencyを調整することで、大規模な山が時々生成する大陸部や、平地がたまにしか生成されない山脈部といった表情豊かな地形が作れます。