Jeux Libres

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


» Les Forums » A propos de la création de jeux vidéo » BoundingSphere


Aller à la page : 1.

BoundingSphere
Lo



Grade : Expert
Inscrit le: 26 Dec 2007, 17:33
Ecrit le: 03 Fev 2010, 16:20             Message non corrigé

Fiouf, j'ai enfin finis en ce qui concerne les volumes englobants, j'ai terminé par le plus simple :  la sphère!
Franchement le code n'est pas compliqué, il faut utiliser le théorème de Pythagore. ^^

package wotck.editeur.gui;

import wotck.editeur.Vec3t;
import wotck.editeur.items.Item;
import wotck.editeur.selection.Ray;

public class BoundingSphere {
private float radius;
private Vec3t center;
private Vec3t intersection1, intersection2;
public BoundingSphere (Vec3t center, float radius) {
this.radius = radius;
this.center = center;
intersection1 = new Vec3t(0, 0, 0);
intersection2 = new Vec3t (0, 0, 0);
}
public BoundingSphere (Item item) {
if (item.getLargeur() > item.getHauteur() && item.getLargeur() > item.getLongueur())
radius = item.getLargeur() / 2;
else if (item.getHauteur() > item.getLargeur() && item.getHauteur() > item.getLongueur())
radius = item.getHauteur() / 2;
else
radius = item.getLongueur() / 2;
center = item.getCentre();
intersection1 = new Vec3t(0, 0, 0);
intersection2 = new Vec3t (0, 0, 0);
}
public boolean intersect (Ray rayon) {
//Direction du centre de la Sphere par rapport à l'origine du rayon.
Vec3t l = center.soustraire(rayon.getOrig());
//Direction du rayon.
Vec3t v = rayon.getDest().soustraire(rayon.getOrig());
//On fait une projection orhtogonale du centre de la Sphere sur v.
float d = v.normalize().produitScalaire(l.normalize()) * l.longueur();
//Longueur de l au carré.
float l2 = l.longueur() * l.longueur();

float tNear, tFar;
//Si la longueur de l au carré est supérieur au rayon au carré
//Et que la projection est négative, la sphere est derrière le rayon!
if (l2 > radius * radius && d < 0)
return false;
//Distance entre le rayon et le centre de la Sphere. (Théorême de Pythagore : a = sqrt(c² - b²)!)
float h2 = l2 - d * d;
//Si la distance entre le rayon et le centre de la sphere au carré est supérieur au rayon au carré.
//Alors le rayon ne coupe pas la Sphere!

if (h2 > radius * radius)
return false;
//On recherche ou à lieu l'intersection.
//Distance entre le rayon et le bord de la sphere.(Théorême de Pythagore : a = sqrt(c² - b²)!)
float dPrim = (float) Math.sqrt(radius * radius - h2);
//Intersections par rapport à la direction du rayon.
float t1 = d - dPrim;
float t2 = d + dPrim;
float tmp;
//On permutte si nécessaire.
if (t1 > t2) {
tmp = t1;
t1 = t2;
t2 = tmp;
} else
tmp = t1;
//Pour avoir l'intersecion par rapport au rayon, on divise par la lonueur du rayon.
tNear = t1 / v.longueur();
tFar = t2 / v.longueur();
//Ensuite on peut récupérer l'intersection réelle.
intersection1 = rayon.getOrig().additionner(v.scale(tNear, true, true, true));
intersection2 = rayon.getOrig().additionner(v.scale(tFar, true, true, true));
return true;
}
public boolean intersect (BoundingSphere bs) {
float d = center.calculerDistance(bs.center);
float rSum = radius + bs.radius;
if (d > rSum)
return false;
return true;
}
public static void main (String[] args) {
Ray rayon = new Ray (new Vec3t(0, 19, -10), new Vec3t (0, 19, 100));
BoundingSphere bs = new BoundingSphere (new Vec3t (0, 0, 50), 20);
if (bs.intersect(rayon))
System.out.println("Intersections : "+bs.intersection1 + " "+bs.intersection2);
}
}


Voilà niveau sélection et utilisation de volumes englobant je touche enfin le fond! Mais pour le moment je ne travaille que avec des plans pour tester, ça va ça avance, si je continue comme ça, dans quelques mois je pourrai déjà créer des environnement sympa pour mon futur jeux. x)

________
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

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

Page générée en 0.298 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.