ピラミッド

Planetside公式フォーラム、"General"のトピック A function only Landscape : Part One - A Pyramid からの転用です

Functionを使ってピラミッドを作成するために、下記の設計図を用意しました。
逆さピラミッドの「高さ」は任意の点x,y座標間の最長であり、x,y軸それぞれをz = max(x,y)の式で表します。
x,yの最大値によりピラミッドの大きさを制限し、適切に向きを変える必要があります。

まずx,yの値を抽出する必要があります。
Terragenの座標系は、平面座標をx,zとし、高さをyで表すので必要なのはx,z座標です。

現在の座標を得る為に「Get>Get Position」のFunctionを使います。
個々の縦座標を抽出するためにそれぞれ
  「Convert>X to scalar」
  「Convert>Y to scalar」
  「Convert>Z to scalar」
を作成します。
このFunctionは、個々の縦座標の頂点スカラ値を抽出して出力します。
今回、"X to scalar"と"Z to scalar"の両方を"Get Position"の供給元として使用します。

有効な縦座標と隣接した軸間の距離を求めるには、縦座標の符号を破棄する必要があります。
スカラの絶対値を抽出する「Clamp>Abs scalar」のFunctionを使います。
さらにCreate Functionからの「Clamp>Abs vector」は、"Get Positio"からの出力に使用する事が出来ますが後にその状況を変える予定です。
それでは2つの「Clamp>Abs Scalar」ノードを作成し、それぞれを"Absolute X"、"Absolute Z"と
ノード名を変更して「X to scalar」、「Z to scalar」のノードに関連付けて下さい。

ようやく距離を知る事が出来たので、次は最大の距離を選ぶ必要があります。
これには「Conditional scalar」のFunctionが役立ちます。
このFunctionは"Condition(条件)"設定と4つの入力端子を持ちます。

  最初の入力"Input node"は条件の左手側です。
  2番目の入力"Comparison value(比較値)"は条件の右手側です。
     設定条件:「Greater than(より大きい)」、「Less than(より小さい)」、他..
  3番目の入力"If result(結果により)"条件がtrueの場合、値が出力されます。
  4番目の入力"Else result(他の結果)"条件がfalseの場合、値が出力されます。

「Absolute X」の値は"Input Node"と"If result"に関連付け
「Absolute Z」の値は"Comparison value"と"Else result"に関連付けさせます。
今回望んでいる条件はx>zの時、z=xである。
"Condition(条件)"は"greater than(より大きい)"に設定します。

   Clamp 0 :0未満の値を0にします。
   Clamp 0 1:0未満の値は0、1より大きい値は1にします。
   Clampは2つのインプット値の値をクランプ(固定)します。

今回0とピラミッド最大の高さとの間でクランプする必要があるため、2つの定数を用意します。
Create Functionから「Constant>Constant scalar」を作成し、1つはscalar値に0を設定し、
2つ目を「max pyramid radius(ピラミッドの最大半径)」と名付け、ピラミッドの最高値(任意)を設定します。
Function「Clamp scalar」を追加し、"min"=0、"max"=「max pyramid radius」を関連付けます。
「Clamp scalar」の"Input node"に「Conditional Scalar」を関連付けます。

最後に、過程で作られたピラミッドを上向きの正しい方向に回転させる必要がありますが、これは容易です。
現在xから0(底辺)に向かっているのを、0からxへ向かわせます。そのために最大高からこれまでの高さを減算する事で行えます。

Create Functionから「Subtract/Subtract scalar」を追加し、左側の"Input node"に「Clamp scalar」へ接続した「max pyramid radius」を取り付け、
その後に右側の"Input 2"に「Clamp scalar」を関連付けます。

これによりピラミッドは出来上がりますが景観に手を加える必要があります。ファンクションを有効にさせるには「Displacement shader」を
追加し、Terrainグループ内の「Compute terrain」に関連付けなければなりません。最後に「Displacement Shader」の"Function"に
「Subtract scalar」を取り付けて完成です。

ノードネットワークには以下のようになります。

完成シーン
最終更新:2017年04月13日 15:32