5

2次元空間で等角平面上の点を移動するために必要な方程式は何ですか?

私はチューブのいくつかの場所を見てきました。主にここ。そして、私はそれを解読できませんでした。残念ながら、私は数学専攻ではありません。

私がする必要があるのは、10px ブロックで構成される等角平面上で (0,0) から (1,0) または (0,1) にポイントを移動することです。通常のビルでは、(x+10, y+0) または (x+0, y+10) を実行して、2 次元平面上で自分自身を移動します。

より良いコンテキストが得られる場合は、ほとんどの作業を iPhone の Core Animation で行います。

お時間をいただきありがとうございます。

DP

4

3 に答える 3

12

もっとグラフィカルなゲーム プログラミングをするつもりなら、少なくとも数学の未成年者を目指すことをお勧めします。

ただし、このようなグラフィックスの作業を続ける場合は、三角法、行列代数、ベクトル代数の知識を習得することをお勧めします。ベクトルと行列を使用すると、より複雑な変換 (透視投影など) が簡単になり、等角投影などの単純な変換にも役立ちます。

とにかく(そして、これのいくつかは、多くではないにしても、レビューになるかもしれません):実際には、いわゆる「グラフィカルな変換」が行うことは、平行移動、回転、スケール、反射、せん断; これらの概念のほとんどは、2 次元座標系に関してよく知られているはずであり、かなり簡単に表現できます。次の例では、「(x1, y1), (x2, y2)」という形式で表される 2 点によって定義される線分を使用します。わかりやすいように、方眼紙などに描いてみるとよいでしょう。

例: 変換は、(0, 0)、(1, 0) から (1, 0)、(2, 0)、または (0, 0)、(1, 0) から (0, 1) になります。 ), (1, 1); 回転は (0, 0), (1, 0) から (0, 0), (0, 1) になります。スケーリングは (0, 0), (1, 0) から (0, 0), (2, 0) または (0, 0), (1, 0) から (0, 0), (0.5 、0)。

より単純な表記法を使用すると、単一の点 (x, y) の移動は (x + a, y + b) として表すことができます。ここで、a と b はすべての実数の範囲内の定数です。回転は (x*cos(theta), y * sin(theta)) になります。ここで、「theta」は回転する角度値であり、スケールは (a x, b y) で、は x 軸に沿った倍率であり、b は y 軸に沿った倍率です。(均一なスケールは、両方の軸のスケール係数が等しいスケールであり、(a x, a y) になります。)

単純な変換を組み合わせると、オブジェクトを好きなように移動できます。単純な変換を組み合わせる最も簡単な方法は、行列乗算を使用することです。

...実際には、この種のことは、独学やある種の数学クラスで学習したほうがよいかもしれません.これらのことを理解していますが、今のところ見つけられる他の参考文献を紹介します.

http://en.wikipedia.org/wiki/Transformation_(geometry)
http://en.wikipedia.org/wiki/Transformation_matrix
http://en.wikipedia.org/wiki/Euclidean_vector (必要かもしれません。ならない。)

とにかく... Web 上のどこかで見つけた変換方程式を単純に使用することもできますが、変換が実際にどのように機能するかを学び、それらを自分で適用する方法を学ぶ方がはるかに優れています。必要に応じてさまざまな方法で変換し、より複雑な変換を自分で実行できるようにします。

これがお役に立てば幸いです。それはおそらくあなたが望んでいる即時の答えではないかもしれませんが、時間と労力をかけて独学する気があるなら (または教えられるなら、どこかでクラスを受講することにした場合 [結局のところ、独学は. ]) 行列や行列変換などの操作方法を学ぶと、自分が何をしようとしているのかをもう少し理解できるようになるでしょう。

編集: もちろん、グラフィックス変換が既に定義されていて、自分で心配する必要がない場合は、3D 空間の任意の軸に平行な任意の平面上でポイントを移動するのは非常に簡単です。基本的に、メモリ内では、ポイントは「通常のビル」、つまり 3 次元デカルト座標系に存在します (または存在する必要があります)。移動が発生している平面が平面 z = 0 であり、点の座標が (x, y, z) と同等の形式で格納されていると仮定すると、たとえば (x + 10, y, 0) または (x, y + 10, 0); 他の点よりも高い平面上にある点がある場合は、単純に z に高い値を設定します (低い面にある点がある場合は、z < 0 の値を設定します)。ポイント自体に動きを適用したら、まだ行っていない場合は、グラフィックス変換を環境に適用できます。これにより、出力デバイス (この場合は iPhone) で適切に表示されるように設定されます。変換の適用はそれよりも少し複雑ですが、それを行うための事前に作成されたメソッドがあれば、準備は完了です。

于 2009-07-27T18:58:30.517 に答える
4

Core Animationを使用している場合は、3D変換を正しく適用することでこれを簡単に実行できる可能性があります。次のようなコードを使用してCATransform3Dを作成します。

CATransform3D perspectiveRotation = CATransform3DMakeRotation(-40.0 * M_PI / 180.0, 0.0, 1.0, 0.0);
perspectiveRotation = CATransform3DRotate(perspectiveRotation, -55.0 * M_PI / 180.0, perspectiveRotation.m11, perspectiveRotation.m21, perspectiveRotation.m31);

次に、CALayer(またはUIViewのバッキングレイヤー)の適切なプロパティを使用してその変換を適用すると、レイヤーが3Dで傾斜します。そのレイヤー上のサブレイヤーの移動は、通常のデカルト座標空間で引き続き発生しますが、これらのサブレイヤーには等角投影の視点があります。

注意として、遠近効果が発生しないように、変換のm34コンポーネントを手動で調整する必要がある場合があります。

于 2009-07-28T13:00:12.773 に答える
1

等角変換を行う必要があります。つまり、元の座標から、何かが等角投影上のどこにあるかを示す変換が必要です。たとえば、等角図法は ((isox = x + (y / 2)), (isoy = y)) のようなものかもしれません (ただのくだらない例です)。この方程式から、「通常のビル」の x 座標と y 座標を取得し、そこから投影を計算できます。

于 2009-07-27T18:42:21.580 に答える