我在我的程序中有一個函數,該函數用一個角度w_nx & w_ny圍繞另一個點(x_m,y_m,z_m)旋轉一個點(x_p,y_p,z_p)。新座標存儲在全局變量x_n,y_n和z_n中。圍繞y軸旋轉(如此改變w_nx的值 - 以便y值不會受到傷害)正常工作,但只要我圍繞x軸或z軸旋轉(改變w_ny的值)座標不再準確。我評論了我認爲是我的錯誤的那一行,但我無法弄清楚那段代碼有什麼問題。圍繞另一個點旋轉一個3D點
任何人都可以幫助我嗎?
void rotate(float x_m, float y_m, float z_m, float x_p, float y_p, float z_p, float w_nx ,float w_ny)
{
float z_b = z_p - z_m;
float x_b = x_p - x_m;
float y_b = y_p - y_m;
float length_ = sqrt((z_b*z_b)+(x_b*x_b)+(y_b*y_b));
float w_bx = asin(z_b/sqrt((x_b*x_b)+(z_b*z_b))) + w_nx;
float w_by = asin(x_b/sqrt((x_b*x_b)+(y_b*y_b))) + w_ny; //<- there must be that fault
x_n = cos(w_bx)*sin(w_by)*length_+x_m;
z_n = sin(w_bx)*sin(w_by)*length_+z_m;
y_n = cos(w_by)*length_+y_m;
}
如果你使用[tag:opengl]我確定一個圖形庫將有一個矩陣和載體植入,你可以使用。通過矩陣旋轉點將簡化您的算法。 – andre
@ahenderson你的意思是「執行」? ;) – leemes
如果你還不熟悉這個術語,你應該閱讀「Gimbal Lock」。我不能立即告訴你的代碼是否會受到它的影響,但當你使用「歐拉角」進行這種旋轉時,這是一個常見的缺陷。 – Rook