Jeux Libres

Envie de créer un jeu vidéo ?   Le site qui vous accompagne de A à Z.


» Les Forums » Création de jeux en Java » Chargement de modèle md2 en Java


Aller à la page : 1.

Chargement de modèle md2 en Java
Lo



Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 16 Mai 2009, 15:36             Message non corrigé

Voilà j'ai finis d'implémenter l'algorithme du chargement de fichier md2 en Java, ça à pas été simple car pas de structures en Java, ni de pointeurs donc il a fallut adapter mais j'ai enfin réussis, il y a juste un problème et je ne sais pas pourquoi, quand je trace le modèle sans les commandes openGl il lui manque une partie au personnages. Façon je compte utiliser pour mon jeux juste les commandes openGl car c'est plus rapide comme ça, ceci dis il me reste plus qu'à gérer les inscriptions et connections des joueurs, et le transfert de donnée et l'architecture de mon jeux est finie.  
Après je pourrai enfin commencer l'éditeur de map, les personnages, etc...
Pour l'instant tout ça tournera en localhost mais je compte bien trouver un moyen pour faire en sorte que les joueurs puisse se connecter sur mon programme serveur chez eux, faudra juste récupérer le .jar du client.
Voici le code : (je vais le mettre en plusieurs partie, tjs à cuase de cette erreur 500)

package wotck.jeu;

import java.io.*;
import java.nio.*;
import java.nio.channels.*;

import javax.media.opengl.*;

import wotck.factory.UnsignedVarFactory;
import wotck.gui.TextureReader;




