ElevationGridノードの表示について

地形を作成するために、ElevationGridノードで以下の内容で、
body形式とwrl形式の2つのファイルを作成しました。

(floor_asa.body)

format: ChoreonoidBody
formatVersion: 1.0
name: floor_asa

links:
  -
    name: floor_asa
    translation: [ 0, 0, -0.1 ]
    jointType: fixed
    material: Ground
    elements:
      -
        type: Shape
        geometry: { type: ElevationGrid,
            xDimension: 4,
            zDimension: 5,
            xSpacing: 1,
            zSpacing: 1,
            height: [
                0, 0, 0, 0,
                0, 1, 1, 0,
                1, 2, 2, 1,
                0, 1, 1, 0,
                0, 0, 0, 0
               ]
    	}
        appearance: { material: { diffuseColor: [ 0.8, 0.7, 0.3 ] } }

(floor_asa.wrl)

#VRML V2.0 utf8
Shape {
  geometry ElevationGrid {
    xDimension 4
    zDimension 5
    xSpacing 1
    zSpacing 1
    height [
      0, 0, 0, 0,
      0, 1, 1, 0,
      1, 2, 2, 1,
      0, 1, 1, 0,
      0, 0, 0, 0
    ]
  }
  appearance Appearance {
    material Material {diffuseColor 0.8 0.7 0.3}
  }
}

これらをchoreonoidでボディとして読み込みしたところ、
zDimensionの定義がY軸に、heightの値がZ軸に変換されてしまっているようです。

こちらはバグでしょうか?

お世話になります。

質問させていただいて以降、私の方でも「share/model」フォルダなどを参考に継続調査しました。

結果、wrlファイルではTransformノードを追加し、childrenにElevationGridノードを定義

(floor_asa.wrl)

#VRML V2.0 utf8
Transform {
  translation 2 5 0
  rotation 1 0 0 1.572
  children Transform {
    children Shape {
      appearance Appearance {
       material Material {diffuseColor 0.8 0.7 0.3}
      }
      geometry ElevationGrid {
        xDimension 4
        zDimension 5
        xSpacing 1
        zSpacing 1
        height [
          0, 0, 0, 0,
          0, 1, 1, 0,
          1, 2, 2, 1,
          0, 1, 1, 0,
          0, 0, 0, 0
        ]
      }
   }
 }
}

bodyファイルでは「translation」「rotation」の定義を追加

(floor_asa.body)

format: ChoreonoidBody
formatVersion: 1.0
name: floor_asa3

links:
  -
    name: floor_asa
    jointType: fixed
    material: Ground
    elements:
        type: Shape
        translation: [ 2, 5, 0 ]
        rotation: [ 1, 0, 0, 90 ]
        geometry: { type: ElevationGrid,
            xDimension: 4,
            zDimension: 5,
            xSpacing: 1,
            zSpacing: 1,
            height: [
                0, 0, 0, 0,
                0, 1, 1, 0,
                1, 2, 2, 1,
                0, 1, 1, 0,
                0, 0, 0, 0
            ]
    	}
        appearance: 
            material: 
                diffuseColor: [ 0.8, 0.7, 0.3 ]

で以下の通りの表示になりました。

定義方法で認識に違いがないでしょうか?

zDimensionの定義がY軸に、heightの値がZ軸に変換されてしまっているようです。

実は現在の仕様上はこれが正しい挙動となります。
確かに分かりにくいですし、この仕様についてこれで良いのかというところもあります。

ご参考までにこのような仕様になった背景を以下に説明します。

まずChoreonoidの幾何形状ノードについては、基本的にVRML97(VRML2.0)という形式の記述方式を踏襲しています。

VRML97については、1997年に策定された三次元モデルの記述形式です。

仕様の詳細は以下にあります。
http://tecfa.unige.ch/guides/vrml/vrml97/spec/part1/nodesRef.html

この形式は元々3DCG分野で策定されたものです。CG分野では歴史的にZ軸を奥行き方向、Y軸を鉛直報告にとる慣例があります。これは元々CGが2次元でX、Y軸を用いて描画していたところ、3次元に拡張するにあたって追加のZ軸を奥行き方向に取ることにしたことによります。今でもCGツールではデフォルトでY軸が鉛直方向に取られているものも多いです。したがってVRML97でなくても、CG分野の3Dモデル記述方式では同様の座標系に取られるものも多いです。

この座標系の取り方はシリンダやコーンなどのプリミティブ形状にも影響します。それらの形状ではradiusとheightというパラメータで記述することが多いですが、その際にシリンダやコーンは円状の面が水平方向にとられてheight方向が鉛直方向にとられることが多いです。そして、鉛直方向をY軸にとるかZ軸にとるかで、形状の向きが変わってきます。

そしてElevetionGridについては、これはVRML97の仕様がそうなっているということなのですが、パラメータとしてはx, zという表記なのですが、実際にはzはy方向を意味しているのですよね。
http://tecfa.unige.ch/guides/vrml/vrml97/spec/part1/nodesRef.html#ElevationGrid

これはなぜこうなったかと言うと、要はハイトフィールドというものは一般的にハイトをZで表現するものの、CGの座標系としてはY軸が鉛直方向であるので、無理やりそこの部分を合わせようとしたのだと思われます。

ですのでVRML97の仕様に合わせている限りでは、この挙動で正しくなります。

そのように、CGではY軸が鉛直方向ですが、ロボット分野ではフィールドとなる水平面がXY軸で定義されて、鉛直方向をZ軸にとる座標軸が一般的ですよね。ですのでCGの座標系をそのまま持ってくると使いにくい(向きを90度傾ける必要が出てくることが多くなる)ですし、分かりにくいですね。

その意味ではZ軸を鉛直方向とする座標系にあう表記方法にしてもよいのですが、基本的な記述形式としてはCGで実績のあるものを踏襲するのがよいのではないかということと、歴史的にChoreonoidの前に産総研で開発されたロボットシミュレータOpenHRPにおいてVRML97がモデルファイルとして採用されていたこともあり、このような現状となっています。

この件に関して座標系を変更した方がよいというご意見が多ければ、今後の変更も検討したいと思います。

現状では、欲しい形状に対してX軸回りに90度回転した形状となることも多いので、その場合は今回ご対応いただいたように、座標変換を追記することで対処することになります。対処方法としては上記ご投稿の方法で間違いありません。

お世話になります。

ご確認ありがとうございました。

また、詳細な説明もありがとうございます。

表示が変わってしまう件はElevationGrid以外にも影響を受けることも理解しました。

つきましては、
Choreonoid 開発版 ドキュメント » ロボット/環境モデルの基本 » モデルファイル »
Bodyファイル リファレンスマニュアル
幾何形状ノード
(Bodyファイル リファレンスマニュアル — Choreonoid 開発版 ドキュメント)

に、ご解説頂いた内容を反映していただけると、今後Choreonoidに携わる方々の役に立つと考えます。