Transformácia - automatická zmena   otázka

C#, Grafika

Dobrý deň,

Pracujem na simulátore časticového systému, VS Ult 2010, XNA 4.

Mám vytvorené dve priestory, časticový(akoby world space) a screen space.Transformujem to touto funkciou(z časticového do screen):

public Vector2 Project(Vector2 position)
        {
            return position * Scale + new Vector2(GraphicsDevice.Viewport.Width / 2, GraphicsDevice.Viewport.Height / 2) - new Vector2(tex.Width / 2, tex.Height / 2) + DeltaPos;
        }

Prípadne môžem uviesť aj inverznú funkciu, ak by to pomohlo.

Všetko funguje, ale chcel som dodať funkciu automatickej zmeny transformačných koeficientov(Scale a DeltaPos) tak, aby boli vždy viditeľné všetky častice.Niekedy je otravné meniť tieto parametre manuálne.

Problém mám s nájdením správnych rovníc na zistenie týchto koeficientov.Skúšal som spočítať bounding rectangle, podielom odhadnúť Scale a transformovať stred bounding rectangle do screen space, ale nevyšlo to.Aktivovaním funkcie všetko zmizlo.

Vedel by mi niekto poradiť, ako správne implementovať tú funkciu ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Postup by měl být správně - udělat bounding box, DeltaPos bude střed toho boxu.

Aby se bounding box promítnul na celou obrazovku, potřebujete spočítat Scale. Ve skutečnosti může být poměr stran bounding boxu a obrazovky jiný, takže ho musíte počítat zvlášť pro X a Y a vzít to menší (menší v absolutní hodnotě ovšem).

A jak ho spočítat? Když máte rovnici ve funkci Project pro X, stačí z ní vyjádřit to scaleX:

screenPos.X = pos.X * scaleX + screen.Width / 2 + tex.Width / 2 + DeltaPos.X

scaleX = (screen.Width / 2 + tex.Width / 2 + DeltaPos.X - screenPos.X) / pos.X

Podobně spočítáte scaleY a vezmete to menší, aby se to celkem vešlo.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ďakujem za odpoveď, skúsil som to ešte raz, výsledok je taký, že častice sú roztrasené a teda zdvojené a ak na seba aj reagujú, tak do piatich sekund postupne vymiznú z obrazovky.

public void AutoView()
        {
            Vector2 scaleI = (new Vector2(GraphicsDevice.Viewport.Width / 2, GraphicsDevice.Viewport.Height / 2) + new Vector2(tex.Width / 2, tex.Height / 2) + DeltaPos - Project(Particles[0].Position)) / Particles[0].Position;
            Scale = MathHelper.Min(scaleI.X, scaleI.Y);
            Vector2 min = Particles[0].Position;
            Vector2 max = min;
            for (int x = 1; x < Particles.Count; x++)
            {
                min = Vector2.Min(min, Particles[x].Position);
                max = Vector2.Max(max, Particles[x].Position);
            }
            Vector2 centerP = Vector2.Lerp(min, max, 0.5f);
            Vector2 centerS = new Vector2(GraphicsDevice.Viewport.Width / 2, GraphicsDevice.Viewport.Height / 2);
            DeltaPos = centerS - centerP * Scale - centerS + new Vector2(tex.Width / 2, tex.Height / 2);
        }

Ak by ste si to chcel vyskúšať, dal som skompilovaný projekt na http://stanoweb.aspone.cz/ParticleSimula... . Častice sa pridávajú klikaním na plochu. A musel som odstrániť všetky výpisy na obrazovku, keďže ešte nemám nájdené vhodné písmo(z hľadiska autorských práv).

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback