1

VRML 2.0 でいくつかのファイルをプログラムで作成しています。原点に底があり、特定の座標に上がある円柱を作成する必要がありますが、回転を把握するのに問題があります。Google で検索しましたが、VRML 2.0 に関するドキュメントは非常に少ないようです。

私がやろうとしていることに球座標が最適に機能すると仮定したので、目標点 (x、y、z) の球座標 (r、シータ、ファイ) を計算しました。次に、以下のファイルを作成しました。

#VRML V2.0 utf8

DEF v1 Transform {
    translation 0 0 0
    children Shape {
        geometry Sphere {radius .5}
    }
}
DEF v2 Transform {
    translation x y z
    children Shape {
        geometry Sphere {radius .5}
    }
}
DEF edge Transform {
    translation 0 0 0
    children Transform {
        rotation 0 1 0 theta-pi/2
        children Transform {
            rotation 0 0 1 phi-pi/2
            children Transform {
                translation 0 r/2 0
                children Shape {
                    geometry Cylinder {
                        radius .08
                        height r
                    }
                }
            }
        }
    }
}

そして、ここにいくつかの値の例を含むバージョンがあります:

#VRML V2.0 utf8

DEF v1 Transform {
    translation 0 0 0
    children Shape {
        geometry Sphere {radius .5}
    }
}
DEF v2 Transform {
    translation 4 3 3
    children Shape {
        geometry Sphere {radius .5}
    }
}
DEF edge Transform {
    translation 0 0 0
    children Transform {
        rotation 0 1 0 -0.54041949679
        children Transform {
            rotation 0 0 1 -0.92729521779
            children Transform {
                translation 0 2.915475947 0
                children Shape {
                    geometry Cylinder {
                        radius .08
                        height 5.830951895
                    }
                }
            }
        }
    }
}

この最後のファイルを表示すると、円柱が実際にはかなり近づいていることがわかりますが、まだそこまでではありません。

4

1 に答える 1

2

OK、私がこのようなことをしてから長い時間が経ちましたが、あなたのアプローチが機能しない理由とその方法はわかったと思います. あなたが試したように、球座標を使用して計算することは、それ自体が回転しない FIXED 参照フレームからのものです。しかし、VRML のコードで y を中心に回転すると、z 軸は以前の位置ではなく、回転します。参照フレームが変更されました。

1 つの方法として、オイラー角と複数の x、y、z 回転を使用する方法がありますが、クォータニオン(回転ベクトルの x、y、z 座標を表し、回転量)。式の由来については、この Q&Aを参照してください。

アプローチ: 円柱の座標系で向きを変えた y 軸を、原点から指定された座標までのベクトルに合わせたいので、回転で点 0,r,0 を新しく指定された x,y,z に移動したい. 方法は次のとおりです。

  1. v1 は 0,r,0 (r は円柱の高さ)
  2. v2 は、上部の中心にしたい座標です
  3. ベクトル a = crossproduct(v1,v2)
  4. ベクトル a を正規化します。VRML仕様。は、正規化された回転ベクトルを期待していると言っているので、申し訳ありませんが安全であることをお勧めします。正規化するには、ベクトル a の長さを計算し、x、y、および z コンポーネントを長さで割ります。
  5. 回転角度は長さ(v1) * 長さ(v2) + 内積(v1,v2)
  6. したがって、ステップ 4 で計算された正規化されたベクトル a とステップ 5 で計算された角度の x、y、および z 値を使用する単一の回転変換が必要です。
于 2015-04-25T22:28:42.300 に答える