はじめに
上記の続きになります!
今回はトロコイド曲線でハイトマップを生成するところから。
数学のお時間
さあやってまいりました!数学弱者には苦痛でしかないお時間が!
前回少しトロコイド曲線、もといサイクロイド曲線についてお勉強したんですが、
トロコイド曲線といっても様々なものがあるので
今回は限りなく波に近いトロコイド曲線を作っていこうと思います!
トロコイド曲線
x=周期
y=波の高さ
a=円の半径
b=円の中心から軌道を描く点までの距離
θ=円が転がった角度
x=aθ−bsinθ
𝑦=𝑎−𝑏cos𝜃
まあ、確かにこのままだと波ではない。
y軸を反転
ので、y軸を反転させる
x=aθ−bsinθ
𝑦=-
(𝑎−𝑏cos𝜃)
おお、これだけでもだいぶ波。
正の数に
で、これをより扱いやすくするために曲線全体がピタッと正の数になるように
y=0からy=曲線上の最も低い場所(例えばθが180゚である場所)までの距離を足す
x=aθ−bsinθ
𝑦=-(𝑎−𝑏cos𝜃) + (𝑎−𝑏cos180゚)
↓
y=b(cos𝜃+1)
bを振幅として扱いたい
現段階でyの取りうる値の範囲
は
cos𝜃の取りうる範囲が-1~1なので
b(-1+1)~b(1+1) つまり
0~2b
である
これを b を波の振幅として扱いたいらしいので
y=b(cos𝜃+1)-b
↓
y=bcos𝜃
となる。
一旦ここでまとめ
いらない工程があったような気もしたんですが、結論
"波の高さ=振幅cosθ"
円の半径aと円の中心から軌道を描く点までの距離bの関係
今まで a = bでの話をしてきたんですが
この2つの値の関係値によって波の形が異なってきます。
波だなって感じられるのはa>bのとき
(今回はb >= 0とする)
aとbをパラメータによって算出したい
x=aθ−bsinθ
y=bcos𝜃
今のところ波の式は上記のようになっているんですが
最終的には具体的なパラメータによって算出できるようにしたい
例:波長と波の尖り度合とかを渡したらその波が作り出せる
ってわけで、次にやることは参考サイトによれば
bをaの割合で表したい
ということで
R = aに対する割合(0~1の値をとる尖り係数)
b = aR
とする
次にaとbをこの尖り係数Rと波長Lという
2つのパラメータを使って表す
a = L/2π
b = R・L/2π
ただ、ここで仮に
Lを2、Rを1、θをπとした時に
波長はそのまま2
最大の波高が2b=2/π≒0.636
つまり
波長:最大の波高 = 1:0.318
となるんですが、前々回波について調べた結果
現実の波は大体
波長:最大の波高 = 1:0.142
ってことがわかっています。
そう、現段階の式だと割合がリアルじゃないんです。
なので
b = R・L/2π/2
↓
b = R・L/4π
とすると大体それっぽい割合になる
整理すると
x=(L/2π)θ−(R・L/4π)sinθ
y=(R・L/4π)cos𝜃
位相
動かない波であれば
x=(L/2π)θ−(R・L/4π)sinθ
y=(R・L/4π)cos𝜃
でいいんですが、
動かしたい場合はxに移動距離を足さないといけません
移動距離は速度×時間
時間はtで表せばいいんですが
速度がちょっとわかりづらくて
v = √(L/2π・g)
Lが波長、gが重力です
理解は後にして
とりあえず最終の式を出す
x=(L/2π)θ−(R・L/4π)sinθ+√(L/2π・g)・t
y=(R・L/4π)cos𝜃
長い!!!!!!!!!
実装
さあ実装してみよう!
と、行きたいところなんですが。
x=(L/2π)θ−(R・L/4π)sinθ+√(L/2π・g)・t
y=(R・L/4π)cos𝜃
これは媒介変数表示であり、
xとyの値は互いに直接的に干渉しません。
つまり、時間がどう進もうが波の高さが変化しないんです。
しかも、媒介変数であるθをxで表すこともできないらしいので
ほんとにお手上げ。
え。どうしたらいいの?
で、一応解決策的なものはあるらしくて
それが
θをニュートン法で探索する
いや知らん。ニュートン法ってなんぞ。
疲れたので今日はここまで。
本当は適用+頂点シェーダも使いたかったんですが、
思ったより理解に時間がかかってしまった...
次回はニュートン法を理解するところから始まる気がする
ってかなんか元々の目標から離れていってる気がするけど大丈夫なんだろうか
小話:有義波
波には尖りがあるという話を前回したんですが、
その「人間が尖っていると感じる波」は有義波
ってのに含まれているらしい。
有義波とは、目に入った波全体のうち、1/3ぐらいの割合で含まれる
「人が目で見て動いているなと認識できる波」です。らしいです。
残りの2/3は小さすぎてどう動いているのか認識できないとのこと。
まあ、簡単に言えば
波の構成は 大きい波:小さい波 = 1 : 2 ってこと「らしい」
開発環境
IDE:VisualStudio2022
使用言語:c/c++
使用ライブラリ:DirectXTex,DirectXMath etc.
関数グラフ作成サイト様
https://www.geogebra.org/graphing?lang=ja