XNA - Rotace pohybujicího se oběktu – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

XNA - Rotace pohybujicího se oběktu – .NET – Fórum – Programujte.comXNA - Rotace pohybujicího se oběktu – .NET – Fórum – Programujte.com

 

Belze
~ Anonymní uživatel
23 příspěvků
23. 2. 2013   #1
-
0
-

Zdravím narazil jsem na problém se kterým si už vážně nevím rady. 

Mám oběkt, jeho velikost a pozici si pamatuji v proměnné Rectangle. Oběkt se pohybuje ve směru float X, float Y, a zároveň ho chci rotovat v jeho středu (Vector2 Midopoint) . Problém je že oběkt se během rotace pouze netočí, ale obíhá kolem bodu 

 

    public Texture2D texture;
    float rotation;
    float circle = MathHelper.Pi* 2;
    float smerX;
    float smerY;
    public Rectangle SizeAndPos;
       
      public Meteority(Texture2D texture, Vector2 position, float smerX, float smerY, Rectangle Size, int health)
        {
            this.texture = texture;
            this.SizeAndPos = new Rectangle((int)position.X,(int)position.Y, Size.Width, Size.Height);
            this.smerX = smerX;
            this.smerY = smerY;
            rotation = rand.Next(0, 360);
         }  

 public void update(GameTime gametime, List<Meteority> meteory, Meteority thisMeteor)
        {
            SizeAndPos.X += Convert.ToInt32(gametime.ElapsedGameTime.Milliseconds * smerX);
            SizeAndPos.Y += Convert.ToInt32(gametime.ElapsedGameTime.Milliseconds * smerY);

            rotation += gametime.ElapsedGameTime.Milliseconds / 8000.0f;
            rotation = rotation % circle;

     //       Midpoint = Vector2.Transform(new Vector2(SizeAndPos.X,SizeAndPos.Y), Matrix.CreateRotationZ(rotation));
       //   SizeAndPos = Vector2.Transform( SizeAndPos, Matrix.CreateRotationZ(-0.1f))

        //   Midpoint = new Vector2(SizeAndPos.Width / 2 , SizeAndPos.Height / 2);
        
            if ((SizeAndPos.X <= -100)||(health <=0))
                meteory.Remove(thisMeteor);
        }

 public void draw(SpriteBatch spriteBatch)
        {
          //  spriteBatch.Draw(texture, SizeAndPos, Color.White);
              spriteBatch.Draw(texture, SizeAndPos, null, Color.White, rotation,Midpoint, SpriteEffects.None, 0f);
      }

Potřebuji aby se oběkt rotoval ale zůstal na stejném místě, kód který mám nyní funguje ale oběkt obíhá kolem bodu a znemožňuje mi další práci, protože nemění hodnoty v proměnné SizeAndPos.

Díky za pomoc doufám že jsem to vysvětlil srozumitelně.

Nahlásit jako SPAM
IP: 90.180.234.–
ingiraxo+15
Grafoman
23. 2. 2013   #2
-
0
-

když chceš otočit objekt podle jeho středu, tak stačí nastavit origin na střed toho objektu.. to je šířkaTextůry / 2 a výška to samí 

sprite.Draw(texture, position, null, Color.White, rotateAngle, origin, ...);
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Belze
~ Anonymní uživatel
23 příspěvků
23. 2. 2013   #3
-
0
-

To jsem prave zkousel viz. odpoznamkovyn kod a nefunguje to vypda to jako kdyz se obekt otaci kolem originu 0,0 (Ano kontroloval jsem hodnoty originu a jsou nastaveny na 25,25 coz je stred me textury)

Nahlásit jako SPAM
IP: 90.180.234.–
ingiraxo+15
Grafoman
23. 2. 2013   #4
-
0
-

tak v tom případě máš chybu jinde a né v rotaci.. zkus jen vykreslit texturu (bez pohybu) a jen ji otacej na místě podle středu textůry

