2

私はpython-clutter 1.0を使用しています

挑戦という形での私の質問

キーを押すことで CairoTexture アクターにズームアップできるようにするコードを記述します。各段階で (cairo によって) アクターを再描画できるようにします。アクターのサイジング。

Inkscape のようなものと、ベクトルを拡大する方法を考えてみてください。どの倍率でもベクトルがきれいに保たれるか。パス (カイロline_toコマンドの束など) を CairoTexture アクターに配置し、同じトリックが発生するようにします。

もっと詳しく

アクターのグループを使用する小さな SVG エディターを目指しています。各アクターは、1 つのパスに専念しています。を使用して「ズーム」しSomeGroup.set_depth(z)、z を大きく/小さくします。これまでのところすべて順調です。ただし、アクターがカメラに近づくほど、新しい見た目のサイズに合わせてテクスチャが引き伸ばされます。

Clutter に両方を実行させる方法が見つからないようです。

  1. アクターの実際のサイズは静的のままにします (つまり、最初のサイズ)。
  2. その下にあるサーフェスを (ズームインして) 大きなものに交換し、パスを再描画できます (そして、カイロ マトリックスを使用してコンテキストのスケーリングを実行します)。

set_sizeまたはを使用すると、意図しないset_surface_sizeようにアクターが大きくなります。表面(基礎となるデータ)を大きくしたいだけです。

(これの用語がよくわかりません。おそらくミップマッピングですか?)

別の言い方をすると、ポリゴンが大きくなり、そのテクスチャ配列のサイズを増やして、より大きなポリゴンにマップできるようにします。

再作成した2 番目のサーフェス (pycairo を使用) をアクターの見かけのサイズget_transformed_size(set_from_rgb_dataアクターの寸法ではなく、表面のサイズです。

これに関する問題は、a) クラッターが新しいサイズを無視し、古い幅/高さにのみ描画されることと、b) RGBA と ARGB32 のようなものが色のメルトダウンを引き起こすことです。

私はどんな代替案にもオープンです。すべての木が欠けている森の中に立っていることを願っています!

\d

4

1 に答える 1

2

まあ、私のすべてのテストとハックにもかかわらず、それはずっと私の目の前にありました.

クラッター プロジェクト リストの Neil に感謝します。スクープは次のとおりです。

CT = SomeCairoTextureActor()

# record the old height, once:
old_width, old_height = CT.get_size()

Start a loop:
# Do stuff to the depth of CT (or it's parent)
...

# Get the apparent width and height (absolute size in pixels)
appr_w,appr_h = CT.get_transformed_size()

# Make the new surface to the new size
CT.set_surface_size( appr_w, appr_h )

# Crunch the actor back down to old size 
# but leave the texture surface something other!
CT.set_size(old_width, old_height)

loop back again

サーフェイスのサイズとアクターのサイズは同じである必要はありません。表面のサイズは、デフォルトではアクターの推奨サイズです。アクターにサイズを設定するだけで、優先サイズをオーバーライドできます。アクターのサイズがサーフェスのサイズと異なる場合、テクスチャはアクターのサイズに収まるように押しつぶされます (これが必要だと思います)。

この小さな謎を寝かせるのはいいことです。クラッターリストありがとう!

\d

于 2010-07-06T09:39:42.133 に答える