前回は、丘と平地からなるなめらかな地形を作りました。今回は標高が高く稜線の入った山脈と、なめらかな低地をミックスします。
特徴のない波を-1.5~1.5くらいに発生させる
標高が+の地域が稜線のように連なった地形の波を-1.5~1.5くらいに発生させる。
2つの地形を切り貼りして1つの地形にする。
地形を歪めて特徴を持たせる。
まずはワールド全体に山を生成させて、ScaleとFrequencyの調整を行います。標高に関しては合成したときの影響を考える必要はありません。ScaleBiasOutputで目標の高さまで調整してください。 今回は、前回は特に説明していないfrequencyについて詳しく触れていきます。
<terrain_generator name="vanilla" use_old_final="false"> <module name="mountainBase" type="FastRidgedMultifractal"> <property name="frequency" value="0.5"/><!--ここを好みに合わせましょう。--> </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="scaleBiasOutput" type="ScaleOutput"> <property name="sourceModule" value="mountainScaled"/> <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>
frequencyを変えながら生成した結果は上段になります。(左から、frequency=0.25、0.5、1です。)下段は、その山を使って作れる最終的な地形です。0.5前後が良さげですね。
frequencyは地形の波の頻度を変えますが、それは言い換えると標高の緩急を変更するということです。今回は特に山の緩急に関わるパラメータとして出てきます。
同様に平地も作っておきます。
<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="scaleBiasOutput" type="ScaleOutput"> <property name="sourceModule" value="landScaled"/> <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>
こちらはfrequencyを上げればボコボコと荒れた地形が、下げれば滑らかな地形ができます。
ここまでに作った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を調整することで、大規模な山が時々生成する大陸部や、平地がたまにしか生成されない山脈部といった表情豊かな地形が作れます。
ただしこのままだと、山と平地の境界線がかなりはっきりしていて、自然な地形ではありません。2つの地形の境界をなめらかにするにはedgeFalloffを使います。これは、2つの地形の境界線になるboundsの両側で、なめらかにぼかす範囲を指定します。
<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.4,100"/> <property name="edgeFalloff" value="0.2"/> </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>
これで境界付近がなめらかになりました。
最後は調整です。ここではFastTurbulenceを用いて連なる山脈を作ったり、山肌を荒くしたりします。これについては、文章を読むよりも実行の結果を見て、それぞれのpropertyにどういった効果があるのか知るのが分かりやすいです。
<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.4,100"/> <property name="edgeFalloff" value="0.2"/> </module> <module name="continentFinal" type="FastTurbulence"> <property name="sourceModule" value="continentMixed"/> <property name="frequency" value="0.5"/> <property name="power" value="1"/> <property name="roughness" value="1"/> </module> <module name="scaleBiasOutput" type="ScaleOutput"> <property name="sourceModule" value="mountainScaled"/> <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>
下の画像では、frequencyとpowerを変えた時の地形の変化を表にしています。
どちらも低いと、元の地形から変化はなく、frequencyが高くpowerが低いと、ノイズの入った様な地形になり、 frequencyが低くpowerが高いと、引き延ばされたような地形になり、どちらも高いと、元の地形は失われます。 バランスを見つけるのは難しいですが、これが最終的な地形に大きくかかわるので、しっかりこだわるべき場所です。 間違ってもバニラのような極端な値にするのはやめましょう・・・・。
続いて、roughnessですが、これはfrequencyの違う変形済みの地形をいくつ重ねるか指定します。1~30の整数を指定できますが、これを2倍にすれば処理時間も2倍になります。個人的に1でも良いと思います。下の画像は、左からroughness=1,2,4,8,16の地形です。
さて、ここまでで平野と山の地形生成について話してきましたが、実はワールド生成に必要な知識はこれで全てです。 ここまでの方法を使って川、湖、山、平地を作りました。
<terrain_generator name="vanilla" use_old_final="false"> <module name="landSmooth" type="FastBillow" no_seed="true"> <property name="frequency" value="0.5"/> </module> <module name="landSmoothScaled" type="ScaleBiasOutput"> <property name="sourceModule" value="landSmooth"/> <property name="scale" value="0.3"/> <property name="bias" value="0.2"/> </module> <module name="landRough" type="FastBillow" no_seed="true"> <property name="frequency" value="2"/> </module> <module name="landRoughScaled" type="ScaleBiasOutput"> <property name="sourceModule" value="landRough"/> <property name="scale" value="0.07"/> <property name="bias" value="0.2"/> </module> <module name="landController" type="FastNoise" seed_additive="-1"> <property name="frequency" value="0.5"/> </module> <module name="landMixed" type="Select"> <property name="controlModule" value="landController"/> <property name="sourceModule1" value="landRoughScaled"/> <property name="sourceModule2" value="landSmoothScaled"/> <property name="bounds" value="-0.2,100"/> <property name="edgeFalloff" value="0.2"/> </module> <module name="mountainBase" type="FastRidgedMultifractal"> <property name="frequency" value="0.5"/> </module> <module name="mountainScaled" type="ScaleBiasOutput"> <property name="sourceModule" value="mountainBase"/> <property name="scale" value="0.525"/> <property name="bias" value="0.675"/> </module> <module name="continentController" type="FastNoise" seed_additive="1"> <property name="frequency" value="0.3"/> </module> <module name="continentMixed" type="Select"> <property name="controlModule" value="continentController"/> <property name="sourceModule1" value="landMixed"/> <property name="sourceModule2" value="mountainScaled"/> <property name="bounds" value="0.1,100"/> <property name="edgeFalloff" value="0.35"/> </module> <module name="continentFinal" type="FastTurbulence"> <property name="sourceModule" value="continentMixed"/> <property name="frequency" value="0.25"/> <property name="power" value="3"/> <property name="roughness" value="4"/> </module> <module name="oceanBase" type="FastBillow" seed_additive="2"> <property name="frequency" value="0.3"/> </module> <module name="oceanScaled" type="ScaleBiasOutput"> <property name="sourceModule" value="oceanBase"/> <property name="scale" value="0.25"/> <property name="bias" value="-0.175"/> </module> <module name="worldController" type="FastNoise" seed_additive="3"> <property name="frequency" value="0.15"/> </module> <module name="worldMixed" type="Select"> <property name="controlModule" value="worldController"/> <property name="sourceModule1" value="continentFinal"/> <property name="sourceModule2" value="oceanScaled"/> <property name="bounds" value="-0.05,0.05"/> <property name="edgeFalloff" value="0.4"/> </module> <module name="scaleBiasOutput" type="ScaleOutput"> <property name="sourceModule" value="worldMixed"/> <property name="scale" value="160"/> </module> <module name="clampOutput" type="ClampOutput"> <property name="sourceModule" value="scaleBiasOutput"/> <property name="bounds" value="-50,190"/> </module> <output module="clampOutput"/> </terrain_generator>
こーんな感じです
バイオームは調整が必須ですね。
次回からは、バニラの地形生成の検証や、珍しい地形を生成する方法を考えていこうと思います。
調べててちょっと思ったのは、実際の標高とterrain_generatorの標高が違うんでは? ということですね。
少し高め、というか、急な形で生成されている気がします。 biasを使えば検証自体は簡単なので、生成限界と一緒に調べてみましょう。
調べてみました。 Y座標の0~255がElevationの-60~194に対応。 TerrainGeneratorではElevationの値に対応する。 0,255には破壊不可、ブロック設置不可の空間があり、1~3には岩床ブロックがある。
地形生成の限界範囲は0~222.5で、0まで下げた状態だと、水が中空に浮いている。 この状態は、水は不可侵ブロックに支えられているわけではないので、荷重再計算が行われるとワールド中の水が崩落してクラッシュする。(絶対試しちゃダメだぜ!) (街は32~?)
さて、このページをWIKIにまとめていきたいわけですが、全部そのままコピペとかすると、文字数制限か行数制限であぼんです。
それぞれのパラメーター説明と、PREVIEWERだけ張り付けていれば、試行錯誤好きな人は自分でできると思います。 でもどうせなら、調べたことは書いておいた方が時間の短縮になると思うんですよね。
とここまで書き連ねて、XML書き換え用WIKIを全く更新してないことにきづく。 あれ使えば良いのでは。
いつも参加してる放送での一コマ 私の地形生成を使ってくれてるんですけど、これはひどすぎるw
ちょっとね、さすがにもうちょっとうまくやらないとね・・・、これ結局陸地には上がれませんでした。 山岳地域に川ができると、渓谷みたいになってしまうようです。
川の生成は平野だけ、山岳地域にはたまに崖とかにする方がいいかもしれません。
いろいろ検証するほどによくわからないことになりますねぇ・・・ まず、rwgmixerで生成された地形は-30されてからbiomes.xmlに送られます。
そして、そこでは0~255の表記を基準に水やら土やら石の配置が行われると。
うーむ、変換がスパゲッティーなことになってるので、いずれきれいにされるんだと思いたいところです。
α16でも使い方はほぼ同じなものの、地形生成にちょこっと変更が加わりました
まず、Blendを使った時のweightModuleがcontrolModuleに変更されました 元々Blendを使えていた人は少ないと思うので、ここはあまり関係ないですね
Blend
weightModule
controlModule
Clampをかませないでも、OutputModuleが限界高度を超えないように、若干修正してくれるようになりました これははみ出た部分をすりきりで真っ平らにするわけではなく、標高=限界高度の部分はそのままで、標高>限界高度の部分をへこませてるような気がします でも結局限界高度で平らに見えちゃうので私としてはあまり気に入りませんねぇ どうにかうまいこと自然にできないものかなぁ・・・
Clamp
. . .
それから、地形生成以外にも、街の形を自由にいじれるようになったので、こっちの方をしばらくやっていこうと思います。 地形生成に関しては、今までの物をα16でうまく動くようにしたら、しばらくはあまり手を加えないかも?
Twitterにも貼ったけど、地形生成は今のところこんな感じです。
↑ちょっと水が生成されやすくなった気がするので、ここは直しときたいところ ↑このくらいの山が個人的にちょうどいい ↑すごいところに拠点を構えるトレーダー ↑ちょっと山を険しくしすぎた時の画像
2つの地形の組合わせ--TerraGenその2
前回は、丘と平地からなるなめらかな地形を作りました。今回は標高が高く稜線の入った山脈と、なめらかな低地をミックスします。
moduleの種類
FastNoise
特徴のない波を-1.5~1.5くらいに発生させる
FastRidgedMultifractal
標高が+の地域が稜線のように連なった地形の波を-1.5~1.5くらいに発生させる。
Select
2つの地形を切り貼りして1つの地形にする。
FastTurbulence
地形を歪めて特徴を持たせる。
とりあえず山を作ってみる
まずはワールド全体に山を生成させて、ScaleとFrequencyの調整を行います。標高に関しては合成したときの影響を考える必要はありません。ScaleBiasOutputで目標の高さまで調整してください。
今回は、前回は特に説明していないfrequencyについて詳しく触れていきます。
frequencyを変えながら生成した結果は上段になります。(左から、frequency=0.25、0.5、1です。)下段は、その山を使って作れる最終的な地形です。0.5前後が良さげですね。
frequencyは地形の波の頻度を変えますが、それは言い換えると標高の緩急を変更するということです。今回は特に山の緩急に関わるパラメータとして出てきます。
同様に平地も作っておきます。
こちらはfrequencyを上げればボコボコと荒れた地形が、下げれば滑らかな地形ができます。

平地と山の合成
ここまでに作った2種類の地形を合成していきます。使うのはSelectのmoduleですが、これがなかなか複雑です。
合成したい2つの地形をsourceMoudule1、sourceModule2にそれぞれ設定し、controllModuleには別の波を設定します。これは処理速度も考えてFastNoiseで作成したものをそのまま入れるのがいいでしょう。このcontrollModuleと次に設定するboundsの組み合わせが、2つのsourceModuleが現れる比率を決めます。controllModuleがboundsの範囲内の時sourceModule2が、範囲外の時sourceModule1が生成結果になります。

物は試しです。生成してみましょう。continentMixedのmoduleでは、continentControllerが0以下の時にlandScaledが、continentControllerが0以上の時にmountainScaledが生成されるようにしています。(continentControllerが100を超えることはありません。)
生成結果を見ると、平地と山の地域に分かれていることが分かります。ここでboundの左側の値を+方向にずらす、つまりboundsの範囲を狭めると、山が占める割合が減っていきます。(右に行くほどboundsの左側が1.5に近づきます。)
そして、controllerModuleのfrequencyを増やすことで、ひとつひとつの平地・山両方の面積が減ります。逆に値を減らすことで面積は広くなります。Selectのboundsと、controlModuleのfrequencyを調整することで、大規模な山が時々生成する大陸部や、平地がたまにしか生成されない山脈部といった表情豊かな地形が作れます。
ただしこのままだと、山と平地の境界線がかなりはっきりしていて、自然な地形ではありません。2つの地形の境界をなめらかにするにはedgeFalloffを使います。これは、2つの地形の境界線になるboundsの両側で、なめらかにぼかす範囲を指定します。
これで境界付近がなめらかになりました。

