やっとこ、TankをHightMapで動かすサンプルを追っかけれました。
前回のサンプルと内容は似ているが、新しいメソッドなども使われてて
行列が苦手な私にはちょっとチンプン・・・。
-------------
ってことで、
まずはハイトMAPを作るためのパイプランから、
<TanksOnAHeightmapPipeline>
基本的には前回と同じなんだが、
フィールドにNormalsというVector3の二次元配列が増えている。
何を入れているのかなぁと下を見に行くと
MAPの[x,z]のポジションを保持させると同時に
Vector3 normal = (Vector3)geometry.Vertices.Channels[VertexChannelNames.Normal()][i];
のように「頂点チャンネル」を突っ込んでる。
って、MSDNには知ってて当然のように書いてますが、
「頂点チャンネル」って何さ?
MSDN曰く、「頂点が持っている任意のデータ」だそうだ。
家にはグラフィック専門用語辞書なんて粋なものはないから、ググってみると
どーも、頂点が持っているプロパティのようなものらしい。
今回はVector3に突っ込んでるので、
その頂点での傾きを表すベクトルなんではないかと。
(まちがってたらごめんなさい)
で、それをパイプラインのwriterでNomalsを書き出します。
>>>>>>>>>Tank.csへ
続いて、Tankを見てみる。
大まかには前回のボールのサンプルと同じだが、
HandleInputメソッドで
heightMapInfo.GetHeightAndNormal(newPosition,out newPosition.Y, out normal);
を使用してnormalを作って、それを元にタンクの傾きを決定している。
>>>>>>>HeightMapInfo
ってことで、GetHeightAndNormalを見る
・・・とLerpという謎メソッドが多用されている。
説明を見ると線形補完ですと!
なにそれ?
Wikipediaによると、「2点から、2点を結ぶ線上のある1点を算出する事」のようである。
でも、いまはVector3のようなベクトルナンですけど?
うーん、
原点をO
normals[left, top] をA
normals[left + 1, top] をB
として、
その3点が表す平面上の点(ってかベクトル)を算出しているのだ。おそらく。
Aが今の座標で、Bが移動先の座標ってことですな。
それを頭とお尻で行って、車両の傾きを決定。
最後に、単位ベクトルにすることで、方向だけを持ったベクトルにして終了
これを、Tankにセットしてあげる事でMapに合わせた傾きを持たす事ができてるんですね。
-------------
と、半分解ったようなわかってないような状態ですが、
傾きは恐らくこのような計算で行うんでしょう。
このサンプルとは関係はないけれども、
オブジェクト(タンク)の描写、ロジックはオブジェクト自体にもたさないといけないですね。
ふむふむ。
前回のサンプルと内容は似ているが、新しいメソッドなども使われてて
行列が苦手な私にはちょっとチンプン・・・。
-------------
ってことで、
まずはハイトMAPを作るためのパイプランから、
<TanksOnAHeightmapPipeline>
基本的には前回と同じなんだが、
フィールドにNormalsというVector3の二次元配列が増えている。
何を入れているのかなぁと下を見に行くと
MAPの[x,z]のポジションを保持させると同時に
Vector3 normal = (Vector3)geometry.Vertices.Channels[VertexChannelNames.Normal()][i];
のように「頂点チャンネル」を突っ込んでる。
って、MSDNには知ってて当然のように書いてますが、
「頂点チャンネル」って何さ?
MSDN曰く、「頂点が持っている任意のデータ」だそうだ。
家にはグラフィック専門用語辞書なんて粋なものはないから、ググってみると
どーも、頂点が持っているプロパティのようなものらしい。
今回はVector3に突っ込んでるので、
その頂点での傾きを表すベクトルなんではないかと。
(まちがってたらごめんなさい)
で、それをパイプラインのwriterでNomalsを書き出します。
>>>>>>>>>Tank.csへ
続いて、Tankを見てみる。
大まかには前回のボールのサンプルと同じだが、
HandleInputメソッドで
heightMapInfo.GetHeightAndNormal(newPosition,out newPosition.Y, out normal);
を使用してnormalを作って、それを元にタンクの傾きを決定している。
>>>>>>>HeightMapInfo
ってことで、GetHeightAndNormalを見る
・・・とLerpという謎メソッドが多用されている。
説明を見ると線形補完ですと!
なにそれ?
Wikipediaによると、「2点から、2点を結ぶ線上のある1点を算出する事」のようである。
でも、いまはVector3のようなベクトルナンですけど?
うーん、
原点をO
normals[left, top] をA
normals[left + 1, top] をB
として、
その3点が表す平面上の点(ってかベクトル)を算出しているのだ。おそらく。
Aが今の座標で、Bが移動先の座標ってことですな。
それを頭とお尻で行って、車両の傾きを決定。
最後に、単位ベクトルにすることで、方向だけを持ったベクトルにして終了
これを、Tankにセットしてあげる事でMapに合わせた傾きを持たす事ができてるんですね。
-------------
と、半分解ったようなわかってないような状態ですが、
傾きは恐らくこのような計算で行うんでしょう。
このサンプルとは関係はないけれども、
オブジェクト(タンク)の描写、ロジックはオブジェクト自体にもたさないといけないですね。
ふむふむ。