GLUtils animation seulement d'une partie de l'objet 3d
-
Bonjour à tous! Je voudrait animer une tourelle avec GUtil. Je voudrais animer seulement le haut et pas le pied de la tourelle.
Je l’ai donc découper en 2 partie vu que c’est apparemment la seule façon (pour le moment de l’animer).
Seulement je n’arrive pas à l’animer! Est-ce que quelqu’un pourrait me montrer simplement comment la faire tourner sur l’axe x en continue par exemple?Mon Bloc
package fr.lefgolas.TurretsMod; import net.minecraft.block.Block; import net.minecraft.block.material.Material; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; 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()); } } } //desactive le rendu normal public boolean isOpaqueCube() { return false; } public boolean renderAsNormalBlock() { return false; } public int getRenderType() { return -1; } @Override public boolean hasTileEntity(int metadata) { return true; } @Override public TileEntity createTileEntity(World world, int metadata) { return new TileEntitySentry(); } }
Mon TileEntity
package fr.lefgolas.TurretsMod; 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; } public String getUsername(){ return this.username; } }
Mon TileEntityRenderer
package fr.lefgolas.TurretsMod.client; import java.util.List; 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 { private TessellatorModel modelHaut; private TessellatorModel modelBas; public TileEntitySentryObjRenderer() { 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(); modelHaut.render(); GL11.glPopMatrix(); } }
-
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>
-
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
-
Ce serait bien d’utiliser les balises java pour le code Java.
-
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 tileEntitypackage 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’angleEt je n’arrive pas à la faire pivoter vers le haut ou vers le bas!
Mes talents de graphisme sont limités…
-
Y a t-il un moyen de visualiser le point de rotation?
Et comment calculer l’angle ? -
@‘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 ?
-
“La boule bleue” de Techne fait à peu près la même chose:
GL11.glTranslated(x, y, z); et GL11.glTranslated(-x, -y, -z)
-
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
-
@‘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
-
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 vecteursMais 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!
-
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…
-
@‘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 2Mais sa ne marche pas vraiment…
De toute façon je n’arrive pas à calculer l’angle y , le seul axe qui est correct…
-
Quelqu’un?