3

プログラムに球があり、この球の中心からxの距離にいくつかの長方形を描画するつもりです。図は次のようになります。

ここに画像の説明を入力してください

長方形は、3Dポイントのベクトルにすでにある(x、y、z)ポイントに描画されます。中心からの距離xが10であるとしましょう。これらの長方形の方向に注意してください。これらは半径10の仮想球に接しています(球の中心から長方形の中心への仮想線に垂直)。

現在、私は次のようなことをしています。

vector<vec3f> pointsInSpacerectnaglesをプロットする必要があるnポイントの場合

for(int i=0;i<pointsInSpace.size();++i){
    //draw rectnagle at (x,y,z)
}

私が探しているこの種の接線方向はありません。これらの長方形のそれぞれに回転を適用しroll,pitch,yaw、クォータニオンを使用して、探しているものに対して接線方向にするように見えました。しかし、それは私には少し複雑に見えたので、これを行うためのより良い方法について質問したいと思いました。

また、将来的に長方形が他の形に変わる可能性があるので、一種の一般的な解決策をいただければ幸いです。

4

2 に答える 2

1

基本的に、LookAt()関数で実行されるのと同じ変換が必要だと思います(長方形が、長方形の中心から球の原点までのベクトルに沿って球を「見る」ようにします)。

長方形が点で構成されている場合:

(-1, -1, 0)
(-1,  1, 0)
( 1, -1, 0)
( 1,  1, 0)

次に、長方形の法線はZに沿って指します。この軸は、球の方向を向いている必要があります。

したがって、点から球の中心までの正規化されたベクトルはZ軸です。

次に、明確な「上」ベクトルを定義する必要があります-(0,1,0)が一般的ですが、Z軸が同じ方向を指している場合は、別のベクトルを選択する必要があります。

'up'軸と'z'軸の交差はx軸を与え、次に'x'軸と'z'軸の交差は'y'軸を与えます。

これらの3つの軸(x、y、z)は、回転行列を直接形成します。

この結果の変換行列は、長方形を適切に方向付けます。GLの固定関数パイプライン(yuk)を使用するか、この場合はgluLookAt()を使用するか、独自のコードで適切な方法で上記のマトリックスを作成して使用します。

于 2012-12-23T13:33:21.797 に答える
0

個人的にはJasonDの答えで十分だと思います。しかし、ここに関連する計算のいくつかの情報があります。

数学的に言えば、これはかなり単純な問題です。あなたが持っているのは2つの既知のベクトルです。あなたは位置ベクトルと球の法線ベクトルを知っています。正方形は球の中心からベクトルの周りを任意に回転できるため、もう1つのベクトルである上向きベクトルを定義する必要があります。ベクトルを定義しないと、不可能な解決策になります。

上向きベクトルベクトルを定義すると、問題は単純になります。JasonDが上で示唆したように、正方形がXY平面上にあると仮定します。次に、マトリックスは次のようになります。

up_dot_n_dot_n.X      up_dot_n_dot_n.Y       up_dot_n_dot_n.Z     0
n.X                   n.y                    n.z                  0
up_dot_n.x            up_dot_n.x             up_dot_n.z           0 
p.x                   p.y                    p.z                  1

nがpの通常の単位ベクトル-球の中心(球が座標系の中心にある場合は自明)である場合、upは任意の単位ベクトルベクトルです。pはフォーム定義に従い、位置です。

この解は、球の上方方向に少し特異性があります。別の解決策は、最初の360度を上向きに回転させ、180度回転した軸を上向きに回転させることです。特異性の問題がない同じものの異なるアプローチを生成します。

于 2012-12-23T22:46:38.983 に答える