1

私は現在、テクスチャ付きの球体 (地球を表す) とプレイヤー モデルを表すキューブ (後で実装される) をレンダリングするゲームに取り組んでいます。

ユーザーが球上の点をクリックすると、立方体は原点 (0,0,0) (球の中心でもある) から球の表面上の点に移動します。

問題は、立方体を回転させて、球の表面に平らな底面を置いて座るようにすることです(立方体を平行移動するだけではありません)。

この効果を得るために、各軸の回転行列を計算する最善の方法は何ですか?

4

1 に答える 1

2

これは、「lookat」行列を作成するために実行するのと同じ計算です。

この形式では、球上の正規化された点を 1 つの軸 (多くの場合、「Z」軸として使用) として使用し、他の 2 つをそれに垂直なベクトルとして作成します。通常、これを行うには、最初の軸に平行である必要のない任意の「上」軸を選択してから、2 つの外積を使用します。最初に「Z」と「上」を交差させて「X」軸を作成し、次に「X」軸と「Z」軸を交差させて「Y」軸を作成します。

X、Y、および Z 軸 (正規化) は、立方体を球の表面法線に向ける回転行列を形成します。次に、それをサーフェス ポイントに変換します。

GL の基本的な考え方は次のとおりです。

float x_axis[3];
float y_axis[3];
float z_axis[3]; // This is the point on sphere, normalised

x_axis = cross(z_axis, up);
normalise(x_axis);
y_axis = cross(z_axis, x_axis);

DrawSphere();

float mat[16] = {
    x_axis[0],x_axis[1],x_axis[2],0,
    y_axis[0],y_axis[1],y_axis[2],0,
    z_axis[0],z_axis[1],z_axis[2],0,
    (sphereRad + cubeSize) * z_axis[0], (sphereRad + cubeSize) * z_axis[1], (sphereRad + cubeSize) * z_axis[2], 1 };

glMultMatrixf(mat);

DrawCube();

は球z_axis[]上の正規化された点であり、x_axis[]はそのベクトルと任意の「上」ベクトルとy_axis[]の正規化された外積であり、 は他の 2 つの軸の正規化された外積です。sphereRadcubeSizeは球と立方体のサイズです。両方の形状がローカル座標の原点を中心にしていると仮定しています。

于 2013-02-01T20:22:28.040 に答える