public class Model3D {
private static final int MD2_IDENT_WIN = 844121161;
private static final int MD2_VERSION = 8;
private static final int NUMNORMALS = 162;

private int ident; //Numéro magique.
private int version; //Vesion du fichier.
private int skinWidth; //Largeur texture.
private int skinHeight; //Hauteur texture.

private int frameSize; //Taille d'une frame en octets.

private int numSkins; //Nombre de textures.
private int numVertices; //Nombre de sommets par frame.
private int numCt; //nombre de coordonnées textures.
private int numTris; //Nombre de triangles.
private int glCommands; //Nombre de commandes openGL.
private int numFrames; // Nombre de frames;

private int offsetSkins; //Position des données sur les textures dans le fichier.
private int offsetCt; //Position des données sur les coordonnées des textures.
private int offsetTris; //Position des données sur les triangles.
private int offsetFrames; //Position des données sur les frames.
private int offsetCommands; //Position des données sur les commandes opengl.
private int offsetEnd;
private FileChannel fc;

private static Vec3t[]  anorms = new Vec3t[NUMNORMALS]; //Vecteur nomrmaux pour le caclul des lumières. private MD2TexCoord[] texCoords;
private String[] skinNames;
private MD2TexCoord[] texCoords;
private MD2Triangle[] triangles;
private MD2Frame[] frames;
private int[] glCmds;

private float scale;
private int textID;

private String[] nameTextureFile; //Nom du fichier de la texture.
public Model3D () {
try {
FileInputStream fis = new FileInputStream ("normals.txt");
DataInputStream dis = new DataInputStream (fis);
for (int i = 0; i < NUMNORMALS; i++) {
anorms[i] = new Vec3t (dis.readFloat(), dis.readFloat(), dis.readFloat());
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("Fichier normals.txt introuvable.");
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("Erreur lors de la lecture des données.");
}
}
public boolean loadMd2Model (String fileName) {
FileInputStream fis = null;
FileWriter fw = null;
ByteBuffer bBuff;
StringBuffer texte = new StringBuffer();
try {
fis = new FileInputStream (fileName);
fc = fis.getChannel();
int size = (int) fc.size();
bBuff = ByteBuffer.allocate(size);
bBuff.order(ByteOrder.LITTLE_ENDIAN);
fc.read(bBuff);
bBuff.flip();
fw = new FileWriter (fileName+".txt");
fis.close();

} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("Fichier "+fileName+" introuvable");
return false;
} catch (IOException e) {
System.out.println("Erreur lors de la lecture des données!");
return false;
}
ident = bBuff.getInt();
version = bBuff.getInt();
texte.append("Numéro : "+ident+"\nversion : "+version+"\n");
if (ident != MD2_IDENT_WIN && version != MD2_VERSION)
return false;
skinWidth = bBuff.getInt();
skinHeight = bBuff.getInt();
frameSize = bBuff.getInt();
texte.append("Largeur testures : "+skinWidth+"\n"+"Hauteur textures : "+skinHeight+"\n"+"Taille des frames : "+frameSize+"\n");

numSkins = bBuff.getInt();
numVertices = bBuff.getInt();
numCt = bBuff.getInt();
numTris = bBuff.getInt();
glCommands = bBuff.getInt();
numFrames = bBuff.getInt();
texte.append("Nombre de textures : "+numSkins+"\n"+"Nombre de sommets : "+numVertices+"\n"+"Nombre de coordonnées textures : "+numCt+"\n");
texte.append("Nombre de triangles : "+numTris+"\n"+"Nombre de commandes opengl : "+glCommands+"\n"+"Nombres de frames : "+numFrames+"\n");


offsetSkins = bBuff.getInt();
offsetCt = bBuff.getInt();
offsetTris = bBuff.getInt();
offsetFrames = bBuff.getInt();
offsetCommands = bBuff.getInt();
offsetEnd = bBuff.getInt();
texte.append("Décalage textures : "+offsetSkins+"\n"+"Décalage coordonnées de textures : "+offsetCt+"\n"+"Décalage coordonnées triangles : "+offsetTris+"\n");
texte.append("Décalage des frames : "+offsetFrames+"\n"+"Décalage des commandes opengl : "+offsetCommands+"\n"+"Décalage de fin de fichier : "+offsetEnd+"\n");


skinNames = new String[numSkins];
texCoords = new MD2TexCoord[numCt];
triangles = new MD2Triangle[numTris];
frames = new MD2Frame[numFrames];
glCmds = new int[glCommands];

bBuff.position(offsetSkins);
byte[] b = new byte[64];
texte.append("Nom du fichiers pour les textures : \n");
for (int i = 0; i < numSkins; i++) {
bBuff.get(b);
skinNames[i] = new String(b);
texte.append(skinNames[i]+"\n");
}
bBuff.position(offsetCt);
texte.append("Coordonnées des textures : \n");
for (int i = 0; i < numCt; i++){
texCoords[i] = new MD2TexCoord();
texCoords[i].setS(bBuff.getShort());
texCoords[i].setT(bBuff.getShort());
texte.append(texCoords[i].getS()+" "+texCoords[i].getT()+"\n");
}
bBuff.position(offsetTris);
int x, y, z, ctx, cty, ctz;
byte[] us = new byte[2];
texte.append("Triangles : \n");
for (int i = 0; i < numTris; i++) {
triangles[i] = new MD2Triangle ();

bBuff.get(us);
x = UnsignedVarFactory.createUnsignedShort(us);
bBuff.get(us);
y = UnsignedVarFactory.createUnsignedShort(us);
bBuff.get(us);
z = UnsignedVarFactory.createUnsignedShort(us);
bBuff.get(us);
ctx = UnsignedVarFactory.createUnsignedShort(us);
bBuff.get(us);
cty = UnsignedVarFactory.createUnsignedShort(us);
bBuff.get(us);
ctz = UnsignedVarFactory.createUnsignedShort(us);

triangles[i].setMd2TriangleVertex(x, y, z);
texte.append("Sommet : "+triangles[i].getVertex()[0]+" "+triangles[i].getVertex()[1]+" "+triangles[i].getVertex()[2]+"\n");
triangles[i].setCt(ctx, cty, ctz);
texte.append("Coordonnée de la texture : "+triangles[i].getCt()[0]+" "+triangles[i].getCt()[1]+" "+triangles[i].getCt()[2]+"\n");

}
bBuff.position(offsetFrames);
float sx, sy, sz, tx, ty, tz;
texte.append("Frames : \n");
for (int i = 0; i < numFrames; i++) {
frames[i] = new MD2Frame (numVertices);

sx = bBuff.getFloat();
sy = bBuff.getFloat();
sz = bBuff.getFloat();
tx = bBuff.getFloat();
ty = bBuff.getFloat();
tz = bBuff.getFloat();
frames[i].setScale(new Vec3t(sx, sy, sz));
frames[i].setTranslate(new Vec3t(tx, ty, tz));
texte.append("Echelle : "+frames[i].getScale().getVec3t()[0]+" "+frames[i].getScale().getVec3t()[1]+" "+frames[i].getScale().getVec3t()[2]+"\n");
texte.append("Translation : "+frames[i].getTranslate().getVec3t()[0]+" "+frames[i].getTranslate().getVec3t()[1]+" "+frames[i].getTranslate().getVec3t()[2]+"\n");
byte[] b2 = new byte[16];
bBuff.get(b2);
frames[i].setNameFrame(new String(b2));
texte.append("Nom de la frame : "+frames[i].getNameFrame()+"\n");
MD2Vertex[] verts = new MD2Vertex[numVertices];
byte[] ub = new byte[1];
int vx, vy, vz, n;
texte.append("Sommets : \n");
for (int k = 0; k < numVertices ; k++) {
verts[k]= new MD2Vertex();

bBuff.get(ub);
vx = UnsignedVarFactory.createUnsignedByte(ub);
bBuff.get(ub);
vy = UnsignedVarFactory.createUnsignedByte(ub);
bBuff.get(ub);
vz = UnsignedVarFactory.createUnsignedByte(ub);
bBuff.get(ub);
n = UnsignedVarFactory.createUnsignedByte(ub);
verts[k].setV(new int[] {vx, vy, vz});
verts[k].setNormalIndex(n);
texte.append("Coordonnées relatives : "+verts[k].getV()[0]+" "+verts[k].getV()[1]+" "+verts[k].getV()[2]+"\n");
texte.append("Normal indexe : "+verts[k].getNormalIndex()+"\n");
}
frames[i].setVerts(verts);
}
bBuff.position(offsetCommands);
texte.append("Commandes openGL : \n");
for (int i =0; i < glCommands; i++) {
glCmds[i] = bBuff.getInt();
texte.append(glCmds[i]+"\n");
}
try {
fw.write(texte.toString());
fw.close();
} catch (IOException e) {
System.out.println("Erreur lors de l'écriture des données : ");
}
return true;
}
public void loadTexture (int textID) {
this.textID = textID;
}


________
Parce qu'on ne peut s'exprimer que par nos créations. ^^
  Profil Mail
Lo



Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 16 Mai 2009, 15:42             Message non corrigé

Suite :

package wotck.jeu;

import java.io.*;
import java.nio.*;
import java.nio.channels.*;

import javax.media.opengl.*;

import wotck.factory.UnsignedVarFactory;
import wotck.gui.TextureReader;




public class Model3D {
private static final int MD2_IDENT_WIN = 844121161;
private static final int MD2_VERSION = 8;
private static final int NUMNORMALS = 162;

private int ident; //Numéro magique.
private int version; //Vesion du fichier.
private int skinWidth; //Largeur texture.
private int skinHeight; //Hauteur texture.

private int frameSize; //Taille d'une frame en octets.

private int numSkins; //Nombre de textures.
private int numVertices; //Nombre de sommets par frame.
private int numCt; //nombre de coordonnées textures.
private int numTris; //Nombre de triangles.
private int glCommands; //Nombre de commandes openGL.
private int numFrames; // Nombre de frames;

private int offsetSkins; //Position des données sur les textures dans le fichier.
private int offsetCt; //Position des données sur les coordonnées des textures.
private int offsetTris; //Position des données sur les triangles.
private int offsetFrames; //Position des données sur les frames.
private int offsetCommands; //Position des données sur les commandes opengl.
private int offsetEnd;
private FileChannel fc;

private static Vec3t[]  anorms = new Vec3t[NUMNORMALS]; //Vecteur nomrmaux pour le caclul des lumières. private MD2TexCoord[] texCoords;
private String[] skinNames;
private MD2TexCoord[] texCoords;
private MD2Triangle[] triangles;
private MD2Frame[] frames;
private int[] glCmds;

private float scale;
private int textID;

private String[] nameTextureFile; //Nom du fichier de la texture.
public Model3D () {
try {
FileInputStream fis = new FileInputStream ("normals.txt");
DataInputStream dis = new DataInputStream (fis);
for (int i = 0; i < NUMNORMALS; i++) {
anorms[i] = new Vec3t (dis.readFloat(), dis.readFloat(), dis.readFloat());
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("Fichier normals.txt introuvable.");
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("Erreur lors de la lecture des données.");
}
}
public boolean loadMd2Model (String fileName) {
FileInputStream fis = null;
FileWriter fw = null;
ByteBuffer bBuff;
StringBuffer texte = new StringBuffer();
try {
fis = new FileInputStream (fileName);
fc = fis.getChannel();
int size = (int) fc.size();
bBuff = ByteBuffer.allocate(size);
bBuff.order(ByteOrder.LITTLE_ENDIAN);
fc.read(bBuff);
bBuff.flip();
fw = new FileWriter (fileName+".txt");
fis.close();

} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
System.out.println("Fichier "+fileName+" introuvable");
return false;
} catch (IOException e) {
System.out.println("Erreur lors de la lecture des données!");
return false;
}
ident = bBuff.getInt();
version = bBuff.getInt();
texte.append("Numéro : "+ident+"\nversion : "+version+"\n");
if (ident != MD2_IDENT_WIN && version != MD2_VERSION)
return false;
skinWidth = bBuff.getInt();
skinHeight = bBuff.getInt();
frameSize = bBuff.getInt();
texte.append("Largeur testures : "+skinWidth+"\n"+"Hauteur textures : "+skinHeight+"\n"+"Taille des frames : "+frameSize+"\n");

numSkins = bBuff.getInt();
numVertices = bBuff.getInt();
numCt = bBuff.getInt();
numTris = bBuff.getInt();
glCommands = bBuff.getInt();
numFrames = bBuff.getInt();
texte.append("Nombre de textures : "+numSkins+"\n"+"Nombre de sommets : "+numVertices+"\n"+"Nombre de coordonnées textures : "+numCt+"\n");
texte.append("Nombre de triangles : "+numTris+"\n"+"Nombre de commandes opengl : "+glCommands+"\n"+"Nombres de frames : "+numFrames+"\n");


offsetSkins = bBuff.getInt();
offsetCt = bBuff.getInt();
offsetTris = bBuff.getInt();
offsetFrames = bBuff.getInt();
offsetCommands = bBuff.getInt();
offsetEnd = bBuff.getInt();
texte.append("Décalage textures : "+offsetSkins+"\n"+"Décalage coordonnées de textures : "+offsetCt+"\n"+"Décalage coordonnées triangles : "+offsetTris+"\n");
texte.append("Décalage des frames : "+offsetFrames+"\n"+"Décalage des commandes opengl : "+offsetCommands+"\n"+"Décalage de fin de fichier : "+offsetEnd+"\n");


skinNames = new String[numSkins];
texCoords = new MD2TexCoord[numCt];
triangles = new MD2Triangle[numTris];
frames = new MD2Frame[numFrames];
glCmds = new int[glCommands];

bBuff.position(offsetSkins);
byte[] b = new byte[64];
texte.append("Nom du fichiers pour les textures : \n");
for (int i = 0; i < numSkins; i++) {
bBuff.get(b);
skinNames[i] = new String(b);
texte.append(skinNames[i]+"\n");
}
bBuff.position(offsetCt);
texte.append("Coordonnées des textures : \n");
for (int i = 0; i < numCt; i++){
texCoords[i] = new MD2TexCoord();
texCoords[i].setS(bBuff.getShort());
texCoords[i].setT(bBuff.getShort());
texte.append(texCoords[i].getS()+" "+texCoords[i].getT()+"\n");
}
bBuff.position(offsetTris);
int v1, v2, v3, ct1, ct2, ct3;
byte[] us = new byte[2];
texte.append("Triangles : \n");
for (int i = 0; i < numTris; i++) {
triangles[i] = new MD2Triangle ();

bBuff.get(us);
v1 = UnsignedVarFactory.createUnsignedShort(us);
bBuff.get(us);
v2 = UnsignedVarFactory.createUnsignedShort(us);
bBuff.get(us);
v3 = UnsignedVarFactory.createUnsignedShort(us);
bBuff.get(us);
ct1 = UnsignedVarFactory.createUnsignedShort(us);
bBuff.get(us);
ct2 = UnsignedVarFactory.createUnsignedShort(us);
bBuff.get(us);
ct3 = UnsignedVarFactory.createUnsignedShort(us);

triangles[i].setMd2TriangleVertex(v1, v2, v3);
texte.append("Sommet : "+triangles[i].getVertex()[0]+" "+triangles[i].getVertex()[1]+" "+triangles[i].getVertex()[2]+"\n");
triangles[i].setCt(ct1, ct2, ct3);
texte.append("Coordonnée de la texture : "+triangles[i].getCt()[0]+" "+triangles[i].getCt()[1]+" "+triangles[i].getCt()[2]+"\n");

}
bBuff.position(offsetFrames);
float sx, sy, sz, tx, ty, tz;
texte.append("Frames : \n");
for (int i = 0; i < numFrames; i++) {
frames[i] = new MD2Frame (numVertices);

sx = bBuff.getFloat();
sy = bBuff.getFloat();
sz = bBuff.getFloat();
tx = bBuff.getFloat();
ty = bBuff.getFloat();
tz = bBuff.getFloat();
frames[i].setScale(new Vec3t(sx, sy, sz));
frames[i].setTranslate(new Vec3t(tx, ty, tz));
texte.append("Echelle : "+frames[i].getScale().getVec3t()[0]+" "+frames[i].getScale().getVec3t()[1]+" "+frames[i].getScale().getVec3t()[2]+"\n");
texte.append("Translation : "+frames[i].getTranslate().getVec3t()[0]+" "+frames[i].getTranslate().getVec3t()[1]+" "+frames[i].getTranslate().getVec3t()[2]+"\n");
byte[] b2 = new byte[16];
bBuff.get(b2);
frames[i].setNameFrame(new String(b2));
texte.append("Nom de la frame : "+frames[i].getNameFrame()+"\n");
MD2Vertex[] verts = new MD2Vertex[numVertices];
byte[] ub = new byte[1];
int vx, vy, vz, n;
texte.append("Sommets : \n");
for (int k = 0; k < numVertices ; k++) {
verts[k]= new MD2Vertex();

bBuff.get(ub);
vx = UnsignedVarFactory.createUnsignedByte(ub);
bBuff.get(ub);
vy = UnsignedVarFactory.createUnsignedByte(ub);
bBuff.get(ub);
vz = UnsignedVarFactory.createUnsignedByte(ub);
bBuff.get(ub);
n = UnsignedVarFactory.createUnsignedByte(ub);
verts[k].setV(new int[] {vx, vy, vz});
verts[k].setNormalIndex(n);
texte.append("Coordonnées relatives : "+verts[k].getV()[0]+" "+verts[k].getV()[1]+" "+verts[k].getV()[2]+"\n");
texte.append("Normal indexe : "+verts[k].getNormalIndex()+"\n");
}
frames[i].setVerts(verts);
}
bBuff.position(offsetCommands);
texte.append("Commandes openGL : \n");
for (int i =0; i < glCommands; i++) {
glCmds[i] = bBuff.getInt();
texte.append(glCmds[i]+"\n");
}
try {
fw.write(texte.toString());
fw.close();
} catch (IOException e) {
System.out.println("Erreur lors de l'écriture des données : ");
}
return true;
}
public void loadTexture (int textID) {
this.textID = textID;
}
public void renderFrame (GL gl, int iFrame) {
int iMaxFrame = numFrames - 1;
if (iFrame < 0 || iFrame > iMaxFrame)
return;
gl.glBindTexture (GL.GL_TEXTURE_2D, textID);
gl.glBegin(GL.GL_TRIANGLES);
MD2Frame frame = frames[iFrame];
for (int i = 0; i < numTris; i++) {
for (int k = 0; k < 3; k++) {

MD2Vertex vertex = frame.getVerts()[triangles[i].getVertex()[k]];
float s = (float) texCoords[triangles[i].getCt()[k]].getS() / skinWidth;
float t = (float) texCoords[triangles[i].getCt()[k]].getT() / skinHeight;
gl.glTexCoord2f(s, t);
gl.glNormal3fv(FloatBuffer.wrap(anorms[vertex.getNormalIndex()].getVec3t()));
Vec3t v = new Vec3t (
(frame.getScale().getVec3t()[0] * vertex.getV()[0] + frame.getTranslate().getVec3t()[0]) * scale,
(frame.getScale().getVec3t()[1] * vertex.getV()[1] + frame.getTranslate().getVec3t()[1]) * scale,
(frame.getScale().getVec3t()[2] * vertex.getV()[2] + frame.getTranslate().getVec3t()[2]) * scale);
gl.glVertex3fv(FloatBuffer.wrap(v.getVec3t()));
}
}
gl.glEnd();
}
public void drawModelItp (GL gl, int iFrameA, int iFrameB, float fInterp) {
int iMaxFrame = numFrames - 1;

if (iFrameA < 0 || iFrameB < 0)
return;
if (iFrameA > iMaxFrame || iFrameB > iMaxFrame)
return;
gl.glBindTexture(GL.GL_TEXTURE_2D, textID);
gl.glBegin(GL.GL_TRIANGLES);
MD2Frame frameA = frames[iFrameA];
MD2Frame frameB = frames[iFrameB];
for (int i = 0; i < numTris; i++) {
for (int k = 0; k < 3; k++) {

MD2Vertex vertA = frameA.getVerts()[triangles[i].getVertex()[k]];
MD2Vertex vertB = frameB.getVerts()[triangles[i].getVertex()[k]];

float s = (float) texCoords[triangles[i].getCt()[k]].getS() / skinWidth;
float t = (float) texCoords[triangles[i].getCt()[k]].getT() / skinHeight;
gl.glTexCoord2f(s, t);

Vec3t normA, normB, n;

normA = new Vec3t (anorms[vertA.getNormalIndex()].getVec3t()[0],
anorms[vertA.getNormalIndex()].getVec3t()[1],
anorms[vertA.getNormalIndex()].getVec3t()[2]);
normB = new Vec3t (anorms[vertB.getNormalIndex()].getVec3t()[0],
anorms[vertB.getNormalIndex()].getVec3t()[1],
anorms[vertB.getNormalIndex()].getVec3t()[2]);
n = new Vec3t (normA.getVec3t()[0] + fInterp * (normB.getVec3t()[0] - normA.getVec3t()[0]),
normA.getVec3t()[1] + fInterp * (normB.getVec3t()[1] - normA.getVec3t()[1]),
normA.getVec3t()[2] + fInterp * (normB.getVec3t()[2] - normA.getVec3t()[2]));
gl.glNormal3fv(FloatBuffer.wrap(n.getVec3t()));
Vec3t vecA, vecB, v;
vecA = new Vec3t (frameA.getScale().getVec3t()[0]  * vertA.getV()[0] + frameA.getTranslate().getVec3t()[0],
frameA.getScale().getVec3t()[1]  * vertA.getV()[1] + frameA.getTranslate().getVec3t()[1],
frameA.getScale().getVec3t()[2]  * vertA.getV()[2] + frameA.getTranslate().getVec3t()[2]);

vecB = new Vec3t (frameB.getScale().getVec3t()[0]  * vertB.getV()[0] + frameB.getTranslate().getVec3t()[0],
frameB.getScale().getVec3t()[1]  * vertB.getV()[1] + frameB.getTranslate().getVec3t()[1],
frameB.getScale().getVec3t()[2]  * vertB.getV()[2] + frameB.getTranslate().getVec3t()[2]);

v = new Vec3t ((vecA.getVec3t()[0] + fInterp * (vecB.getVec3t()[0] - vecA.getVec3t()[0])) * scale,
(vecA.getVec3t()[1] + fInterp * (vecB.getVec3t()[1] - vecA.getVec3t()[1])) * scale,
(vecA.getVec3t()[2] + fInterp * (vecB.getVec3t()[2] - vecA.getVec3t()[2])) * scale);

gl.glVertex3fv(FloatBuffer.wrap(v.getVec3t()));
}
}
gl.glEnd();
}
public void renderFrameWithGLcmds (GL gl, int iFrame) {
int iMaxFrame = numFrames - 1;
if (iFrame < 0 || iFrame > iMaxFrame)
return;
gl.glBindTexture (GL.GL_TEXTURE_2D, textID);
int n = 0;
while (n < glCommands) {
int j = glCmds[n];
if (j < 0) {
gl.glBegin(GL.GL_TRIANGLE_FAN);
j = -j;
} else {
gl.glBegin(GL.GL_TRIANGLE_STRIP);
}
n++;
for ( ;j>0; j--, n+=3) {
MD2GlCommand glCom = new MD2GlCommand ();

glCom.setS(Float.intBitsToFloat(glCmds[n]));
glCom.setT(Float.intBitsToFloat(glCmds[n + 1]));

glCom.setIndex(glCmds[n+2]);
MD2Frame frame = frames[iFrame];
MD2Vertex vert = frame.getVerts()[glCom.getIndex()];
gl.glTexCoord2f((float) glCom.getS(),(float) glCom.getT());
gl.glNormal3fv(FloatBuffer.wrap(anorms[vert.getNormalIndex()].getVec3t()));

Vec3t v;
v = new Vec3t ((frame.getScale().getVec3t()[0] * vert.getV()[0] + frame.getTranslate().getVec3t()[0]) * scale,
(frame.getScale().getVec3t()[1] * vert.getV()[1] + frame.getTranslate().getVec3t()[1]) * scale,
(frame.getScale().getVec3t()[2] * vert.getV()[2] + frame.getTranslate().getVec3t()[2]) * scale);

gl.glVertex3fv(FloatBuffer.wrap(v.getVec3t()));
}

gl.glEnd();
}
}
public void drawModelItpWithGlCmds (GL gl, int iFrameA, int iFrameB, float fInterp) {
int iMaxFrame = numFrames - 1;
if (iFrameA < 0 || iFrameB < 0)
return;
if (iFrameA > iMaxFrame || iFrameB > iMaxFrame)
return;
gl.glBindTexture (GL.GL_TEXTURE_2D, textID);
int n = 0;
while (n < glCommands) {
int j = glCmds[n];
if (j < 0) {
gl.glBegin(GL.GL_TRIANGLE_FAN);
j = -j;
} else {
gl.glBegin(GL.GL_TRIANGLE_STRIP);
}
n++;
for ( ;j>0; j--, n+= 3) {
MD2GlCommand glCom = new MD2GlCommand ();

glCom.setS(Float.intBitsToFloat(glCmds[n]));
glCom.setT(Float.intBitsToFloat(glCmds[n + 1]));


glCom.setIndex(glCmds[n+2]);
MD2Frame frameA = frames[iFrameA];
MD2Frame frameB = frames[iFrameB];
MD2Vertex vertA = frameA.getVerts()[glCom.getIndex()];
MD2Vertex vertB = frameB.getVerts()[glCom.getIndex()];
gl.glTexCoord2f(glCom.getS(), glCom.getT());

Vec3t normA, normB, no;
normA = anorms[vertA.getNormalIndex()];
normB = anorms[vertB.getNormalIndex()];
no = new Vec3t (normA.getVec3t()[0] + fInterp * (normB.getVec3t()[0] - normA.getVec3t()[0]),
normA.getVec3t()[1] + fInterp * (normB.getVec3t()[1] - normA.getVec3t()[1]),
normA.getVec3t()[2] + fInterp * (normB.getVec3t()[2] - normA.getVec3t()[2]));
gl.glNormal3fv (FloatBuffer.wrap(no.getVec3t()));
Vec3t vecA, vecB, v;
vecA = new Vec3t (frameA.getScale().getVec3t()[0]  * vertA.getV()[0] + frameA.getTranslate().getVec3t()[0],
frameA.getScale().getVec3t()[1]  * vertA.getV()[1] + frameA.getTranslate().getVec3t()[1],
frameA.getScale().getVec3t()[2]  * vertA.getV()[2] + frameA.getTranslate().getVec3t()[2]);

vecB = new Vec3t (frameB.getScale().getVec3t()[0]  * vertB.getV()[0] + frameB.getTranslate().getVec3t()[0],
frameB.getScale().getVec3t()[1]  * vertB.getV()[1] + frameB.getTranslate().getVec3t()[1],
frameB.getScale().getVec3t()[2]  * vertB.getV()[2] + frameB.getTranslate().getVec3t()[2]);

v = new Vec3t ((vecA.getVec3t()[0] + fInterp * (vecB.getVec3t()[0] - vecA.getVec3t()[0])) * scale,
(vecA.getVec3t()[1] + fInterp * (vecB.getVec3t()[1] - vecA.getVec3t()[1])) * scale,
(vecA.getVec3t()[2] + fInterp * (vecB.getVec3t()[2] - vecA.getVec3t()[2])) * scale);

gl.glVertex3fv(FloatBuffer.wrap(v.getVec3t()));
}

gl.glEnd();
}
}
public static Vec3t[] getAnorms() {
return anorms;
}
public static void setAnorms(Vec3t[] anorms) {
Model3D.anorms = anorms;
}
public MD2Triangle[] getTirangles() {
return triangles;
}
public void setTirangles(MD2Triangle[] tirangles) {
this.triangles = tirangles;
}
public MD2Frame[] getFrames() {
return frames;
}
public void setFrames(MD2Frame[] frames) {
this.frames = frames;
}
public int[] getGlCmds() {
return glCmds;
}
public void setGlCmds(int[] glCmds) {
this.glCmds = glCmds;
}
public float getScale() {
return scale;
}
public void setScale(float scale) {
this.scale = scale;
}
public int getTextID() {
return textID;
}
public void setTextID(int textID) {
this.textID = textID;
}
public void setTexCoords (MD2TexCoord[] coord) {
this.texCoords = coord;
}
public MD2TexCoord[] getTexCoords () {
return texCoords;
}
private class Vec3t {
private float[] vec3t;
public Vec3t (float x, float y, float z) {
vec3t = new float[3];
vec3t[0] = x;
vec3t[1] = y;
vec3t[2] = z;
}
public float[] getVec3t () {
return vec3t;
}
}
private class MD2Vertex {
private int[] v; //Position dans l'espace. (Relative au modèle)
private int normalIndex; //Index normal du sommet.
public  MD2Vertex () {
v = new int[3];
}

public int[] getV() {
return v;
}
public void setV(int[] v) {
this.v = v;
}
public int getNormalIndex() {
return normalIndex;
}
public void setNormalIndex(int normalIndex) {
this.normalIndex = normalIndex;
}

}
private class MD2Triangle {
private int[] vertex; //Indice vertex du triangle.
private int[] ct; //Indice de coordonnée de la texture.
public MD2Triangle () {
vertex = new int[3];
ct = new int[3];
}
public void setMd2TriangleVertex (int x, int y, int z) {
vertex[0] = x;
vertex[1] = y;
vertex[2] = z;
}
public void setCt (int x, int y, int z) {
ct[0] = x;
ct[1] = y;
ct[2] = z;
}
public int[] getVertex () {
return vertex;
}
public int[] getCt () {
return ct;
}
}
private class MD2TexCoord {
private short s;
private short t;
public short getS() {
return s;
}
public void setS(short s) {
this.s = s;
}
public short getT() {
return t;
}
public void setT(short t) {
this.t = t;
}
}
private class MD2Frame {
private Vec3t scale; //Vecteur de redimentionnement.
private Vec3t translate; //Vecteur de translation.
private String nameFrame; //Nom de la frame.
private MD2Vertex[] verts; //liste des sommets.
public MD2Frame (int numVerts) {
verts = new MD2Vertex[numVerts];
}
public Vec3t getScale() {
return scale;
}
public void setScale(Vec3t scale) {
this.scale = scale;
}
public Vec3t getTranslate() {
return translate;
}
public void setTranslate(Vec3t translate) {
this.translate = translate;
}
public String getNameFrame() {
return nameFrame;
}
public void setNameFrame(String nameFrame) {
this.nameFrame = nameFrame;
}
public MD2Vertex[] getVerts() {
return verts;
}
public void setVerts(MD2Vertex[] verts) {
this.verts = verts;
}
}
private class MD2GlCommand {
private float s;
private float t;
private int index;
public float getS() {
return s;
}
public void setS(float s) {
this.s = s;
}
public float getT() {
return t;
}
public void setT(float t) {
this.t = t;
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
}
}


________
Parce qu'on ne peut s'exprimer que par nos créations. ^^
  Profil Mail
Lo



Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 16 Mai 2009, 15:44             Message non corrigé

Et la classe Entity pour les animer.


package wotck.jeu;

import javax.media.opengl.*;

public class Entity {
private Model3D model;
int iCurrentFrame, iNextFrame;
float fInterp;
float fPercent;
float fScale;
public void setModel (Model3D model) {
this.model = model;
}
public void drawEntity (GL gl, int iFrame, boolean animated, boolean useGlCmds) {
gl.glPushMatrix();
gl.glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
gl.glRotatef(-90.0f, 0.0f, 0.0f, 1.0f);
model.setScale (fScale);
if (animated) {
if (useGlCmds)
model.drawModelItpWithGlCmds (gl, iCurrentFrame, iNextFrame, fInterp);
else {
model.drawModelItp(gl, iCurrentFrame, iNextFrame, fInterp);
}
fInterp += fPercent;
} else {
if (useGlCmds) {
if (iFrame < 0)
model.renderFrameWithGLcmds(gl, iCurrentFrame);
else
model.renderFrameWithGLcmds (gl, iFrame);
} else {
if (iFrame < 0)
model.renderFrame(gl, iCurrentFrame);
else
model.renderFrame(gl, iFrame);
}
}
gl.glPopMatrix();
}
public void animate (int iStartFrame, int iEndFrame, float fPercent) {
if (iCurrentFrame < iStartFrame)
iCurrentFrame = iStartFrame;
if (iCurrentFrame > iEndFrame) {
iCurrentFrame = iEndFrame;
}
this.fPercent = fPercent;
if (fInterp > 1.0f) {
fInterp = 0.0f;
iCurrentFrame++;
if (iCurrentFrame >= iEndFrame)
iCurrentFrame = iStartFrame;
iNextFrame = iCurrentFrame + 1;
if (iNextFrame >= iEndFrame)
iNextFrame = iStartFrame;
}

}
public void setScale (float fScale) {
this.fScale = fScale;
}
public float getScale () {
return fScale;
}
}


________
Parce qu'on ne peut s'exprimer que par nos créations. ^^
  Profil Mail
Lo



Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 18 Mai 2009, 09:55             Message non corrigé

Je mettrai la mise à jour du code si je trouves une solution pour le traçage sans les commandes opengl mais j'ai bien peur que non, je corrigerai ce bug vers al fin car je vais utiliser les commandes opengl car c'est plus rapide, après je rajouterai sans doute un option sans doute.

Halalla ce que j'aimerais en être au stade final de l'amélioration, et avoir un jeux qui tourne, au moins l'architecture est déjà à moitié achevée, je pourrai si je continue à cette vitesse entamer l'éditeur de maps dans une bonne paire de mois, mais l'édition de map en 3D et les collisions il me faudra du temps car en 3D je n'y connais pas grand chose à ce sujet là.

________
Parce qu'on ne peut s'exprimer que par nos créations. ^^
  Profil Mail
Lo



Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 23 Mai 2009, 13:46             Message non corrigé

Ha j'ai trouver l'erreur, ça venais de cette classe ci :

public class UnsignedVarFactory {
public static int createUnsignedShort (byte[] b) {
return (b[1] & 0xFF) << 8 | (b[0] & 0xFF);
}
public static int createUnsignedByte (byte[] b) {
return b[0] & 0xFF;
}
}


J'avais oublier de rajouter le décalage de 8 bits ver la gauche (<<8) du coup les valeurs n'étaient pas bonnes.
Voilà ma classe marche nickelle maintenant!!

On peut charger des modèle avec ou sans les commandes openGL!
Prochain point, le déplacement des personnages en réseaux!

________
Parce qu'on ne peut s'exprimer que par nos créations. ^^
  Profil Mail
 


Aller à la page : 1.


Hébergeur du site : 1and1.fr



Site de création de Jeux Vidéo
Apprenez à créer vos propres Jeux Video

1198875 pages ont été consultées sur le site !
Dont 2359 pages pendant les 24 dernières heures.

Page générée en 0.308 secondes


Nos partenaires
- Otium Production : Aide aux débutants à créer leurs jeux
- Les bibliothèques de développement de jeux vidéo


  © 2005-2012 www.jeux-libres.com - Toute reproduction totale ou partielle du contenu de ce site est strictement interdite.