こんにちは、私の質問が繰り返しになる場合は申し訳ありません。グラフィックスに python と pygame を使用して最初の 3D エンジンを構築しています。主な 3D 変換は次のとおりです。
def param(x,y,z):
vec_rx = rotate_x((x,y,z), angle_x)
vec_ry = rotate_y(vec_rx , angle_y)
vec = rotate_z(vec_ry , angle_z)
return ((zoom * vec[0])/(70-vec[2]) + win_width/2,( (zoom * vec[1])/(70-vec[2]) ) + win_height/2)
70 は原点からの距離です。回転は、行列を乗算することによって行われます。
def rotate_x(vec,angle):
a = vec[0]
b = vec[1]*math.cos(angle) - vec[2]*math.sin(angle)
c = vec[1]*math.sin(angle) + vec[2]*math.cos(angle)
return (a,b,c)
def rotate_y(vec,angle):
a = vec[0]*math.cos(angle) + vec[2]*math.sin(angle)
b = vec[1]
c = -vec[0]*math.sin(angle) + vec[2]*math.cos(angle)
return (a,b,c)
def rotate_z(vec,angle):
a = vec[0]*math.cos(angle) - vec[1]*math.sin(angle)
b = vec[0]*math.sin(angle) + vec[1]*math.cos(angle)
c = vec[2]
return (a,b,c)
角度は、キーボード/マウス入力で変化する 3 つのグローバル パラメータです。角度がゼロの場合、回転は各軸を中心に完全ですが、ゼロでない場合、オブジェクトは軸を中心に回転しませんが、奇妙なオフセットがあります。よくわかりませんが、ジンバルロックかもしれません。
これは、desmos で作成された私のプロジェクトの 3D エンジンの例です: https://www.desmos.com/calculator/8by2wg0cek 角度を操作して、同様の効果を確認できます。
軸の周りを完全に回転させるために不足しているものはありますか?
どうもありがとうございます!