a ta tvoje proměnná "SizeAndPos" je dost chaotická.. zkus použít jen Vector2 pro pozici textury a né takto celý rect, to může být možná ta chyba, protože rotace se dělá takto, jen přes sprite.Draw(..)

viz. třeba zde, nehledat v tom nic složitýho http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series2D/Rotation.php

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Belze
~ Anonymní uživatel
23 příspěvků
23. 2. 2013   #5
-
0
-

Aha uz jsem nasel chybu, diky za ten tutorial pomohl origin musi byt bod u originalni velikost obrazku, tzn kdyz obrazek o velikosti 50,50 pixelu vykresluju jako 100x100 tak jeho origin neni 50,50 jak by se zdalo ale 25,25

   spriteBatch.Draw(texture, new Rectangle((int)position.X, (int)position.Y, Size.Width, Size.Height), null, Color.White, rotation, new Vector2(25, 25), SpriteEffects.None, 0f);
       
Nahlásit jako SPAM
IP: 90.180.234.–
ingiraxo+15
Grafoman
23. 2. 2013   #6
-
0
-

#5 Belze
jj, origin se uvádí od pozice obrázku, né od bodu 0,0 ;) Pokud to teda máš, tak téma označ za vyřešený

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
belze0
Duch
24. 2. 2013   #7
-
0
-

Rad bych tema oznacil jako vyresene jen nemuzu najit kde, mozna to bude tim ze jsem nebyl prihlasen pri zakladani topicu, porosil bych moderatora aby tema oznacil jako vyresene diky.

Nahlásit jako SPAM
IP: 90.180.234.–
Belze
~ Anonymní uživatel
23 příspěvků
24. 2. 2013   #8
-
0
-

Tak omyl kod nefungoval uplne presne potreboval jeste malou upravu cely funkcni kod je tady, snad nekomu pomuze

        public Texture2D texture;
        float rotation;
	float smerX;
        float smerY;
        public Rectangle Size;        
   	Vector2 position;
        float rotationAngle;


public void update(GameTime gametime, List<Meteority> meteory, Meteority thisMeteor)
        {

         position.X += Convert.ToInt32(gametime.ElapsedGameTime.Milliseconds * smerX); //Pohyb po Ose X
         position.Y += Convert.ToInt32(gametime.ElapsedGameTime.Milliseconds * smerY); //Pohyb po Ose X

         rotationAngle =  gametime.ElapsedGameTime.Milliseconds / 50.0f; //Vypocet  uhlu rotace
         rotation += MathHelper.ToRadians(rotationAngle); // prepocet uhlu rotace na radiany

          }

        public void draw(SpriteBatch spriteBatch)
        {
             spriteBatch.Draw(texture, new Rectangle((int)position.X + (int)Rotate(rotation, 0, new Vector2(Size.Width / 2, Size.Height / 2)).X // Meteor vykresluji pomoci Rectangle ne Vector2 pozici kde obekt chceme vykrelit musime nastavit podle toho jak mame obekt natoceny
                                                   , (int)position.Y + (int)Rotate(rotation, 0, new Vector2(Size.Width / 2, Size.Height / 2)).Y // Stejne jako souradnice X musime pozici kde obekt chceme vykrelit nastavit podle toho jak mame obekt natoceny
                                                   , Size.Width, Size.Height), // Sirka vyska textury
                                                   null, Color.White, rotation, // .., .., aktualni rotace v radianech
                                                   new Vector2(25, 25), // origin , brany z puvodni velikosti obrazku tzn. Obrazek 50x50 ma origin 25,25 
                                                   SpriteEffects.None, 0f);  
                 }
        }

        private Vector2 Rotate(float angle, float distance, Vector2 centre)
        {
            return new Vector2((float)(distance * Math.Cos(angle)), (float)(distance * Math.Sin(angle))) + centre;
        }
Nahlásit jako SPAM
IP: 90.180.234.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 8 hostů

Podobná vlákna

Seznam obektu tridy — založil cecil

Rotace 3D objektu — založil SoLi

Otočení- rotace — založil Klobma

PS rotace pohledu — založil Baldur

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý