MFF

    Minecraft Forge France
    • Récent
    • Mots-clés
    • Populaire
    • Utilisateurs
    • Groupes
    • Forge Events
      • Automatique
      • Foncé
      • Clair
    • S'inscrire
    • Se connecter

    GLUtils animation seulement d'une partie de l'objet 3d

    Planifier Épinglé Verrouillé Déplacé Sans suite
    14 Messages 5 Publieurs 4.1k Vues 2 Watching
    Charger plus de messages
    • Du plus ancien au plus récent
    • Du plus récent au plus ancien
    • Les plus votés
    Répondre
    • Répondre à l'aide d'un nouveau sujet
    Se connecter pour répondre
    Ce sujet a été supprimé. Seuls les utilisateurs avec les droits d'administration peuvent le voir.
    • garganG Hors-ligne
      gargan
      dernière édition par

      J’ai changé un peu mon code mais j’ai une erreur: Ticking block entity
      Mon bloc:

      package fr.lefgolas.TurretsMod;
      
      import net.minecraft.block.Block;
      import net.minecraft.block.material.Material;
      import net.minecraft.client.Minecraft;
      import net.minecraft.creativetab.CreativeTabs;
      import net.minecraft.entity.EntityLivingBase;
      import net.minecraft.entity.player.EntityPlayer;
      import net.minecraft.item.ItemStack;
      import net.minecraft.server.MinecraftServer;
      import net.minecraft.tileentity.TileEntity;
      import net.minecraft.util.ChatComponentTranslation;
      import net.minecraft.world.World;
      import fr.lefgolas.TurretsMod.client.TileEntitySentry;
      
      public class BlockSentry extends Block {
      
      protected BlockSentry(Material material) {
      super(material);
      this.setCreativeTab(CreativeTabs.tabBlock);
      }
      
      @Override
      public void onBlockPlacedBy(World world, int x, int y, int z,
      EntityLivingBase living, ItemStack stack) {
      EntityPlayer player = (EntityPlayer) living;
      if(!world.isRemote)
             {
                 TileEntity tile = world.getTileEntity(x, y, z);
                 if(tile instanceof TileEntitySentry)
                 {
                  TileEntitySentry tileSentry = (TileEntitySentry)tile;
                     tileSentry.setUsername(player.getDisplayName());
                 }
             }
         }
      
      public boolean isOpaqueCube() {
      return false;
      }
      
      public boolean renderAsNormalBlock() {
      return false;
      }
      
      public int getRenderType() {
      return -1;
      }
      
      @Override
      public boolean hasTileEntity(int metadata) {
      return true; // signale que le bloc a une entité
      }
      
      @Override
      public TileEntity createTileEntity(World world, int metadata) {
      return new TileEntitySentry(); // indique quelle est l'entité de bloc
      }
      
      }
      
      

      Mon tileEntity

      package fr.lefgolas.TurretsMod.client;
      
      import java.util.List;
      
      import net.minecraft.client.Minecraft;
      import net.minecraft.entity.Entity;
      import net.minecraft.entity.player.EntityPlayer;
      import net.minecraft.nbt.NBTTagCompound;
      import net.minecraft.tileentity.TileEntity;
      import net.minecraft.world.World;
      
      public class TileEntitySentry extends TileEntity {
      protected String username;
      
      public TileEntitySentry() {
      
      }
      
      @Override
      public void readFromNBT(NBTTagCompound compound) {
      super.readFromNBT(compound);
      this.username = compound.getString("Player");
      }
      
      @Override
      public void writeToNBT(NBTTagCompound compound) {
      super.writeToNBT(compound);
      compound.setString("Player", this.username);
      }
      
      public void setUsername(String playerPseudo) {
      this.username = playerPseudo;
      }
      
      @Override
      public void updateEntity() {
                     super.updateEntity();
      List <entity>entities = this.worldObj.getEntitiesWithinAABBExcludingEntity(this.worldObj.getPlayerEntityByName(username), this.getRenderBoundingBox().expand(20.0D, 20.0D, 20.0D));
      }
      
      }
      
      

      Une 2ème question: comment faire pour “redemander” un rendu afin de l’animer et de tourner la partie haute selon les coordonnées des entitées récupérées dans updateEntity? Est-ce que je dois utiliser les events?</entity>

      1 réponse Dernière réponse Répondre Citer 0
      • jglrxavpokJ Hors-ligne
        jglrxavpok Modérateurs
        dernière édition par

        Sans glRotated dans ton rendu, c’est sûr que ça va pas tourner…
        Passe par les events de GLUtils pour faire tourner les différentes parties du modèle.

        Ensuite donne nous toute l’exception même si je pense que cela vient du fait que [font=Monaco, Consolas, Courier, monospacethis.worldObj ]soit null

        Modérateur sur MFF. 
        Mon Github: http://github.com/jglrxavpok
        Mon compte Steam si vous voulez jouer à CS:GO ou TF2 avec moi: https://steamcommunity.com/id/jglrxavpok/

        1 réponse Dernière réponse Répondre Citer 0
        • Superloup10S Hors-ligne
          Superloup10 Modérateurs
          dernière édition par

          Ce serait bien d’utiliser les balises java pour le code Java.

          Si vous souhaitez me faire un don, il vous suffit de cliquer sur le bouton situé en dessous.

          Je suis un membre apprécié et joueur, j'ai déjà obtenu 17 points de réputation.

          1 réponse Dernière réponse Répondre Citer 0
          • garganG Hors-ligne
            gargan
            dernière édition par

            Oui c’est ça j’ai corrigé mais je comprends pas trop la logique du truc: worldobj alterne entre null et pas null vous savez pourquoi? 
            Ok donc pour l’animation j’ai tenté ça:
            Mon tileEntity

            ​package fr.lefgolas.TurretsMod;
            
            import java.util.Iterator;
            import java.util.List;
            
            import fr.lefgolas.TurretsMod.client.TileEntitySentryObjRenderer;
            import net.minecraft.command.IEntitySelector;
            import net.minecraft.entity.Entity;
            import net.minecraft.entity.EntityLivingBase;
            import net.minecraft.entity.passive.EntityChicken;
            import net.minecraft.entity.passive.EntityCow;
            import net.minecraft.entity.passive.EntityPig;
            import net.minecraft.nbt.NBTTagCompound;
            import net.minecraft.tileentity.TileEntity;
            
            public class TileEntitySentry extends TileEntity {
            protected String username;
            protected IEntitySelector iEntitySelector;
            
            public TileEntitySentry() {
            this.iEntitySelector = new IEntitySelector()
                    {
            @Override
            public boolean isEntityApplicable(Entity entity) {
                            return entity instanceof EntityLivingBase;
            
            }
                    };
            }
            
            @Override
            public void readFromNBT(NBTTagCompound compound) {
            super.readFromNBT(compound);
            this.username = compound.getString("Player");
            }
            
            @Override
            public void writeToNBT(NBTTagCompound compound) {
            super.writeToNBT(compound);
            compound.setString("Player", this.username);
            }
            
            public void setUsername(String playerPseudo) {
            this.username = playerPseudo;
            }
            
            public String getUsername(){
            return this.username;
            }
            
            @Override
            public void updateEntity(){
            if(this.worldObj != null && username != null){
            List listEntity = this.worldObj.getEntitiesWithinAABBExcludingEntity(this.worldObj.getPlayerEntityByName(username), this.getRenderBoundingBox().expand(20D, 20D, 20D), iEntitySelector);
            if(!listEntity.isEmpty()){
            EntityLivingBase entity = (EntityLivingBase) listEntity.get(0);
            TileEntitySentryObjRenderer.px = entity.posX;
            TileEntitySentryObjRenderer.py = entity.posY;
            TileEntitySentryObjRenderer.pz = entity.posZ;
            TileEntitySentryObjRenderer.hasEntityTarget = true;
            }
            }
            }
            
            }
            

            Mon tileentityrenderer

            ​package fr.lefgolas.TurretsMod.client;
            
            import java.util.List;
            
            import javax.vecmath.Vector3d;
            
            import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
            import net.minecraft.entity.Entity;
            import net.minecraft.tileentity.TileEntity;
            
            import org.jglrxavpok.glutils.TessellatorModel;
            import org.lwjgl.opengl.GL11;
            
            import fr.lefgolas.TurretsMod.TileEntitySentry;
            import fr.lefgolas.TurretsMod.TurretsMod;
            
            public class TileEntitySentryObjRenderer extends TileEntitySpecialRenderer {
            public static double px;
            public static double py;
            public static double pz;
            private double axeX, axeY, axeZ;
            private TessellatorModel modelHaut;
            private TessellatorModel modelBas;
            public static boolean hasEntityTarget;
            public TileEntitySentryObjRenderer() {
            hasEntityTarget = false;
            axeX = 0.0D;
            axeY = 0.0D;
            axeZ = 0.0D;
            modelHaut = new TessellatorModel("/assets/" + TurretsMod.MODID + "/models/HautTurret.obj");
            modelHaut.setID("sentryHaut");
            modelHaut.regenerateNormals();
            modelBas = new TessellatorModel("/assets/" + TurretsMod.MODID + "/models/BasTurret.obj");
            modelBas.setID("sentryBas");
            modelBas.regenerateNormals();
            TessellatorModel.MODEL_RENDERING_BUS.register(this);
            }
            
            @Override
            public void renderTileEntityAt(TileEntity tileentity, double x, double y,
            double z, float partialTick) {
            GL11.glPushMatrix();
            GL11.glTranslated(x + 0.5, y, z + 0.5);
            modelBas.render();
            double sentryAngleX = 0.0D;
            double sentryAngleY = 0.0D;
            double sentryAngleZ = 0.0D;
            
            if(hasEntityTarget){
            if(x != px){
            axeX = 1.0D;
            sentryAngleX = px-x;
            }
            if(y != py){
            axeY = 1.0D;
            sentryAngleY = py - y;
            }
            if(z != pz){
            axeZ = 1.0D;
            sentryAngleZ = pz - z; 
            } 
            GL11.glRotated(sentryAngleX, axeX, 0.0D, 0.0D);
            GL11.glRotated(sentryAngleY, 0.0D, axeY, 0.0D);
            axeX = 0.0D;
            axeY = 0.0D;
            axeZ = 0.0D;
            }
            
            modelHaut.render();
            GL11.glPopMatrix();
            }
            
            }
            

            Mais je n’ai pas trop les résultats escomptés…
            Sans animation:

            Avec animation:
            ___Voici le modele:  https://dl.dropboxusercontent.com/u/46928438/modele.zip___Après quelques test seul la rotation autour de l’axe Y est correcte (même si l’angle lui ne l’est pas)
            Je ne vois pas comment trouver l’angle 😞

            Et je n’arrive pas à la faire pivoter vers le haut ou vers le bas!
            Mes talents de graphisme sont limités… 😉

            1 réponse Dernière réponse Répondre Citer 0
            • garganG Hors-ligne
              gargan
              dernière édition par

              Y a t-il un moyen de visualiser le point de rotation?
              Et comment calculer l’angle 😞 ?

              1 réponse Dernière réponse Répondre Citer 0
              • DeletedD Hors-ligne
                Deleted
                dernière édition par

                @‘gargan’:

                Y a t-il un moyen de visualiser le point de rotation?
                Et comment calculer l’angle 😞 ?

                Pareil je recherche aussi comment placer un point de rotation perso j’ai vu que la méthode :

                ​%(#555555)[[size=xx-small]GL11.glTranslated(x, y, z); et GL11.glTranslated(-x, -y, -z)]
                

                Mais pour moi elle permet plus de bouger l’objet en lui même ou plus la shape concernée non le point de rotation.
                Par exemple si je souhaite balancer  la jambe d’un de mes modele 3d je vais devoir placer un point de rotation qui serait en haut de la jambe ? Je peux faire ça ave c cette méthode mais y à pas un autre moyen d’y parvenir ? Je pense que ça en interesserai plus d’un ou plus de deux  :rolleyes:

                Par exemple dans techne y’a la petite boule bleue qui est le point de rotation on peut bouger l’objet sans le point de rotation mais avec un modele 3d on peut pas voir où est le point de rotation ?

                1 réponse Dernière réponse Répondre Citer 0
                • jglrxavpokJ Hors-ligne
                  jglrxavpok Modérateurs
                  dernière édition par

                  “La boule bleue” de Techne fait à peu près la même chose:

                  GL11.glTranslated(x, y, z); et GL11.glTranslated(-x, -y, -z)
                  

                  Modérateur sur MFF. 
                  Mon Github: http://github.com/jglrxavpok
                  Mon compte Steam si vous voulez jouer à CS:GO ou TF2 avec moi: https://steamcommunity.com/id/jglrxavpok/

                  1 réponse Dernière réponse Répondre Citer 0
                  • Bowser338B Hors-ligne
                    Bowser338
                    dernière édition par

                    ce qu’il veut a mon avis et j’ai pas encore trouvé perso c’est de bouger le point de rotation sans bouger le shape

                    Tout probleme a sa solution, s'il n'y a pas de solution c'est qu'il n'y a pas de problemes

                    1 réponse Dernière réponse Répondre Citer 0
                    • DeletedD Hors-ligne
                      Deleted
                      dernière édition par

                      @‘Bowser338’:

                      ce qu’il veut a mon avis et j’ai pas encore trouvé perso c’est de bouger le point de rotation sans bouger le shape

                      Oui c’est exactement ça  😄

                      1 réponse Dernière réponse Répondre Citer 0
                      • garganG Hors-ligne
                        gargan
                        dernière édition par

                        Pour la rotation sur l’axe Y déjà je croyais avoir trouver la solution mais ça ne marche pas!
                        Je créais un vecteur de base (0;5;0)
                        Je creais un vecteur tourelle/entité
                        Je calculais l’angle entre les supports des 2 vecteurs

                        Mais sa ne marche pas…

                        La classe du tileEntity

                        ​package fr.lefgolas.TurretsMod;
                        
                        import java.util.Iterator;
                        import java.util.List;
                        
                        import fr.lefgolas.TurretsMod.client.TileEntitySentryObjRenderer;
                        import net.minecraft.command.IEntitySelector;
                        import net.minecraft.entity.Entity;
                        import net.minecraft.entity.EntityLivingBase;
                        import net.minecraft.entity.passive.EntityChicken;
                        import net.minecraft.entity.passive.EntityCow;
                        import net.minecraft.entity.passive.EntityPig;
                        import net.minecraft.nbt.NBTTagCompound;
                        import net.minecraft.tileentity.TileEntity;
                        
                        public class TileEntitySentry extends TileEntity {
                        protected String username;
                        protected IEntitySelector iEntitySelector;
                        
                        public TileEntitySentry() {
                        this.iEntitySelector = new IEntitySelector()
                                {
                        @Override
                        public boolean isEntityApplicable(Entity entity) {
                                        return entity instanceof EntityLivingBase;
                        
                        }
                                };
                        }
                        
                        @Override
                        public void readFromNBT(NBTTagCompound compound) {
                        super.readFromNBT(compound);
                        this.username = compound.getString("Player");
                        }
                        
                        @Override
                        public void writeToNBT(NBTTagCompound compound) {
                        super.writeToNBT(compound);
                        compound.setString("Player", this.username);
                        }
                        
                        public void setUsername(String playerPseudo) {
                        this.username = playerPseudo;
                        }
                        
                        public String getUsername(){
                        return this.username;
                        }
                        
                        @Override
                        public void updateEntity(){
                        if(this.worldObj != null && username != null){
                        List listEntity = this.worldObj.getEntitiesWithinAABBExcludingEntity(this.worldObj.getPlayerEntityByName(username), this.getRenderBoundingBox().expand(20D, 20D, 20D), iEntitySelector);
                        if(!listEntity.isEmpty()){
                        EntityLivingBase entity = (EntityLivingBase) listEntity.get(0);
                        TileEntitySentryObjRenderer.entityPosX = entity.posX;
                        TileEntitySentryObjRenderer.entityPosY = entity.posY;
                        TileEntitySentryObjRenderer.entityPosZ = entity.posZ;
                        TileEntitySentryObjRenderer.turretPosX = this.xCoord;
                        TileEntitySentryObjRenderer.turretPosX = this.yCoord;
                        TileEntitySentryObjRenderer.turretPosX = this.zCoord;
                        }
                        }
                        }
                        
                        }
                        

                        La classe du tileobjrenderer

                        ​package fr.lefgolas.TurretsMod.client;
                        
                        import javax.vecmath.Vector3d;
                        
                        import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
                        import net.minecraft.tileentity.TileEntity;
                        
                        import org.jglrxavpok.glutils.TessellatorModel;
                        import org.jglrxavpok.glutils.TessellatorModelEvent;
                        import org.jglrxavpok.glutils.TessellatorModelEvent.RenderGroupEvent;
                        import org.lwjgl.opengl.GL11;
                        import org.lwjgl.util.vector.Vector;
                        
                        import cpw.mods.fml.common.eventhandler.SubscribeEvent;
                        import fr.lefgolas.TurretsMod.TurretsMod;
                        
                        public class TileEntitySentryObjRenderer extends TileEntitySpecialRenderer {
                        
                        public static double entityPosX;
                        public static double entityPosY;
                        public static double entityPosZ;
                        
                        public static double turretPosX;
                        public static double turretPosY;
                        public static double turretPosZ;
                        
                        private TessellatorModel modelHaut, modelBas;
                        double angleX, angleY,angleZ;
                        
                        public TileEntitySentryObjRenderer() {
                        entityPosX = 0;
                        entityPosY = 0;
                        entityPosZ = 0;
                        turretPosX = 0;
                        turretPosY = 0;
                        turretPosZ = 0;
                        modelHaut = new TessellatorModel("/assets/" + TurretsMod.MODID + "/models/HautTurret.obj");
                        modelHaut.setID("sentryHaut");
                        modelHaut.regenerateNormals();
                        modelBas = new TessellatorModel("/assets/" + TurretsMod.MODID + "/models/BasTurret.obj");
                        modelBas.regenerateNormals();
                        TessellatorModel.MODEL_RENDERING_BUS.register(this);
                        }
                        
                        @SubscribeEvent
                            public void onPreRenderModel(TessellatorModelEvent.RenderPre event)
                            {
                                if(event.model.getID() != null && event.model.getID().equals("sentryHaut")){
                                Vector3d vectorXTurret = new Vector3d(0,5,0);
                                Vector3d VectorXEntity = new Vector3d(0,entityPosX-(turretPosX),0);
                                System.out.println("vecteur turret: " + vectorXTurret.y);
                                System.out.println("vecteur entité: " + VectorXEntity.y);
                                this.angleY = vectorXTurret.angle(VectorXEntity);
                                System.out.println(this.angleY);
                                this.angleX = 180 * this.angleY / Math.PI;
                                System.out.println(this.angleY);
                                }
                        
                            }
                        
                        @SubscribeEvent
                            public void onPreRenderGroup(RenderGroupEvent.Pre event)
                            {
                                if(event.model.getID() != null)
                                {
                                    if(event.model.getID().equals("sentryHaut"))
                                    {
                                        if(event.group.equals("sentryHaut"))
                                        {
                                            GL11.glPushMatrix();
                                            //point de rotation perso
                                            //double x = 0;
                                            //double y = 6;
                                            //double z = 0;
                                            //GL11.glTranslated(x, y, z);
                                            GL11.glRotated(this.angleY, 0, 1, 0);
                                            //GL11.glTranslated(-x, -y, -z);
                                        }
                                    }
                                }
                            }
                        
                        @SubscribeEvent
                            public void onPostRenderGroup(RenderGroupEvent.Post event)
                            {
                                if(event.model.getID() != null)
                                {
                                    if(event.model.getID().equals("sentryHaut"))
                                    {
                                        if(event.group.equals("sentryHaut"))
                                        {
                                            GL11.glPopMatrix();
                                        }
                                    }
                        
                                }
                            }
                        
                        @Override
                        public void renderTileEntityAt(TileEntity tileentity, double x, double y,
                        double z, float partialTick) {
                        GL11.glPushMatrix();
                        GL11.glTranslated(x + 0.5, y, z + 0.5);
                        GL11.glShadeModel(GL11.GL_SMOOTH);
                        modelBas.render();
                        modelHaut.render();
                        GL11.glPopMatrix();
                        }
                        }
                        

                        Après pour la rotation vers le haut ou vers le bas Je pense que ça vient du point de rotation qu’il faudrait ajuster (grâce à GLtranslated). Mais comment le visualiser afin de pouvoir le déplacer? Faire par tâtonnement est impossible quand on ne sais pas ou il est au départ et ou on veut qu’il arrive!

                        1 réponse Dernière réponse Répondre Citer 0
                        • garganG Hors-ligne
                          gargan
                          dernière édition par

                          Je me suis demander si sa ne venait pas de mon “détecteur d’entité” dans la fonction updateEntity du coup j’ai remplacé par

                          ​ public void updateEntity(){
                          
                          if(this.worldObj != null && username != null){
                          //List listEntity = this.worldObj.getEntitiesWithinAABBExcludingEntity(this.worldObj.getPlayerEntityByName(username), this.getRenderBoundingBox().expand(20D, 20D, 20D), iEntitySelector);
                          
                          //if(!listEntity.isEmpty()){
                          //EntityLivingBase entity = (EntityLivingBase) listEntity.get(0);
                          EntityPlayer entity = this.worldObj.getPlayerEntityByName("gargan");
                          if(entity != null){
                          TileEntitySentryObjRenderer.entityPosX = entity.posX;
                          TileEntitySentryObjRenderer.entityPosY = entity.posY;
                          TileEntitySentryObjRenderer.entityPosZ = entity.posZ;
                          TileEntitySentryObjRenderer.turretPosX = this.xCoord;
                          TileEntitySentryObjRenderer.turretPosX = this.yCoord;
                          TileEntitySentryObjRenderer.turretPosX = this.zCoord;
                          }
                          //}
                          }
                          }
                          

                          Mais toujours le même problème pas de rotation…

                          1 réponse Dernière réponse Répondre Citer 0
                          • garganG Hors-ligne
                            gargan
                            dernière édition par

                            @‘Bowser338’:

                            ce qu’il veut a mon avis et j’ai pas encore trouvé perso c’est de bouger le point de rotation sans bouger le shape

                            D’où l’Intérêt du

                            ​GL11.Translated(-x,-y,-z);
                            

                            Avant le model.render();
                            Le problème c’est que l’ajuster quand on ne le voit pas…
                            Une solution pour le rendre visible?
                            J’ai penser à essayer de le dessiner avec tesselator
                            Tessellator t = Tessellator.instance;
                            t.startDrawingQuads();//method 1
                            t.draw();//method 2

                            Mais sa ne marche pas vraiment…

                            De toute façon je n’arrive pas à calculer l’angle y 😞 , le seul axe qui est correct…

                            1 réponse Dernière réponse Répondre Citer 0
                            • garganG Hors-ligne
                              gargan
                              dernière édition par

                              Quelqu’un?

                              1 réponse Dernière réponse Répondre Citer 0
                              • 1 / 1
                              • Premier message
                                Dernier message
                              Design by Woryk
                              ContactMentions Légales

                              MINECRAFT FORGE FRANCE © 2024

                              Powered by NodeBB