Résolu Model d'une sphère ?
-
Salut,
Je voudrais savoir s’il est possible de créer un block qui a le model d’une sphère. J’ai regardé un peu partout, et j’en ai conclu que le meilleur moyen était de créer un .obj model 3d d’une sphère. C’est ce que j’ai fait, cependant comment l’utiliser ? J’ai vu qu’il y avait un tutoriel sur ce forum mais il date de presque 3 ans… Une idée ?
-
Je pense que le lien cité est toujours d’actualité.
Mais tu ne sauras qu’en essayant. -
ça marche, je vais essayer alors
-
-
Merci Robin ! Je n’étais pas au courant tu me sauve la vie la
-
Tu as tout simplement une classe Sphere inclue dans les package de lwjgl. Ca marche parfaitement avec, et sa t’évites aussi d utiliser le chargeur d’obj
-
@‘Plaigon’:
Tu as tout simplement une classe Sphere inclue dans les package de lwjgl. Ca marche parfaitement avec, et sa t’évites aussi d utiliser le chargeur d’obj
J’ai absolument aucune idée de comment utiliser un objet comme la sphere du package lwjgl dans le code minecraft. Une fois l’avoir draw, que faire avec ?
Merci de l’aide ! -
Bah tu draw la sphère dans la méthode render de ton tesr.
Voici un code qui t’aidera :glColor4f(0F, 255F, 0F, 0.5F); Sphere sphere = new Sphere(); sphere.setOrientation(GLU.GLU_INSIDE); sphere.draw(1F, 128, 128);
-
ça je l’avais à peu près écris (juste pas les même paramètres dans draw), ce que je me demandais c’est comment dire au GlStateManager d’utiliser la sphere ?
-
Envoie ton code, ça fait longtemps que je n’ai pas refait de tesr x)
-
Ben pour l’instant y’a quasiment rien, mais après c’est la première fois ou presque que j’utilise tesr donc bon
package mod.dylems.bloodplus.client.renderer.tilentity; import org.lwjgl.util.glu.GLU; import org.lwjgl.util.glu.Sphere; import mod.dylems.bloodplus.tileentity.TileEntityBloodSphere; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; public class TileEntityBloodSphereSpecialRenderer extends TileEntitySpecialRenderer<tileentitybloodsphere>{ private static final ResourceLocation BLOOD_SPHERE_TEXTURE = new ResourceLocation("bloodPlus:textures/blocks/blood_sphere.png"); public TileEntityBloodSphereSpecialRenderer() { } @Override public void renderTileEntityAt(TileEntityBloodSphere te, double x, double y, double z, float partialTicks, int destroyStage) { GlStateManager.pushMatrix(); GlStateManager.translate(x, y, z); GlStateManager.enableCull(); Sphere sphere = new Sphere(); sphere.setOrientation(GLU.GLU_INSIDE); sphere.draw(1F, 128, 128); this.bindTexture(BLOOD_SPHERE_TEXTURE); GlStateManager.popMatrix(); } } ```</tileentitybloodsphere>
-
Bah logiquement tu vires tout ce qu’il y a dans ta méthode renderTileEntityAt pour y mettre ton code qui rend la sphère.
-
@‘Plaigon’:
Bah logiquement tu vires tout ce qu’il y a dans ta méthode renderTileEntityAt pour y mettre ton code qui rend la sphère.
Justement, c’est ce que je veux faire… C’est pour ça que je te demande ton aide
-
Bah c’est pas compliqué, ta méthode ressemblera donc à ceci:
glPushMatrix(); glTranslatef((float) x, (float) y, (float) z); glShadeModel(GL_SMOOTH); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE); glDisable(GL_ALPHA_TEST); glEnable(GL_CULL_FACE); glDepthMask(false); glColor4f(0F, 255F, 0F, 0.5F); Sphere sphere = new Sphere(); sphere.setOrientation(GLU.GLU_INSIDE); sphere.draw(1F, 128, 128); glPopMatrix
Tu peux créer un deuxième sphère aux même coords que la première mais avec GLU.GLU_OUTSIDE, si tu souhaites que lorsque tu rentres dans la sphère, tu n’ais aucun bug de texture. N’oublie pas l’import static !
-
Bon c’est très flou pour moi, ton code n’a aucun effet mais ça doit être de ma faute, je vais voir demain. Faut vraiment que j’apprenne l’open gl…
package mod.dylems.bloodplus.client.renderer.tilentity; import org.lwjgl.opengl.GL11; import org.lwjgl.util.glu.GLU; import org.lwjgl.util.glu.Sphere; import mod.dylems.bloodplus.tileentity.TileEntityBloodSphere; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.util.ResourceLocation; public class TileEntityBloodSphereSpecialRenderer extends TileEntitySpecialRenderer <tileentitybloodsphere>{ private final ResourceLocation location = new ResourceLocation("blocks/blood_sphere"); public TileEntityBloodSphereSpecialRenderer() { } @Override public void renderTileEntityAt(TileEntityBloodSphere te, double x, double y, double z, float partialTicks, int destroyStage) { this.bindTexture(location); GL11.glPushMatrix(); GL11.glTranslatef((float) x, (float) y, (float) z); GL11.glShadeModel(GL11.GL_SMOOTH); GL11.glEnable(GL11.GL_BLEND); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE); GL11.glDisable(GL11.GL_ALPHA_TEST); GL11.glEnable(GL11.GL_CULL_FACE); GL11.glDepthMask(false); GL11.glColor4f(0F, 255F, 0F, 0.5F); Sphere sphere = new Sphere(); sphere.setOrientation(GLU.GLU_INSIDE); sphere.draw(1F, 128, 128); GL11.glPopMatrix(); } } ```</tileentitybloodsphere>
-
Bon, encore un gros merci à toi car tout fonctionne, sauf la texture de la sphere qui ne s’applique pas. Mon code (j’ai retiré la partie qui render la table, la fonction qui render la sphère est appelée avant TileEntityRenderAt):
package mod.dylems.bloodplus.client.renderer.tilentity; import org.lwjgl.opengl.GL11; import org.lwjgl.util.glu.GLU; import org.lwjgl.util.glu.Sphere; import mod.dylems.bloodplus.tileentity.TileEntityBloodTable; import net.minecraft.client.Minecraft; import net.minecraft.client.model.ModelBook; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer; import net.minecraft.entity.Entity; import net.minecraft.util.MathHelper; import net.minecraft.util.ResourceLocation; public class TESRBloodTable extends TileEntitySpecialRenderer<tileentitybloodtable>{ /** The texture for the book above the enchantment table. */ private static final ResourceLocation BLOOD_TABLE_BOOK_TEXTURE = new ResourceLocation("bloodPlus:textures/entity/blood_table_book.png"); private static final ResourceLocation BLOOD_SPHERE_TEXTURE = new ResourceLocation("bloodPlus:textures/entity/blood_sphere_full.png"); private ModelBook field_147541_c; public static int sphereIdOutside; public static int sphereIdInside; public TESRBloodTable() { this.field_147541_c = new ModelBook(); } public void renderTileEntityAt(TileEntityBloodTable te, double x, double y, double z, float partialTicks, int destroyStage) { GL11.glPushMatrix(); GL11.glTranslated((float)x + 0.5F, (float)y + 2.75F, (float)z + 0.5F); GL11.glScalef(3.0F, 3.0F, 3.0F); GL11.glEnable(GL11.GL_BLEND); GL11.glDepthMask(false); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); GL11.glColor4f(1.0F, 1.0F, 1.0F, 0.5F); GL11.glEnable(GL11.GL_ALPHA_TEST); GL11.glCallList(sphereIdOutside); GL11.glCallList(sphereIdInside); GL11.glPopMatrix(); } public static void renderSphere() { Sphere sphere = new Sphere(); sphere.setDrawStyle(GLU.GLU_FILL); sphere.setNormals(GLU.GLU_SMOOTH); sphere.setOrientation(GLU.GLU_OUTSIDE); sphereIdOutside = GL11.glGenLists(1); GL11.glNewList(sphereIdOutside, GL11.GL_COMPILE); Minecraft.getMinecraft().getTextureManager().bindTexture(BLOOD_SPHERE_TEXTURE); sphere.draw(0.25F, 16, 16); GL11.glEndList(); sphere.setOrientation(GLU.GLU_INSIDE); sphereIdInside = GL11.glGenLists(1); GL11.glNewList(sphereIdInside, GL11.GL_COMPILE); Minecraft.getMinecraft().getTextureManager().bindTexture(BLOOD_SPHERE_TEXTURE); sphere.draw(0.25F, 16, 16); GL11.glEndList(); } }
Et le rendu :
Comme tu peux le voir, la texture ne s’applique malheureusement pas !</tileentitybloodtable>
-
Moi j’aurais mis la méthode qui applique la texture au début de la fonction, essaie voir
-
Je la mets avant chaque draw (le draw de la sphère vu de l’extérieur et celui de la sphère vu de l’intérieur), je viens d’essayer au début de la fonction mais pas de changement
-
J’ai réussi à résoudre le problème (grâce à l’aide du forum EN), je mets la balise.
-
Poste la solution ici au cas où quelqu’un en aurait besoin.
Et un lien vers le forum EN aussi s’il te plaîtSent from my GT-I9195I using Tapatalk