Auteur Sujet: graphique repere 3D avec flash  (Lu 7838 fois)

error

  • Nyarlathotep Fongus
  • *
  • Messages: 1900
graphique repere 3D avec flash « le: décembre 18, 2007, 15:56:36 pm »
Voila j’aurais besoin d’afficher des points(commentés) et des lignes dans un repère en 3D, sur le web (pour dessiner des sortes de galaxies)
Et de pouvoir faire pivoter le repère afin de pouvoir mater le tout sous différents angles

Donc à priori la meilleure solution serait flash  (j’ai penché pour le javascript, mais bon c’est laggy, c’est sale, c’est moche, c’est chiant, ça pue de la bite…)

A priori je suppose qu’il existe des scripts flash pas trop compliqués d’utilisation qui feraient un bon début, qui pourrait me conseiller ? (Cindy, inutile de te cacher je sais que t’es là)

Staross

  • CromCruach Spagetooz
  • *
  • Messages: 3468
graphique repere 3D avec flash « Réponse #1 le: décembre 18, 2007, 16:12:19 pm »
Y'a un exporteur pour blender si jamais :

http://www3.sympatico.ca/emilio.aguirre/s2flender.html

Le désavantage c'est qu'il faut apprendre à utiliser blender... et que c'est pas très interactif...

osc

  • Pape du Funk
  • *
  • Messages: 664
graphique repere 3D avec flash « Réponse #2 le: décembre 18, 2007, 16:14:18 pm »
Yep yep

De la 3d dans Flash, faut passer voir Sandy, elle assuré grave smiley14
Mais faut quand meme avoir quelques notions en as pour la faire jouir.

Une p'tit démo sympa au passage : http://www.cedric-jules.fr/sandyfullobjects/SandyDemo.html

osc

  • Pape du Funk
  • *
  • Messages: 664
graphique repere 3D avec flash « Réponse #3 le: décembre 19, 2007, 10:04:33 am »
Sinon il y a aussi PaperVision3D, un framework 3D pour flash CS3.

krodelabestiole

  • Administrator
  • Nyarlathotep Fongus
  • *
  • Messages: 1647
graphique repere 3D avec flash « Réponse #4 le: décembre 19, 2007, 11:57:27 am »
jusqu'ici jaurais dit que la meilleure solution pour la vraie 3d (des objets autour desquels on peut naviguer) sur le web, c'est plutot un shockwave exporté de director.

mais je connais pas sandy ça l'air vachement prometeur.

