2016-11-17 10 views
1

私はカメラの前に小さな球を描こうとしていますが、5単位離れています(C++、newbyはOpenGLで、三角法では自信がありません! パンとチルトの動きをすると球が常にカメラの真ん中にあることが予想されます。私のレンダリングループでopenGL:カメラの正面に球を正しく描けない

、私は次のように球の座標を計算:

// 1) settimg my camera 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glRotatef(camera_angle[1], 0, 1, 0); 
glRotatef(camera_angle[0], 1, 0, 0); 
glRotatef(camera_angle[2], 0, 0, 1); 
glTranslatef(camera_pos[0],camera_pos[1],camera_pos[2]); 

// 2) retrieving camera pan tilt angles in radians: 
double phi = camera_angle[1] *(M_PI/180.0); //pan 
double theta = camera_angle[0] *(M_PI/180.0); //tilt 

//3) calculating xyz coordinates of the sphere, if 5 units away from camera 
double dist = -5; 
double ax = camera_pos[0] + (-1)*(dist*sin(phi)*cos(theta)); 
double ay = camera_pos[1] + dist*sin(theta); 
double az = camera_pos[2] + dist*cos(theta)*cos(phi); 

//4) draw sphere 
float ndiv = 2.0; 
GLfloat f[]={1.0,1.0,1.0,1}; 

glPushMatrix(); 
glTranslated(ax, ay, az); 
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, f); 
glShadeModel(GL_FLAT); 
glBegin(GL_TRIANGLES); 
for (int i=0;i<20;i++) 
makeTri(vdata[tindices[i][0]], vdata[tindices[i][1]], vdata[tindices[i][2]], ndiv, 0.2); 
glEnd(); 
glPopMatrix(); 

私はここに三角関数式 spherical coordinate system

私は罪とCOSのようないくつかの値を反転ノートを見つけました私は、正しい順序は参照システムに依存すると思います(私は、OpenGLには逆軸があると思います)。

は今、私は奇妙な結果を持って、それはこのビデオで見ることができます。

sphere behaviour

、ちょうど見て、背景とカメラの中央にある緑色の四角形で色の球を無視してくださいカメラの前にある白い球で。

ご覧のとおり、パンまたはチルトのみを実行すると(正確なカメラアングルを示す左下の値を見てください)、白い球は常にカメラの正確な中心にあります。それにもかかわらず、パンとチルトが一緒に実行されると、球がドリフトします。 パンとチルトの値が0度から離れるほど、球がドリフトします。さらに、ドリフトの形は、私にとっては非常に疑わしい円形の軌道に従います。

アイデアはありますか?あなたは、単に最初からアイデンティティモデルビュー行列から開始するカメラに対して移動しないものを描くのおかげ

答えて

1

float ndiv = 2.0; 
GLfloat f[]={1.0,1.0,1.0,1}; 

glPushMatrix(); 
glLoadIdentity();   // <------------- zero out transforms 
glTranslated(0, 0, -5); // <------------- translate 5 units from the camera 
glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, f); 
glShadeModel(GL_FLAT); 
glBegin(GL_TRIANGLES); 
for (int i=0;i<20;i++) 
makeTri(vdata[tindices[i][0]], vdata[tindices[i][1]], vdata[tindices[i][2]], ndiv, 0.2); 
glEnd(); 
glPopMatrix(); 
+0

おかげで多く、それが動作します!とにかく、なぜ私の方法が適切に動作しないのか分かりませんか?私はいくつかの数学を間違っているのですか? –

+1

@valerio_sperati:申し訳ありませんが、私は数学をチェックするにはあまりにも怠惰です:)ほとんどの場合、おそらくあなたは操作の順序をどこかで混ぜ合わせました - 回転は可換ではないことを忘れないでください。あなたは別の結果を得ることができます。 – ybungalobill

+0

ありがとうございます、あなたは正しいです!私は今、私のコードの最初の行で、私がカメラを回転させたところで、glRotatef()をこの(間違った)順序で呼び出しました:1,0,2。今私は0,1,2として順序を修正し、結果として私のコードが動作します!もう一度ありがとう –

関連する問題