43

Windows 8 JavaScript ゲームで使用するために、もともと Inkscape で作成された無料のクリップ アート SVG ファイルを持っています。次のように、周囲のグループにマトリックス変換が適用されたパスの多数のインスタンスが含まれています。

<g transform="matrix(0.443,0.896,-0.896,0.443,589.739,-373.223)">
    <path d="M486,313s27-9,43-29l26,4,1,23-22,5s-25-6-48-3z" />
</g>

アニメーション中のブラウザーの作業を減らすために、事前に Inkscape のパスに適用してその変換をフラットにしたいと考えています。ただし、6 つのマトリックス値を Inkscape の ABCDEF パラメータにプラグインして適用すると、IE10 エンジンとはまったく異なる回転とスケーリングがパスに与えられます。

6 つの値が正しくマッピングされていることを何度も確認しました。私は何を間違っていますか?

編集: OK、これは IE10 と Inkscape の前後のスクリーンショットです。IE10 の場合、SVG は空の HTML ドキュメントの本体内に直接存在します (レンダリングは Firefox でもまったく同じです)。Inkscape で、パス要素のみを含む「前の」SVG ファイルを開き、パスを選択し、6 つのマトリックス変換値をオブジェクト > 変換 > マトリックスにプラグインしました。私はマトリックスについてほとんど知りません。ブラウザーと同じ方法でこれらの変換を事前に適用できるようにしたいだけで、理想的には Inkscape に違いがある理由を理解したいのです。ありがとう。

IE10 パスのみ 変換を使用した IE10 パス Inkscape パスのみ 変換を使用した Inkscape パス

4

5 に答える 5

59

簡潔な答え

Inkscape で変換マトリックス パラメータを入力するときは、[現在のマトリックスを編集] がオンになっていることを確認してください。オブジェクトに新しい変換マトリックスを適用すると、実際にはこの新しいマトリックスにオブジェクトの既存の変換マトリックスが乗算されるためです。代わりに編集してください。
ここに画像の説明を入力

長い答え

自分ですべてを再計算する方法。

まず、変換行列を少し理解してみましょう。変換行列は、アフィン変換 (直線を保持する変換) をベクトルに適用するための迅速で賢いツールです。
したがって、ベクトル (たとえば、2 次元座標) と変換行列があり、2 つを乗算すると、変換行列で定義された変換が適用された、変換された座標が得られます。と の
変換行列
計算は次のように行われます。x'y'

x' = a*x + c*y + e 
y' = b*x + d*y + f

次に、svg 形式を少し理解する必要があります。w3c svg 仕様
によると、変換は正確にこれら 6 つのパラメーター (a、b、c、d、e、f) を引数として取ります。 したがって、あなたの例から、matrix

<g transform="matrix(0.443,0.896,-0.896,0.443,589.739,-373.223)">

次の変換行列パラメーターがあります。

a=0.443
b=0.896
c=-0.896
d=0.443
e=589.739
f=-373.223

ここで、次の例の座標がある場合: x=27, y=-9、次のように以前に定義された変換行列を使用して、それを変換できます。

x' = a*x + c*y + e 
x' = 0.443*27 + -0.896*-9 + 589.739
x' = 609.764

y' = b*x + d*y + f
y' = 0.896*27 + 0.443*-9 -373.223
y' = −353.018

いいですね。ここで詳細情報を入手できます

しかし、それだけではありません。また、svg パス データについても理解する必要があります。w3c svg path dspecification
によると、パス データ内の各文字は命令を表します。そして、命令に続く数字のペアのそれぞれは、座標値を表します。

あなたの例から、次のパスがあります。

<path d="M486,313s27-9,43-29l26,4,1,23-22,5s-25-6-48-3z" />

ここで、このパス オブジェクトは、1 つの絶対moveto命令 (大文字のM )、相対smooth curveto3 次ベジエ曲線 (小文字の s )、相対lineto命令 (小文字のl )、および別の相対smooth curveto3 次ベジエ曲線命令を使用し、その後にclosepath命令 (小文字のz )を使用していることがわかります。 .

