私は現在、テクスチャ付きの球体 (地球を表す) とプレイヤー モデルを表すキューブ (後で実装される) をレンダリングするゲームに取り組んでいます。
ユーザーが球上の点をクリックすると、立方体は原点 (0,0,0) (球の中心でもある) から球の表面上の点に移動します。
問題は、立方体を回転させて、球の表面に平らな底面を置いて座るようにすることです(立方体を平行移動するだけではありません)。
この効果を得るために、各軸の回転行列を計算する最善の方法は何ですか?
私は現在、テクスチャ付きの球体 (地球を表す) とプレイヤー モデルを表すキューブ (後で実装される) をレンダリングするゲームに取り組んでいます。
ユーザーが球上の点をクリックすると、立方体は原点 (0,0,0) (球の中心でもある) から球の表面上の点に移動します。
問題は、立方体を回転させて、球の表面に平らな底面を置いて座るようにすることです(立方体を平行移動するだけではありません)。
この効果を得るために、各軸の回転行列を計算する最善の方法は何ですか?
これは、「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 つの軸の正規化された外積です。sphereRad
とcubeSize
は球と立方体のサイズです。両方の形状がローカル座標の原点を中心にしていると仮定しています。