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

      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