M486,313x=486, y=313 は絶対移動に変換され
s27-9,43-29ます。負の数が負の場合は必要ないため、一部のコンマが省略されているため、読み取りが少し複雑です。マイナス記号はコンマとして機能します-とにかく、変換します相対的に滑らかなベジエ曲線に x=27、y=-9、x=43、y=-29 ( 1 つの目的点と 1 つの制御点) など

では、svg グループから変換行列を適用および削除するにはどうすればよいでしょうか。そのようです:

// we read the transformation matrix params
// <g transform="matrix(0.443,0.896,-0.896,0.443,589.739,-373.223)">
a=0.443
b=0.896
c=-0.896
d=0.443
e=589.739
f=-373.223

// we read the path data, and transform each instruction    
// <path d="M486,313s27-9,43-29l26,4,1,23-22,5s-25-6-48-3z" />

M486,313絶対移動

x' = a*x + c*y + e = a*486 + c*313 + e = 524.589
y' = b*x + d*y + f = b*486 + d*313 + f = 200.892

Move to 命令はM524.589,200.892になりました

S27-9,43-29 - 曲線を滑らかにします。各座標に対して同じプロセスを繰り返しますが、eand f(変換パラメータ) を 0 に設定します。これは絶対命令ではなく相対命令であるためです。
現在は
s20.025,20.205,45.033,25.680999999999997 です。

l26,4,1,23-22,5

l7.934000000000001,25.067999999999998,-20.165,11.085,-14.226,-17.497 になります。

s-25-6-48-3

s-5.698999999999999,-25.058000000000003,-18.576,-44.337 になります。

そしてzはzのまま

したがって、結果の変換されたパスは次のようになります。

<path d="M524.589,200.892s20.025,20.205,45.033,25.680999999999997l7.934000000000001,25.067999999999998,-20.165,11.085,-14.226,-17.497s-5.698999999999999,-25.058000000000003,-18.576,-44.337z" />

これがあなたにとって理にかなっていることを願っています。

于 2013-02-27T13:50:21.783 に答える
21

貼り付けは次のことに役立ちます。

  1. Inkscape でグループをダブルクリックして入力します。
  2. Ctrl+A を押してグループのすべてのコンテンツを選択し、Ctrl+C でコピーします。
  3. グループの外をダブルクリックして、グループから抜けます。
  4. Edit > Paste In Place (Ctrl+Alt+V) – この時点で、貼り付けたオブジェクトにグループ変換が適用されます。
  5. オブジェクトを再度グループ化 (Ctrl+G)
  6. 新しいグループを元のグループと同じ深さに移動し、元のグループを削除します。(これはおそらく、XML エディターの Ctrl+Shift+X を使用すると簡単です。)
于 2014-03-25T08:41:02.103 に答える
21

パスを選択し、パス -> ユニオン (CTRL++) を使用して座標をベイクできます。お役に立てれば

于 2014-03-05T17:35:22.803 に答える
14

@andraaspar の回答に従って、グループ化を解除 (Ctrl-U) し、再度グループ化 (Ctrl-G) を試すこともできます。それは私のために働いた。

于 2015-05-11T20:37:52.020 に答える
1

すべての情報を提供してくれた ArtBIT に感謝します。PHPアプリでこれについていくつかの問題があり、(SVGファイルからの)フォントデータを操作し、あらゆる種類の変換を行うライブラリを作成しました。興味のある方は GitHub から試してみてください:

https://github.com/kartsims/easysvg

使用例:

require 'easySVG.php';
$svg = new EasySVG();
$svg->setFont("paris-bold-webfont.svg", 100, "#000000");
$svg->addText("Simple text display");
$svg->addAttribute("width", "800px");
$svg->addAttribute("height", "100px");
echo $svg->asXML();

SVG データ操作例:

$def = 'YOUR SVG DEFINITION HERE';
$easySVG = new EasySVG();
// rotate by 40°
$rotated_def = $easySVG->defRotate($def, 40)
// rotate by 40° with center at (200,100)
$rotated_def2 = $easySVG->defRotate($def, 40, 200, 100)
// scale transform : width*4
$scaled_def = $easySVG->defScale($def, 4)
于 2014-04-21T13:13:38.927 に答える