donc pour des poins et des lignes, tu devrais pouvoir t'en sortir avec sandy ou avec pas mal d'actionscript (ça devrait toujours faire moins de code qu'un javascript)

les exportateurs swf blender ou 3ds te permettront pas de faire de la vraie 3d interactive
par contre tu peux exporter une animation (un tour autour d'un objet) et selon l'emplacement de la souris on avance ou recule dans l'anim, pour donner un peu d'interctivité mais c'est limité à un axe.

en plus c'est envisageable que si tes points et tes lignes sont statiques (!=php)

osc

  • Pape du Funk
  • *
  • Messages: 664
graphique repere 3D avec flash « Réponse #5 le: décembre 19, 2007, 12:15:14 pm »
Director... beurk :smiley31:

Sinon, si tu n'as pas besoin de caméra, tu peux utiliser une simple class Particle3d, placer tes points dans l'espace et les relier. Ensuite il suffit de faire tourner le repère ou les objet.
Un p'tit moteur tout con de perspective suffit :
public var position:Vector3d;
public function render(perspective:Number):Void {
var pers:Number = position.getPerspective(perspective);
var screenPos:Vector3d = position.persProjectNew(pers);
mc._x = screenPos.x;
mc._y = -screenPos.y;
mc._xscale = mc._yscale=scale*pers*1.5;
mc.swapDepths(100000-Math.round(position.z*100));
};


C'est ce que j'avais fait il y a quelque année pour mon site : http://romdur.molosc.com

Impossible d'attacher un .as donc je te copie-colle la class Vector3d ici.


import ass.utils.Math2;
/////////////////////////////////////////////////////////////
class ass.repere3d.Vector3d {
public var x:Number;
public var y:Number;
public var z:Number;
public function Vector3d($x:Number, $y:Number, $z:Number) {
x = $x;
y = $y;
z = $z;
}
public function toString():String {
var x = Math.round(this.x*1000)/1000;
var y = Math.round(this.y*1000)/1000;
var z = Math.round(this.z*1000)/1000;
return "["+x+", "+y+", "+z+"]";
}
public function reset($x:Number, $y:Number, $z:Number):Void {
x = $x;
y = $y;
z = $z;
}
public function getClone():Vector3d {
return new Vector3d(x, y, z);
}
public function equals(v:Vector3d):Boolean {
return (x == v.x && y == v.y && z == v.z);
}
public function plus(v:Vector3d):Void {
x += v.x;
y += v.y;
z += v.z;
}
public function plusNew(v:Vector3d):Vector3d {
return new Vector3d(x+v.x, y+v.y, z+v.z);
}
public function minus(v:Vector3d):Void {
x -= v.x;
y -= v.y;
z -= v.z;
}
public function minusNew(v:Vector3d):Vector3d {
return new Vector3d(x-v.x, y-v.y, z-v.z);
}
public function negate():Void {
x = -x;
y = -y;
z = -z;
}
public function negateNew():Vector3d {
return new Vector3d(-x, -y, -z);
}
public function scale(v):Void {

x *= v.x;
y *= v.y;
z *= v.z;

}

public function scaleNew(v:Vector3d):Vector3d {
return new Vector3d(x*v.x, y*v.y, z*v.z);
}
public function relativeScale(v:Vector3d, s:Vector3d):Void {
var vTmp:Vector3d = minusNew(v);
vTmp.scale(s);
vTmp.plus(v);
reset(vTmp.x, vTmp.y, vTmp.z);
}
public function getLength():Number {
return Math.sqrt(x*x+y*y+z*z);
}
public function setLength(len:Number):Void {
var r = getLength();
if (r) {
scale(len/r);
} else {
x = len;
}
}
public function dot(v:Vector3d):Number {
return x*v.x+y*v.y+z*v.z;
}
public function cross(v:Vector3d):Vector3d {
var cx = y*v.z-z*v.y;
var cy = z*v.x-x*v.z;
var cz = x*v.y-y*v.x;
return new Vector3d(cx, cy, cz);
}
public function getPerspective(viewDist:Number):Number {
if (viewDist == undefined) {
viewDist = 1000;
}
return viewDist/(this.z+viewDist);
}
public function persProject(p:Number):Void {
if (p == undefined) {
p = getPerspective();
}
x *= p;
y *= p;
z = 0;
}
public function persProjectNew(p:Number) {
if (p == undefined) {
p = getPerspective();
}
return new Vector3d(p*x, p*y, 0);
}
public function rotateX(angle:Number):Void {
var ca:Number = Math2.cosD(angle);
var sa:Number = Math2.sinD(angle);
var tempY:Number = y*ca-z*sa;
var tempZ:Number = y*sa+z*ca;
y = tempY;
z = tempZ;
}
public function rotateXTrig(ca:Number, sa:Number):Void {
var tempY:Number = y*ca-z*sa;
var tempZ:Number = y*sa+z*ca;
y = tempY;
z = tempZ;
}
public function rotateY(angle:Number):Void {
var ca:Number = Math2.cosD(angle);
var sa:Number = Math2.sinD(angle);
var tempX:Number = x*ca+z*sa;
var tempZ:Number = x*-sa+z*ca;
x = tempX;
z = tempZ;
}
public function rotateYTrig(ca:Number, sa:Number):Void {
var tempX:Number = x*ca+z*sa;
var tempZ:Number = x*-sa+z*ca;
x = tempX;
z = tempZ;
}
public function rotateZ(angle:Number):Void {
var ca:Number = Math2.cosD(angle);
var sa:Number = Math2.sinD(angle);
var tempX:Number = x*ca-y*sa;
var tempY:Number = x*sa+y*ca;
x = tempX;
y = tempY;
}
public function rotateZTrig(ca:Number, sa:Number):Void {
var tempX:Number = x*ca-y*sa;
var tempY:Number = x*sa+y*ca;
x = tempX;
y = tempY;
}
public function rotateXY(a:Number, b:Number):Void {
var ca:Number = Math2.cosD(a);
var sa:Number = Math2.sinD(a);
var cb:Number = Math2.cosD(b);
var sb:Number = Math2.sinD(b);
// x-axis rotation
var rz:Number = y*sa+z*ca;
y = y*ca-z*sa;
// y-axis rotation
z = x*-sb+rz*cb;
x = x*cb+rz*sb;
}
public function rotateXYTrig(ca:Number, sa:Number, cb:Number, sb:Number):Void {
// x-axis rotation
var rz:Number = y*sa+z*ca;
y = y*ca-z*sa;
// y-axis rotation
z = x*-sb+rz*cb;
x = x*cb+rz*sb;
}
public function rotateXYZ(a:Number, b:Number, c:Number):Void {
var ca:Number = Math2.cosD(a);
var sa:Number = Math2.sinD(a);
var cb:Number = Math2.cosD(b);
var sb:Number = Math2.sinD(b);
var cc:Number = Math2.cosD(c);
var sc:Number = Math2.sinD(c);
// x-axis rotation
var ry:Number = y*ca-z*sa;
var rz:Number = y*sa+z*ca;
// y-axis rotation
var rx:Number = x*cb+rz*sb;
z = x*-sb+rz*cb;
// z-axis rotation
x = rx*cc-ry*sc;
y = rx*sc+ry*cc;
}
public function rotateXYZTrig(ca:Number, sa:Number, cb:Number, sb:Number, cc:Number, sc:Number):Void {
// x-axis rotation
var ry:Number = y*ca-z*sa;
var rz:Number = y*sa+z*ca;
// y-axis rotation
var rx:Number = x*cb+rz*sb;
z = x*-sb+rz*cb;
// z-axis rotation
x = rx*cc-ry*sc;
y = rx*sc+ry*cc;
}
public function relativeRotateX(v:Vector3d, angle:Number):Void {
var vTmp:Vector3d = minusNew(v);
vTmp.rotateX(angle);
vTmp.plus(v);
reset(vTmp.x, vTmp.y, vTmp.z);
}
public function relativeRotateY(v:Vector3d, angle:Number):Void {
var vTmp:Vector3d = minusNew(v);
vTmp.rotateY(angle);
vTmp.plus(v);
reset(vTmp.x, vTmp.y, vTmp.z);
}
public function relativeRotateZ(v:Vector3d, angle:Number):Void {
var vTmp:Vector3d = minusNew(v);
vTmp.rotateZ(angle);
vTmp.plus(v);
reset(vTmp.x, vTmp.y, vTmp.z);
}
public function relativeRotateXTrig(v:Vector3d, ca:Number, sa:Number):Void {
var vTmp:Vector3d = minusNew(v);
vTmp.rotateXTrig(ca, sa);
vTmp.plus(v);
reset(vTmp.x, vTmp.y, vTmp.z);
}
public function relativeRotateYTrig(v:Vector3d, ca:Number, sa:Number):Void {
var vTmp:Vector3d = minusNew(v);
vTmp.rotateYTrig(ca, sa);
vTmp.plus(v);
reset(vTmp.x, vTmp.y, vTmp.z);
}
public function relativeRotateZTrig(v:Vector3d, ca:Number, sa:Number):Void {
var vTmp:Vector3d = minusNew(v);
vTmp.rotateZTrig(ca, sa);
vTmp.plus(v);
reset(vTmp.x, vTmp.y, vTmp.z);
}
}


et la class Math2 :
(elle sert juste à travailler en degrés plutot qu'en radians)

class ass.utils.Math2 {
// CONSTRUCTEUR
private function Math2() {
}
// METHODE
public static function sinD(angle:Number):Number {
return Math.sin(angle*(Math.PI/180));
}
public static function cosD(angle:Number):Number {
return Math.cos(angle*(Math.PI/180));
}
public static function tanD(angle:Number):Number {
return Math.tan(angle*(Math.PI/180));
}
public static function asinD(ratio:Number):Number {
return Math.asin(ratio)*(180/Math.PI);
}
public static function acosD(ratio:Number):Number {
return Math.acos(ratio)*(180/Math.PI);
}
public static function atantD(ratio:Number):Number {
return Math.atan(ratio)*(180/Math.PI);
}
public static function atan2D(y:Number, x:Number):Number {
return Math.atan2(y, x)*(180/Math.PI);
}
}


Voila voila, ca fait paté comme ça mais bon.. j'espère que ça pourra t'être utile ;)

error

  • Nyarlathotep Fongus
  • *
  • Messages: 1900
graphique repere 3D avec flash « Réponse #6 le: décembre 19, 2007, 13:43:52 pm »
merci osc
 c'est surement ce qui se rapproche le plus de ce dont j'ai besoin

sinon jai testé en javascript
c assez pitos

http://kanar.ci0.org/genspedia2/represente.php?id=8

vendredi

  • Invincible Doner Kebab
  • Velextrut sarcoma
  • *
  • Messages: 9424
graphique repere 3D avec flash « Réponse #7 le: décembre 19, 2007, 13:52:39 pm »
ça a l'air bon ce que tu nous prépare là!!
"L'infamie perce et laisse des trous...."
TT________KKK________$$

Alain Deschodt

  • Velextrut sarcoma
  • *
  • Messages: 10351
les Etats-Unis dans le jeu « Réponse #8 le: décembre 19, 2007, 13:53:43 pm »
Citation de: "error"
merci osc (tu sens le vieux-lille)
 c'est surement ce qui se rapproche le plus de ce dont j'ai besoin pour tout niquer

sinon jai testé en javascript
c assez pitos, on ne peut pas bousiller de sites collectifs avec smiley7

http://kanar.ci0.org/genspedia2/represente.php?id=8


Eh oui, c'est la vie...  :smiley42:
En France, les chômeurs exploitent les patrons

mysh3l

  • Vomistrouzte Bouleturg
  • *
  • Messages: 5138
graphique repere 3D avec flash « Réponse #9 le: décembre 19, 2007, 14:08:09 pm »
Citation de: "error"
merci osc
 c'est surement ce qui se rapproche le plus de ce dont j'ai besoin

sinon jai testé en javascript
c assez pitos

http://kanar.ci0.org/genspedia2/represente.php?id=8

c'est assez la classe en effet mais un peu chaud pour naviguer ... j'ai vu des trucs en flash dasn ce genre mais je poste plus rien parce que V3NDR3D1 va encore dire que je post des trucs de grosses compagnies ... de dieu

osc

  • Pape du Funk
  • *
  • Messages: 664
graphique repere 3D avec flash « Réponse #10 le: décembre 19, 2007, 14:14:08 pm »
Pas mal de truc sympa fait avec PaperVision :

http://mrdoob.com

Et c'est pas une grosse compagnie

mysh3l

  • Vomistrouzte Bouleturg
  • *
  • Messages: 5138
graphique repere 3D avec flash « Réponse #11 le: décembre 19, 2007, 16:07:34 pm »
j'ai pas tout vu mais y a des chouettes trucs

bryanbeast

  • Yog-Sothoth Mucus
  • *
  • Messages: 2243
graphique repere 3D avec flash « Réponse #12 le: février 27, 2008, 16:41:08 pm »
oug
donc en fait je viens de là
https://www.cannibalcaniche.com/forum/viewtopic.php?p=119398#119398
et à priori vous pensez que l'interface du site présenté est fait avec sandy ou papervision?
ça fait un ou deux jours que je fais mumuse avec les tutos de sandy mais je crois que je ne maîtrise pas assez les classes pour pouvoir comprendre le truc smiley6