UV & materials

Polar Coordinates

極座標変換

位置を距離と角度で扱い魔法陣や渦を描く。

2 / 10

Interactive demo

Preparing the demo…

Polar Coordinates

Drag to orbit, Ctrl/⌘ + scroll to zoom. Use two fingers on touch screens.

This explanation is currently available in Japanese.

ひとことで

画面や UV 上の位置 (x,y)(x, y) を、中心からの距離 rr と角度 θ\theta に変換してから模様を作る手法です。距離を使えば同心円、角度を使えば放射状の線や回転が簡単に表現できるので、魔法陣、渦、ポータル、レーダー、時計の針、放射状のワイプなど、「丸いもの・回るもの」のシェーダーの基本になります。

ゲームでの使いどころ

  • 魔法陣・召喚陣:同心円のリングと、角度で区切ったルーン文字の帯が回転する。
  • 渦・ポータル・ブラックホール:角度に距離を足してねじると渦巻きになる。
  • UI:円形のゲージ(クールダウン表示)、レーダーの走査線、放射状のワイプ遷移。
  • エフェクト:衝撃波のリング、集中線、花火の放射状の光。

しくみ

中心を原点とした座標 p=(x,y)\mathbf{p} = (x, y) から、

r=x2+y2,θ=atan2⁡(y,x)r = \sqrt{x^2 + y^2}, \qquad \theta = \operatorname{atan2}(y, x)

を求めます。θ\theta は −π-\pi〜π\pi なので、θ/2π+0.5\theta / 2\pi + 0.5 で 0〜1 に正規化して使うと扱いやすくなります。

やりたいこと極座標での書き方
同心円のリングrr が特定の値に近いところを光らせる
放射状の線(NN 本)fract(θN)\text{fract}(\theta N) が 0.5 に近いところ
全体を回転θ+ωt\theta + \omega t で模様を作る
渦・ねじれθ+k r\theta + k\,r で模様を作る(外側ほど角度がずれる)
花形・星形半径を r0 (a+bcos⁡(nθ))r_0\,(a + b\cos(n\theta)) のように角度で変える

直交座標のまま同じ式を使うと、同心円のかわりに縦縞、回転のかわりに平行移動になってしまいます。デモの「直交座標で同じ式」でこの違いを確認できます。

実装のポイント

  • 角度の継ぎ目:θ\theta は −π-\pi と π\pi の境界(多くの場合 −x-x 方向)で不連続です。fract(theta * N) のように NN が整数なら継ぎ目は消えますが、テクスチャを極座標でサンプリングすると、ミップマップの計算で境界に 1 画素の線が出ることがあります。textureGrad で微分を指定するか、ミップマップを使わないことで回避します。
  • 中心の特異点:r=0r = 0 では角度が定義できません。中心付近は別の模様で隠すのが定番です。
  • テクスチャの極座標サンプリング:長方形のテクスチャを (θ,r)(\theta, r) で参照すると、帯状の模様を円環に巻き付けられます。ルーン文字の帯を 1 枚の横長テクスチャで作れます。

つまずきやすい点

  • アスペクト比:画面全体を対象にする場合、縦横比を補正しないと円が楕円になります。
  • 中心ほど模様が詰まる:角度方向の模様は、中心に近いほど細かく詰まり、エイリアシング(ちらつき)が出やすくなります。
  • atan の引数の順序:atan(y, x) の順です。逆にすると 90° ずれ、向きも反転します。

デモで試すこと

  1. 「距離 r と角度 θ を色で表示」をオンにすると、赤(中心から外へ増える r)と緑(一周で 0→1 に増える θ)の変換そのものが見えます。
  2. 「渦(ポータル)」で「ねじれ」を 0 にすると、腕がまっすぐな放射状になります。値を上げるほど強く渦を巻きます。
  3. 「直交座標で同じ式」に切り替えると、同じ計算がただの縞模様になることを確認してください。

References

Unreal Engine Material Coordinates ↗

A general reference for this subcategory.