デカルト座標系の点から球面座標で角度thetaとφを見つけようとします。opengl、球座標をデカルト座標から変換する
答えが見つかりました。正しくありません。しかし、私は何が起こっているのか理解できません。 私を助けてください。
はここに私のコードです:。。。_teye.get_posの
Vector4 g_eye(8.0f, 8.0f, 8.0f);
Vector4 g_lookat(0.0f, 0.0f, 0.0f);
Vector4 g_up(0.0f, -1.0f, 0.0f);
struct spherical_sys
{
spherical_sys(Vector4& p)
{
_dirty = 1;
_pos = p;
_pos.w = 0.0f;
get_spherical(_pos, _theta, _phi, _r);
}
float getTheta()
{
return _theta;
}
float getPhi()
{
return _phi;
}
void setTheta(float t)
{
_theta = t;
_dirty = 1;
}
void setPhi(float t)
{
_phi = t;
_dirty = 1;
}
Vector4 get_pos()
{
if (_dirty)
{
float sin_phi, cos_phi;
float sin_theta, cos_theta;
FastMath::SinCos(_phi, sin_phi, cos_phi);
FastMath::SinCos(_theta, sin_theta, cos_theta);
_pos.w = 0.0f;
_pos[0] = _r* cos_phi * cos_theta;
_pos[1] = _r* sin_phi;
_pos[2] = _r* cos_phi * sin_theta;
_dirty = 0;
}
return _pos;
}
private:
void get_spherical(Vector4& dir, float& theta, float& phi, float& r)
{
r = dir.Length();
dir.Normalize();
phi = FastMath::ACos(Vector3Dotf(dir, Vector4(0.0f, 1.0f, 0.0f, 0.0f)));
Vector4 v = Vector3CrossProduct(Vector4(0.0f, 1.0f, 0.0f, 0.0f), dir);
if (v.x < 0.0f)
{
phi *= -1;
phi = phi + MATH_PI * 0.5f;
}
else
{
phi = phi - MATH_PI * 0.5f;
}
theta = FastMath::ACos(Vector3Dotf(dir, Vector4(1.0f, 0.0f, 0.0f, 0.0f)));
v = Vector3CrossProduct(Vector4(1.0f, 0.0f, 0.0f, 0.0f), dir);
if (v.y < 0.0f)
{
theta *= -1;
}
}
float _phi;
float _theta;
float _r;
Vector4 _pos;
int _dirty;
};
spherical_sys _teye(g_eye);
spherical_sys _tup(g_up);
答()のx、_teye.get_pos()Y、_teye.get_pos()zは6.531521、-7.998896、-9.238880ました。
明らかに、何かが間違っています。
dirベクトルが正規化されているように見えます。つまり、 'phi'と' theta'の計算で 'r'で割り切れることは間違っています。これを修正します... –
私の元の考えでは、acos (dot(dir、unit_z))はphiを見つけることができ、theta acos(dot(dir、unit_x))と同じように2つの方向の間の角度を見つけることができます。しかし、おそらく何か間違っている。 –
'phi'は' theta 'とは異なります。それは '[-pi、pi]'の範囲が異なります。ベクトルとX、Y平面の間の角度です。 「Theta」はX、Y平面の円の完全な方向、[0,2pi]です。乾杯! –