0

私は現在、フラッシュで小さな3Dパーティクルエンジンを構築しており、スプライトを使用しています。

各スプライトの位置を設定するには、以下のprojectVector関数を使用しています。(viewTransformマトリックスは、パースペクティブプロジェクションマトリックスと連結されたパーティクルワールドマトリックスです)

var projectedPoint:Vector3D = Utils3D.projectVector(viewTransform, point);
sprite.x = projectedPoint.x;
sprite.y =  projectedPoint.y;

これは非常にうまく機能し、スプライトを正確に配置する必要があります:D私が抱えている問題は、カメラからの距離に基づいて各パーティクルのスケールを計算する方法を理解しようとしていることです。

sprite.scaleX = sprite.scaleY = ??

透視投影行列を使用していなかった場合、通常は次のようにします。

var scaleRatio:Number = (focus * zoom)/(focus + particle.globalz);
particle.depth = scaleRatio;
sprite.x = particle.globalx * scaleRatio;
sprite.y = particle.globaly * scaleRatio;
// set scale..
sprite.scaleX = sprite.scaleY = scaleRatio;

エースとなる透視投影行列を使用して「scaleRatio」を計算する方法を教えてくれる人がいたら

ありがとう!

4

1 に答える 1

0

これを行うにはもっと簡潔な方法があると確信していますが、ポイントを投影する方法をすでに知っているので、次のようにすることができます。

var tl:Point = sprite.getRect(sprite.parent).topLeft;
var br:Point = sprite.getRect(sprite.parent).bottomRight;

var projectedTL:Point = Utils3D.projectVector(viewTransform, tl);
var projectedBR:Point = Utils3D.projectVector(viewTransform, br);

trace("projected width = "+(projectedBR.x - projectedTL.x));
trace("projected height = "+(projectedBR.y - projectedTL.y));
于 2011-05-31T23:55:08.620 に答える