Forums Développement Multimédia

Aller au contenu

[FP10] matrix3D.pointAt

CODE Actionscript

5 réponses à ce sujet

#1 paodao

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 7081 messages

Posté 21 September 2008 - 16:11 PM

salut
j'essai d'orienter un sprite suivant un vector3D

j'ai 4 point (Vector3D) situé sur un plan: v1,v2,v3,v4

ces 4 point definnissent un quadrillatere dans l'espace

Action Script


var v1:Vector3D = new Vector3D(0,0,0)
var v2:Vector3D = new Vector3D(100,0,100)
var v3:Vector3D = new Vector3D(100,100,100)
var v4:Vector3D = new Vector3D(0,100,0)

je creer un sprite et dedans je dessine un rectangle avec les coodoonées x et y de chaque point

Action Script


this.s1 = new Sprite()
this.s1.graphics.lineStyle(1, 0x000000)
this.s1.graphics.drawRect(v1.x, v1.y,v2.x-v1.x, v4.y-v1.y)

en vu de dessus les 4 point sont comme suit
v1__v2
..|....|
..|__|
v4....v3


je recuperer un premir vecteur v1v2

Action Script


var v1v2:Vector3D = v2.subtract(v1)
ensuite un vecteur v1v4

Action Script


var v1v4:Vector3D = v4.subtract(v1)

je fait le produit vectoriel v1v4*v1v2
pour afin de recuperer la normal a mon quadrilaterre

Action Script


var n:Vector3D = v1v4.crossProduct(v1v2)
j'aimerai ensuite que mon sprite s'oriente suivant se vector3D n

j'ai essayé avec pointAt mais il se passe pas grand chose, je comprend pas trop comment ca marche (moi et l'anglasi icon_sad.gif )

Action Script


this.s1.transform.matrix3D.pointAt(this.s1.transform.matrix3D.position,n, n)

est ce une bonne facon de faire ?
y'a t'il plus simple ?

je post le code complet

Action Script


package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.display.StageDisplayState
import flash.display.StageAlign
import Cube
import flash.geom.Matrix3D;
import flash.geom.Vector3D
/**
* ...
* @author DefaultUser (Tools -> Custom Arguments...)
*/
public class Main extends Sprite
{

public var zone:Sprite
public var s1:Sprite


public function Main():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
}

private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point

this.zone = new Sprite()
this.zone.x = stage.stageWidth / 2;
this.zone.y = stage.stageHeight / 2;
var c:Sprite = new Sprite()
c.graphics.beginFill(0xff0000)
c.graphics.drawCircle(0, 0, 5)
c.graphics.endFill()
this.zone.addChild©
this.addChild(this.zone)



var v1:Vector3D = new Vector3D(0,0,0)
var v2:Vector3D = new Vector3D(100,0,100)
var v3:Vector3D = new Vector3D(100,100,100)
var v4:Vector3D = new Vector3D(0,100,0)

var v1v2:Vector3D = v2.subtract(v1)
var v1v4:Vector3D = v4.subtract(v1)

var n:Vector3D = v1v4.crossProduct(v1v2)

this.s1 = new Sprite()
this.s1.graphics.lineStyle(1, 0x000000)
this.s1.graphics.drawRect(v1.x, v1.y,v2.x-v1.x, v4.y-v1.y)
this.zone.addChild(this.s1)
this.s1.transform.matrix3D = new Matrix3D()
this.s1.transform.matrix3D.pointAt(this.s1.transform.matrix3D.position,n, n)
}
}

}

question subsidiaire
a la ligne 58 je met
this.s1.transform.matrix3D = new Matrix3D()
si je ne la met pas, j'ai une erreur sur la ligne suivante : impossible d'acceder a une reference nul


merci d'avance

a+

#2 frederic.dufau

  • Members
  • PipPipPipPipPipPipPipPip
  • 684 messages

Posté 21 September 2008 - 18:47 PM

Hello,

Je n'ai pas la réponse mais juste une question, toutes les méthodes de vector 3d (add, product, etc... ) sont natives dans FP10 ?

a+

#3 paodao

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 7081 messages

Posté 21 September 2008 - 18:59 PM

je sais pas s'il elle sont n'ative mais il me semble que oui

si tu es sur pc
http://www.flashdevelop.org/community/viewtopic.php?t=3039

tu peux tester icon_wink.gif

et tu verra que c'est trippant
displayObject.x
displayObject.y
displayObject.z
displayObject.rotationX
displayObject.rotationY
displayObject.rotationZ

plus les operation matriciel que tu peux faire decue
amuse toi icon_wink.gif

a+

#4 frederic.dufau

  • Members
  • PipPipPipPipPipPipPipPip
  • 684 messages

Posté 21 September 2008 - 21:01 PM

merci, je vais voir ça...

#5 paodao

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 7081 messages

Posté 23 September 2008 - 18:14 PM

re

un petit up et
Citation
question subsidiaire
a la ligne 58 je met
this.s1.transform.matrix3D = new Matrix3D()


en faite si on donne de coordonnées au sprite, y'a pas besoin de faire le new Matrix3D
sinon je comprend mieux la fonction pointAt mais je comprend pas les parametres at et up de la fonction

merci
a+

#6 paodao

  • Moderateur
  • PipPipPipPipPipPipPipPip
  • 7081 messages

Posté 02 October 2008 - 12:15 PM

je me repond pour le pointAt

Action Script


package
{
//{ IMPORT
import flash.display.Sprite;
import flash.events.*;
import flash.geom.Vector3D;
//}

public class Main extends Sprite
{
//{ VARIABLES
//}

//{ PROPRIETES
public var zone:Sprite
//}

//{ CONSTRUCTEUR
public function Main()
{
this.zone = new Sprite()
this.addChild(this.zone)
this.zone.graphics.beginFill(0xff0000)
this.zone.graphics.moveTo( -50, 50)
this.zone.graphics.lineTo( 0, -50)
this.zone.graphics.lineTo( 50, 50)
this.zone.graphics.endFill()
this.zone.x = stage.stageWidth / 2
this.zone.y = stage.stageHeight / 2
this.zone.z = 100

this.addEventListener(Event.ENTER_FRAME, _enterFrame)
}
//}

//{ METHODES
private function _enterFrame(evt:Event):void
{
var v1:Vector3D = new Vector3D(this.mouseX, this.mouseY, 0)
var v2:Vector3D = new Vector3D(0, 0, 1)
var v3:Vector3D = new Vector3D(0, -1, 0)
this.zone.transform.matrix3D.pointAt(v1,v2,v3)

}
//}

}

}
icon_biggrin.gif
a+



1 utilisateur(s) li(sen)t ce sujet

0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)

authorised training centre

Centre de Formation Mediabox - Adobe et Apple Authorised Training Center.

Déclaré auprès de la Direction du Travail et de la Formation Professionnelle

Mediabox : SARL au capital de 62.000€ - Numéro d'activité : 11 75 44555 75 - SIRET : 49371646800035

MEDIABOX, 23, rue de Bruxelles, 75009 PARIS

FFP