2

私は最近、STL ファイル (立体造形ファイル形式 - 基本的には三角形のリスト) を生成する Python ベースのアプリを作成する任務を負っています。私はPythonが初めてで、過度に複雑なライブラリの使用を避けようとしています. 私が抱えている問題は、作成したベクター クラスの 3D 回転にあります。

ベクトル クラスの回転関数は次のようになります。

def rotateY(self, amount):
    '''Rotates a vertex on the Y axis around the origin by a given amount (in radians)'''       
    self.x = self.x * math.cos(amount) + self.z * math.sin(amount)
    self.y = self.y
    self.z = self.x * (-math.sin(amount)) + self.z * math.cos(amount)

ご想像のとおり、ベクトル クラスには x、y、および z コンポーネントがあります。私は 3D 変換と数学にかなり精通しており、私が知る限り、コードは正しいように見えます。物事をシンプルに保つために、他のマトリックス ライブラリを取り込む必要はありません。

次のようなことをしようとすると、問題が発生します。

v = vector(50.0, 0.0, 0.0)
rotationAmount = math.radians(10.0)
for i in range(0, 36):
    v.rotateY(rotationAmount)
    #Draw something at (v.x, v.y, v.z), 
    #...or in my case, create a list of triangles to export to an STL file

y 軸を中心に回転すると、原点から回転されるポイントまでの距離がゆっくりと減少します。これは、各回転後にベクトルの位置に 3D 球体を作成し、それをすべて STL としてエクスポートする例です (Maya で表示されているように)。 マヤに見られるように

ご覧のとおり、原点から回転されるベクトルまでの距離は、ベクトルが回転する回数が増えるほど確実に減少します。これは、示されているように、各回転後にベクトルの長さを出力することによってもバックアップされます (初期ベクトルは (50.0, 0.0, 0.0) の位置に設定されます)。

ベクトルを回転させるほど長さが減少する

一時的なハックと同じように、ベクトルの長さを見つけて、正規化し、回転させ、再び正規化し、元のサイズで縮小しようとしましたが、これはうまくいったようですが、取得するのは非常に汚いハックのようですこれと同じくらい簡単に機能します。

私の質問は、ベクトルの長さがゆっくりと減少する原因は何ですか?

編集:もう少し明確にする必要がありました。ベクトル クラスは、原点を中心とした回転のみをサポートします。

4

1 に答える 1