Closed SpriteStudio closed 10 years ago
RGBA 値はもちろんなのですが、強度も補間計算後の値を0.0f~1.0f の間でクランプしています。 既に対応済みかもしれませんが念のためお知らせまで。
対応致しました。 ・頂点変形の各頂点相対座標の補間 ・カラーブレンドの各頂点色とピクセルα係数(強度)の補間 が対象となっています。
コミット: 6970df8f59c23bcc66aa796d40130083b96d2bd0 [6970df8]
Ver.5.0~5.2を使用している方へのサポートが必要になる場合があるかもしれないのと、今後のことも考え、念のため「LibraryEditor_SpriteStudio.cs」内の該当箇所に「#if false~#else~#endif」で、5.0~5.2互換の計算式も残してあります。
また、計算的に 「まず0~1までの範囲で値を補間する。」 の部分が、こちらの実装では 「指定区間内の指定フレーム位置を0~1区間で補間して、再度フレーム値に直す」 #正規化区間比率値で補間するのではなく、指定補間曲線で「開始値を開始フレーム値」「終了値を終了フレーム値」として「補間後の正規化区間比率位置に該当するフレーム位置」に変換しています。
……という計算になっているため、かなり厳密に見ると一度フレーム位置に直した際に(intへのキャストで)小数部が切られてしまうので、若干計算誤差が出るかもしれません。 ただ、結局フレーム数倍してから、小数点以下が切られているのと・再度その値を開始フレームと終了フレーム間の正規区間値に直して直線補間をかける形になるので……切り捨てられる値の精度的に、実用上問題ない程度の計算誤差程度に収まるかと思われます(恐らく、フレーム位置を再度0~1の正規化区間位置に直した時に、誤差が最大に近い場合でも誤差は小数点第2位か3位以下の位置に現れる程度な気がします)。
追記: ふと思ったのですが……エルミートやベジェ・加速などの補間式を、ごくごく短いフレーム数(区間が1~3フレーム程度?)で極端な変化をさせるように指定したりした場合に、数値的にある程度の誤差が出る可能性があるかもしれません。 (ただ、そのような短い区間で極端な変化曲線を使用した場合、元々の動き自体が連続性を保てない可能性があるかと……)
ご対応ありがとうございます。 また互換性の配慮の方もいただき助かります!
誤差については仰る通りほとんど問題ないと思います。 視認できないレベルではないかと。
で、検証結果をお知らせします! まず専用のテストデータをSVN の Testcase/curved_colorblend_and_vertex の方にUPしておきましたので こちらをSSで開いてみてください。
見たところCurvedColorAndVertex.ssae -> curved_color_blend の Hermite パーツの補間値が、 0~1 の範囲外になった際の色がクランプされていない風な色味に変化します。
カラーブレンドをカーブエディタで開いた時に、補間値がY軸の最大・最小値を超えた辺りのフレーム、 2~7と11~18辺りの区間で発生しとります。
もう1つ、頂点変形の補間のされ方が一様に線形補間になっているようです。 上記 .ssae の curved_vertex_deform アニメに切り替えるとHermite,Bezier パーツも Linearパーツと同じ動きになっていると思います。
また、このアニメーション切り替えの際にパーツが真っ白になる現象が発覚しまして… 現在修正確認のみのフェーズではありますが、対応の難度と関連箇所の情報をいただけますと助かります。
了解致しました。 恐らくこちらでのコーディングかロジックの記載ミスかと思われます。 原因を調査・修正致します。
あと、パーツが真っ白になる現象は……恐らくマテリアルかテクスチャの情報をロストしている可能性がありますので、そちらも調査してみます。
(原因判明後の)追記: この見当は、まるっきりはずれでした。申し訳ありません。
一応パーツが真っ白になる件については調査ができましたのと、対応が終わりました。 原因としては、プレーヤー側の処理のミスで、 一つのssae内に「カラーブレンドを使用しているアニメ」と「カラーブレンドを使用していないアニメ」が混在していた際に、「カラーブレンドを使用していないデータ」を再生した時 「(元のssae内の単一アニメでカラーブレンドを使用していなくても、変換時にタイムラインをつなげてssae内の全アニメを1つのタイムラインに配置しているため、カラーブレンドのアニメーションデータが存在しているので)そこで設定されているカラーブレンドのパラメータをそのまま設定している」 結果 「カラーブレンド未使用時のデフォルト値」がそのまま設定され ・ブレンド: MIX ・ブレンド色: RGBA = 1,1,1,1 ・ピクセル強度 = 1 の状態で強制的にかかってしまうため、白い四角になっておりました。
ですので、カラーブレンドを適用する際に、「カラーブレンドの適用範囲(Bound)がNON以外であるか?」という条件を挟んで、 ・NON以外は通常通りカラーブレンドを行う ・NONの場合、カラーブレンドのアニメデータがない時と同じ処理を行う 形に致しました。
ですので、結果として 対応難度: イージーバグ 関連個所: Library_SpriteStudio.cs: 768行目以降(AnimationDataSprite::UpdateMesh関数内処理)の1箇所 となりました。
このアップデートは、上記補間のコミットと同時に行います。
・頂点変形とカラーブレンドの修正 ・アニメーションの変更で白い四角が出てしまう 状態を修正しました。
コミット: 9e6e6dbcf6e14ef42cdc6dc646a154757017bfae [9e6e6db]
補間計算については、フレーム位置での補間ではなく、正規化区間での補間に置き換えました。 #昨日は(も?)クラクラしていたので気が回らなかったのですが、そちらの方が間に余分な処理が入らないので、クランピングも含めてかえって楽なことに気が付きました(ですので、テンプレートを経由せずに、直接直線補間関数の実体を叩くように処理を変えました)。
当該データをSSの最新版と目視で比較してみて、一応同じ動きになっていると思います(が、またバグっていたら申し訳ありません)。 一応こちらでも他のデータでも調査してみます。
また、上記の白い四角の件を修正した位置については、Library_SpriteStudio.csの770行目の「#if false (バグっている状態の処理) #else (今回修正した処理) #endif」になります。
追伸: 白い四角の件は「カラーブレンドの再生データがない」場合と「カラーブレンドを行わない設定のカラーブレンド再生データがある(Brend==NONの時)」場合とで、同じ処理をコピーしておりますが、本来はもっと綺麗に・ロジカルにした方が良いと思われるものの、現在のタイミングからパワーコードで処置した形になっております。 その点ご理解とご容赦をお願い致します。
ご対応及び詳細な説明をいただきありがとうございます! 諸々了解しました。 そしてカラーブレンドのクランプ及びアニメ切り替え時の真っ白になる2点の修正を確認しました。
が!1点だけすみません、バグというか仕様通知漏れになりますが、、 頂点変形のウェイト式補間においては、最初の補間結果をクランプしない仕様(Ver.4から)になっているのでした。
// まず0~1までの範囲で値を補間する。 float rate = SsInterpolate(補間タイプ, 遷移率, 補間パラメータ(エルミート・ベジェにおける傾斜など));
この rate を0-1 内でクランプはせずに、そのまま始点キー、終点キーの間のブレンド率として キーが持つ各頂点のオフセット値を線形補間しています。
結果として、curved_vertex_deform のHermite では先頭の頂点変形キーの各頂点のオフセット値は すべて0なのですが、3フレーム辺りでは+-7前後の値になり見た目が膨らみ、 17フレーム辺りでは縮む様な動作になります。
という仕様になっておりまして、度々お手数ですが修正のほうよろしくお願いしますー
頂点変形部について、0.0~1.0のクランピングを外しました。
コミット: 8c5307089aa0ff24478c97cddc75ea04121e3b13 [8c53070]
ご検証下さいです。
ご対応ありがとうございます! 確認しました、問題ございません。
すみません、こちら大事なことを忘れていました。 最新のSS5では頂点変形およびカラーブレンドの補完計算方法が代わり、Ver.4互換になっています。 具体的には、5.2 以前は、頂点変形の各X/Yオフセット値をキーフレームの始点・終点間で任意の補間方法で”直接”、補間していましたが、これが始点から終点に向けての”遷移率”(0.0f ~1.0f)を指定した補間アルゴリズム(線形・ベジェ・その他)で導出した後に、その値で各頂点の実際のオフセット値を始点での値から終点での値に向けて線形補間で求めています。
以下の様になっています。
// まず0~1までの範囲で値を補間する。 float rate = SsInterpolate(補間タイプ, 遷移率, 補間パラメータ(エルミート・ベジェにおける傾斜など));
// その値を始点キーの値と終点キーの値のブレンド率として線形補間する for (int i = 0; i < 4; ++i) { SsInterpolate(SsInterpolationType::linear, rate, startValue.offsets[i], endValue.offsets[i], &out->offsets[i]); }
ツール上だけでは見えにくい挙動ですがこの様になっています。
先に回答です。
はい、だけです。 カラーブレンドは、RGBAの各値および強度、つまり全パラメータが仰るウェイト式の補間形式になります。