山に特徴を付ける
最後は調整です。ここではFastTurbulenceを用いて連なる山脈を作ったり、山肌を荒くしたりします。これについては、文章を読むよりも実行の結果を見て、それぞれのpropertyにどういった効果があるのか知るのが分かりやすいです。
下の画像では、frequencyとpowerを変えた時の地形の変化を表にしています。

どちらも低いと、元の地形から変化はなく、frequencyが高くpowerが低いと、ノイズの入った様な地形になり、
frequencyが低くpowerが高いと、引き延ばされたような地形になり、どちらも高いと、元の地形は失われます。
バランスを見つけるのは難しいですが、これが最終的な地形に大きくかかわるので、しっかりこだわるべき場所です。
間違ってもバニラのような極端な値にするのはやめましょう・・・・。
続いて、roughnessですが、これはfrequencyの違う変形済みの地形をいくつ重ねるか指定します。1~30の整数を指定できますが、これを2倍にすれば処理時間も2倍になります。個人的に1でも良いと思います。下の画像は、左からroughness=1,2,4,8,16の地形です。

最後に
さて、ここまでで平野と山の地形生成について話してきましたが、実はワールド生成に必要な知識はこれで全てです。
ここまでの方法を使って川、湖、山、平地を作りました。
こーんな感じです








