tanaka's Programming Memo

プログラミングについてのメモ。

Terrainの高さの取得

地形(Terrain)の指定の座標の高さを得ようと、GetInterpolatedHeight()にマップのX座標とZ座標を指定して戻り値を得てみたが、正しい値が取得できなかった。

解決策を探して、Unity Forumで以下を発見。
TerrainData.GetInterporatedHeight

GetInterpolatedHeight()に与えるパラメータは、マップのX,Z座標そのままではなく、マップ座標をマップの幅と奥行きで割って、0〜1に正規化した値を指定することが分かった。

float height = Terrain.activeTerrain.terrainData.GetInterpolatedHeight(
    posx / Terrain.activeTerrain.terrainData.size.x,
    posz / Terrain.activeTerrain.terrainData.size.z);

以上で、正しい高さが得られた。

番外

RaycastHitを使って、以下のようにしても求められた。0と地面の間に何もないことが前提。

GetInterpolatedHeight()を使うのが本筋で、処理的にも速いと思われるので、以下の処理はGetInterpolatedHeight()に差し替えた。

RaycastHit hit;
Vector3 pos = new Vector3(posx,0.0f,posz);
float height = 0.0f;
if (Physics.Raycast(pos,Vector3.up,out hit)) {
    height = hit.distance;
}