バイオームは調整が必須ですね。
次回からは、バニラの地形生成の検証や、珍しい地形を生成する方法を考えていこうと思います。
調べててちょっと思ったのは、実際の標高とterrain_generatorの標高が違うんでは?
ということですね。
少し高め、というか、急な形で生成されている気がします。
biasを使えば検証自体は簡単なので、生成限界と一緒に調べてみましょう。
調べてみました。
Y座標の0~255がElevationの-60~194に対応。
TerrainGeneratorではElevationの値に対応する。
0,255には破壊不可、ブロック設置不可の空間があり、1~3には岩床ブロックがある。
地形生成の限界範囲は0~222.5で、0まで下げた状態だと、水が中空に浮いている。
この状態は、水は不可侵ブロックに支えられているわけではないので、荷重再計算が行われるとワールド中の水が崩落してクラッシュする。(絶対試しちゃダメだぜ!)
(街は32~?)
さて、このページをWIKIにまとめていきたいわけですが、全部そのままコピペとかすると、文字数制限か行数制限であぼんです。
それぞれのパラメーター説明と、PREVIEWERだけ張り付けていれば、試行錯誤好きな人は自分でできると思います。
でもどうせなら、調べたことは書いておいた方が時間の短縮になると思うんですよね。
とここまで書き連ねて、XML書き換え用WIKIを全く更新してないことにきづく。
あれ使えば良いのでは。
いつも参加してる放送での一コマ

私の地形生成を使ってくれてるんですけど、これはひどすぎるw
ちょっとね、さすがにもうちょっとうまくやらないとね・・・、これ結局陸地には上がれませんでした。
山岳地域に川ができると、渓谷みたいになってしまうようです。
川の生成は平野だけ、山岳地域にはたまに崖とかにする方がいいかもしれません。
いろいろ検証するほどによくわからないことになりますねぇ・・・
まず、rwgmixerで生成された地形は-30されてからbiomes.xmlに送られます。
そして、そこでは0~255の表記を基準に水やら土やら石の配置が行われると。
うーむ、変換がスパゲッティーなことになってるので、いずれきれいにされるんだと思いたいところです。
ここからα16
α16でも使い方はほぼ同じなものの、地形生成にちょこっと変更が加わりました
まず、
Blend
を使った時のweightModule
がcontrolModule
に変更されました元々Blendを使えていた人は少ないと思うので、ここはあまり関係ないですね
Clamp
をかませないでも、OutputModuleが限界高度を超えないように、若干修正してくれるようになりましたこれははみ出た部分をすりきりで真っ平らにするわけではなく、標高=限界高度の部分はそのままで、標高>限界高度の部分をへこませてるような気がします
でも結局限界高度で平らに見えちゃうので私としてはあまり気に入りませんねぇ
どうにかうまいこと自然にできないものかなぁ・・・
.
.
.
それから、地形生成以外にも、街の形を自由にいじれるようになったので、こっちの方をしばらくやっていこうと思います。
地形生成に関しては、今までの物をα16でうまく動くようにしたら、しばらくはあまり手を加えないかも?
Twitterにも貼ったけど、地形生成は今のところこんな感じです。
↑ちょっと水が生成されやすくなった気がするので、ここは直しときたいところ
↑このくらいの山が個人的にちょうどいい
↑すごいところに拠点を構えるトレーダー
↑ちょっと山を険しくしすぎた時の画像