1

Soit un point M(x ; y)
Je veux placer le point N(x' ; y') qui est en fait M tourné de r° par rapport à O(0;0).

Avec quelles règles déterminer x' et y' ?
Ne me parlez pas de matrices, je suis un petit de 1ère STI, je n'y pige rien, cosinus/sinus rullezzz même si c'est moins rapide.
       | _
    .M |   \-50° par exemple
       |   V
-------+-------
       |
       |
       |

Maire Scie Beau Coût top
[edit]Edité par Thibaut le 07-03-2002 à 21:18:37[/edit]
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

2

ouais et avec les matrices aussi pour les autres qui sont plus en premiere si cest possible...
Y a deux fesses qui sont sur la plage et l'une dit à l'autre :
"Qu'est ce qu'on fait maintenant ?"
Et l'autre lui répond :
"Ben PROUT !!!"

3

en fait, les matrices ne sont qu'un mode de représentation de ce qu'on donnera à Thibaut...
Site : http://www.phareaway.com/
Membre du groupe Phare Away et webmaster du site

4

Avec l'écriture complexe des rotations c faisable...
z=abs(z)*e^(i*theta)
z'=abs(z)*e^(i*(theta+alpha))

Ce qui donne avec des x :

x'=racine(x²+y²)*cos(theta+alpha).
y'=racine(x²+y²)*sin(theta+alpha).

Avec theta=angle initial de M et si tu ne le connais pas, il vaut anticosinus(x/racine(x²+y²)=antisinus(y/racine(x²+y²)). alpha=angle de la rotation, le tout en sens trigonometrique, bien sur...
avatar
I'm on a boat motherfucker, don't you ever forget

5

cest pas x'=cos(t)*x-sin(t)*y et y'=sin(t)*x+cos(t)*y avec t l'angle...
Y a deux fesses qui sont sur la plage et l'une dit à l'autre :
"Qu'est ce qu'on fait maintenant ?"
Et l'autre lui répond :
"Ben PROUT !!!"

6

si, je crois.
Site : http://www.phareaway.com/
Membre du groupe Phare Away et webmaster du site

7

bon ben cest ca alors je sais encore faire des multiplications youpi
Y a deux fesses qui sont sur la plage et l'une dit à l'autre :
"Qu'est ce qu'on fait maintenant ?"
Et l'autre lui répond :
"Ben PROUT !!!"

8

donne juste la matrice de passage...
Site : http://www.phareaway.com/
Membre du groupe Phare Away et webmaster du site

9

mais il veut pas de matrices et pis il suffit de faire z'=e^(i*t)*z...
la matrice cest ca : M=[cos(t),-sin(t)],[sin(t),cos(t)] et z c'est [x],[y] (en colonne quoi)
z'=M*z
Y a deux fesses qui sont sur la plage et l'une dit à l'autre :
"Qu'est ce qu'on fait maintenant ?"
Et l'autre lui répond :
"Ben PROUT !!!"

10

Merci à vous smile
Mais quelles formules dois-je adopter, celles du post 4 ou celles du post 5 ?
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

11

bon, atta me suis suffisemment fait chier a trouver tout ça je te balance tout bouge pas...
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

12

Celles du post 5 sont bien plus simples!
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

13

Cela signifie que racine(x²+y²)*cos(t) = cos(t)*x - sin(t)*y ?
smile
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

14

Non. Le t de jpflori ne correspond qu'à alpha, pas à theta+alpha.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

15

Ok, mais si theta=0, racine(x²+y²)*cos(t) = cos(t)*x - sin(t)*y confus
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

16

pour la rotation d'axe x:

x'=x
y'=cos(angle_x)*y-sin(angle_x)*z
z'=sin(angle_x)*y+cos(angle_x)*z


celle autour de l'axe y:

x'=cos(angle_y)*x+sin(angle_y)*z
y'=y
z'=-sin(angle_y)*x+cos(angle_y)*z


et celle autour de l'axe z:

x'=cos(angle_z)*x-sin(angle_z)*y
y'=sin(angle_z)*x+cos(angle_z)*y
z'=z


bon si tu fais ça comme ça déjà ça sera + lent qu'avec des matrices, mais bon si tu veux pas en passer par la tant pis.
si tu fais ça tu devras réutiliser les x,y et z trouvés dans la rotation d'avant pour calculer la rotation courante...
par exemple si tu fais:

yf=cos(angle_x)*y-sin(angle_x)*z
zf=sin(angle_x)*y+cos(angle_x)*z
xf=cos(angle_y)*x+sin(angle_y)*z
zf=-sin(angle_y)*x+cos(angle_y)*z
xf=cos(angle_z)*x-sin(angle_z)*y
yf=sin(angle_z)*x+cos(angle_z)*y



ça marchera pa il faut réintroduire les xfyfzf dans la rot d'après:

yf=cos(angle_x)*y-sin(angle_x)*z
zf=sin(angle_x)*y+cos(angle_x)*z
xf=cos(angle_y)*x+sin(angle_y)*zf
zff=-sin(angle_y)*x+cos(angle_y)*zf
xff=cos(angle_z)*xf-sin(angle_z)*yf
yff=sin(angle_z)*xf+cos(angle_z)*yf



et tes points finaux sont dans xff,yff et zff

maintenant si tu veux une correspondance en terme de matrice, ça donne ça:

[4][b][u]ROTATION D'AXE X:[/u][/b][/4]

x'=x
y'=cos(ax)*y-sin(ax)*z
z'=sin(ax)*y+cos(ax)*z

|1     0        0   |
|0  cos(ax) -sin(ax)|
|0  sin(ax)  cos(ax)|

[4][b][u]ROTATION D'AXE Y:[/u][/b][/4]

x'=cos(angle_y)*x+sin(angle_y)*z
y'=y
z'=-sin(angle_y)*x+cos(angle_y)*z

|cos(ay)   0   sin(ay)|
|   0      1      0   |
|-sin(ay)  0   cos(ay)|

[4][b][u]ROTATION D'AXE Z:[/u][/b][/4]

x'=cos(angle_z)*x-sin(angle_z)*y
y'=sin(angle_z)*x+cos(angle_z)*y
z'=z

|cos(az) -sin(az)  0|
|sin(az)  cos(az)  0|
|   0        0     1|
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

17

et pour la solution utilisant complètement le matrices, cad une seule matrice de transformation 3*3, tu dois multiplier ces 3 matrices X,Y et Z entre elles...

bon déjà pour multiplier deux matrices 3*3 tu fé ça:
(si je me goure que qqun corrige svp)

|a , b , c|   |1 , 2 , 3|   |1*a+4*b+7*c , 2*a+5*b+8*c , 3*a+6*b+9*c|
|d , e , f| . |4 , 5 , 6| = |1*d+4*e+7*f , 2*d+5*e+8*f , 3*d+6*e+9*f|
|g , h , i|   |7 , 8 , 9|   |1*g+4*h+7*i , 2*g+5*h+8*i , 3*g+6*h+9*i|

In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

18

heu, v bouffer je poste le reste après
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

19

ué donc...
quand tu multiplies tes matrices l'ordre importe, ça déterminera la "priorité" des rotations. dans un moteur qui fait tourner des objets autour d'un même point, tu t'en fous un peu, mais si tu veux faire un moteur ou tu peux "explorer" le monde, un moteur a la 1ere personne par exemple, l'ordre importe... par exemple le rolling (tomber à gauche ou a droite -> axe de profondeur Z) sera le plus prioritaire, ensuite ce sera la rotation pour regarder en haut et en bas (axe X) et la moins prioritaire celle d'axe Y (par exemple)
dans ce cas tu devras faire:

[matF]=[matY].[matX]
[matF]=[matF].[matZ]

par exemple tu peux avoir comme matrice de rots:

|Cos[Za]*Cos[Ya]  Cos[Za]*Sin[Ya]*Sin[Xa] - Sin[Za]*Cos[Xa]  Cos[Za]*Sin[Ya]*Cos[Xa] + Sin[Za]*Sin[Xa]|
|Sin[Za]*Cos[Ya]  Sin[Za]*Sin[Ya]*Sin[Xa] + Cos[Xa]*Cos[Za]  Sin[Za]*Sin[Ya]*Cos[Xa] - Cos[Za]*Sin[Xa]|
|   -Sin[Ya]                   Sin[Xa]*Cos[Ya]                          Cos[Xa]*Cos[Ya]               |


bon et vu que je pense pas que tu veuille le faire en floats grin
si tes sin/cos sont <<8 ça te donne ça:

matrice[0][0] = (Cos[Za]*Cos[Ya])>>8;
matrice[1][0] = (Sin[Za]*Cos[Ya])>>8;
matrice[2][0] = -Sin[Ya];
matrice[0][1] = (Cos[Za]*Sin[Ya]*Sin[Xa] - (Sin[Za]*Cos[Xa]<<8))>>16;
matrice[1][1] = (Sin[Za]*Sin[Ya]*Sin[Xa] + (Cos[Xa]*Cos[Za]<<8))>>16;
matrice[2][1] = (Sin[Xa]*Cos[Ya])>>8;
matrice[0][2] = (Cos[Za]*Sin[Ya]*Cos[Xa] + (Sin[Za]*Sin[Xa]<<8))>>16;
matrice[1][2] = (Sin[Za]*Sin[Ya]*Cos[Xa] - (Cos[Za]*Sin[Xa]<<8))>>16;
matrice[2][2] = (Cos[Xa]*Cos[Ya])>>8;

vala smile
bon, ça c'est juste un exemple de matrice de rots, il y en a plein d'autres, a toi de voir ce que ça fait dans ton moteur quand tu changes de place les 3 mats de base dans la multiplication de matrice smile
vala si je me sui planté qque part, que qqun le signale smile
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

20

t'as aussi les matrices 4*4 qui sont pareilles que les 3*3 pour les rotations, avec des infos en + qui te permettent de faire des translations et scaling, ms bon ça sert pas a grand chose a mon avis, c trop les et le scaling ça sert pas a grand chose (sauf si tu ve faire un truc "spécial" grin) et puis pour les translations, 3 add suffisent tongue (1 pour chaque coord x,y,z)
d'ailleurs pour les translations, si tu veux faire un moteur a la premiere personne, fais les avant les rotations, et si tu veux un moteur qui fait tourner un objet autour de son centre fais les après...
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

21

Merci beaucoup sBibi eek

C'est quoi "un moteur a la première personne" ?
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

22

ben un moteur qui affiche ce que tu verrais si tu étais dans le monde 3D, cad un moteur a la doom, quake, half life, max payne, wolfenstein, etc....
l'affichage a la 2eme personne n'est jamais utilisé dans les jeux tt simplement pke c'est injouable (il y a un mode cheat a la 2eme personne dans hl) c'est un affichage ou tu vois ce que vois ton ennemi, cad que tu te vois de face, donc tu vois ce qu'il y a derrière toi, mais pas ce qu'il y a devant, c gênant pour viser grin
et puis un moteur a la 3eme personne, c'est un truc genre nomad soul ou devil may cry, cad que tu vois ce que verrait un observateur placé à côté de toi, et le plus souvent, derrière toi... vala smile
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

23

smile Je crois alors que mon moteur est à aucune personne grin

Pour se déplacer dans mes mondes, on déplace la caméra, donc c'est au programmeur de choisir d'où il veut voir.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

24

ben oui, c'est au programmeur de choisir quel type de moteur il ve faire au final... ou bien si il veut pouvoir switcher entre les != types smile

enfin c kan même pas pareil pour les rots et les translations pour un truc a la 1ere pers et un a la 2eme ou a la 3eme... ou bien alors tu fé un code général qui gêre bien tt ça, mais plus lent...
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

25

Mes fonctions fonctions de rotation prennent (entre autres) les coordonées du centre autour duquel tourner, donc il n'y a aucun problème, si ?
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

26

ok, dans ce cas c bon tu pe faire n'importe koi :]
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

27

de tte façons pour régler le centre de la rotation, t'as 3 adds à faire avant les rots...
c pr ça qu'en ajoutant les coords x,y et z de la cam avant de rotationner, tu as une affichage a la 1ere personne...
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina

28

Voila des sources que j'ai faites d'un test en java de rotation 3D il y a quelques temps.
Il est tout simple, peut etre que tu comprendras avec ca wink

sinon ca donne ca:
http://www.ak-dev.com/tmp/3D.html
Bon c'est pas bo, parce qu'a l'epoque je ne connaissais pas bien le java je debutais... je connaissais pas les api donc je n'avais pas pu faire de bufferisation d'image, donc ca clignote, et je ne savais pas temporie la rotation donc pour le ralentir... lisez le source et vous comprendrez wink

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.*;

public class JCube extends JApplet {

	private Graphics2D g2D;
	private double xcenter;
	private double ycenter;
	private double povx;
	private double povy;
	private double povz;
	private Point3D[] pointarray = {
		new Point3D(-100.0, 100.0, 100.0),
		new Point3D(100.0, 100.0, 100.0),
		new Point3D(100.0, 100.0, -100.0),
		new Point3D(-100.0, 100.0, -100.0),
		new Point3D(-100.0, -100.0, 100.0),
		new Point3D(100.0, -100.0, 100.0),
		new Point3D(100.0, -100.0, -100.0),
		new Point3D(-100.0, -100.0, -100.0),
		new Point3D(-450.0, 0.0, 0.0),
		new Point3D(450.0, 0.0, 0.0),
		new Point3D(0.0, -450.0, 0.0),
		new Point3D(0.0, 450.0, 0.0),
		new Point3D(0.0, 0.0, -450.0),
		new Point3D(0.0, 0.0, 450.0)
	};

	private int[][] trianglearray = {
/*		{0, 1, 2},
		{2, 3, 0},
		{4, 5, 6},
		{6, 7, 4},
		{0, 1, 5},
		{0, 4, 5},
		{1, 2, 6},
		{1, 5, 6},
		{2, 3, 6},
		{3, 6, 7},
		{0, 4, 7},
		{0, 3, 7},
*/		{0, 3, 8},
		{0, 4, 8},
		{4, 7, 8},
		{3, 7, 8},
		{1, 2, 9},
		{1, 5, 9},
		{2, 6, 9},
		{5, 6, 9},
		{4, 5, 10},
		{4, 7, 10},
		{5, 6, 10},
		{6, 7, 10},
		{0, 1, 11},
		{1, 2, 11},
		{2, 3, 11},
		{3, 4, 11},
		{2, 3, 12},
		{2, 6, 12},
		{3, 7, 12},
		{6, 7, 12},
		{0, 1, 13},
		{1, 5, 13},
		{4, 5, 13},
		{0, 4, 13}
	};

	public void init() {
		povx = 0;
		povy = 0;
		povz = -500;
		xcenter = 500 / 2;
		ycenter = 500 / 2;
		this.setBounds(0, 0, 500, 500);
	}

	public void paint(Graphics g) {
		g2D = (Graphics2D)g;
		g2D.setPaint(Color.red);
		move();
	}

	public void renderPoint(Point3D p3d) {
		double x1 = (double)p3d.getX();
		double y1 = (double)p3d.getY();
		double z1 = -500.0 / (-1000.0 - (double)p3d.getZ());
		Rectangle2D.Double l1 = new Rectangle2D.Double(x1 * z1  + xcenter, y1 * z1  + ycenter, 1.0, 1.0);
		g2D.draw(l1);
	}

	public void renderLine(Point3D p3d1, Point3D p3d2) {
		double x1 = (double)p3d1.getX();
		double y1 = (double)p3d1.getY();
		double z1 = -500.0 / (-1000.0 - (double)p3d1.getZ());
		double x2 = (double)p3d2.getX();
		double y2 = (double)p3d2.getY();
		double z2 = -500.0 / (-1000.0 - (double)p3d2.getZ());
		Line2D.Double l1 = new Line2D.Double(x1 * z1  + xcenter, y1 * z1  + ycenter, x2 * z2  + xcenter, y2 * z2  + ycenter);
		g2D.draw(l1);
	}

	public void renderTriangle(Point3D p3d1, Point3D p3d2, Point3D p3d3) {
		double x1 = (double)p3d1.getX();
		double y1 = (double)p3d1.getY();
		double z1 = -500.0 / (-1000.0 - (double)p3d1.getZ());
		double x2 = (double)p3d2.getX();
		double y2 = (double)p3d2.getY();
		double z2 = -500.0 / (-1000.0 - (double)p3d2.getZ());
		double x3 = (double)p3d3.getX();
		double y3 = (double)p3d3.getY();
		double z3 = -500.0 / (-1000.0 - (double)p3d3.getZ());
		int[] tabx = {(int)(x1 * z1  + xcenter), (int)(x2 * z2  + xcenter), (int)(x3 * z3  + xcenter)};
		int[] taby = {(int)(y1 * z1  + ycenter), (int)(y2 * z2  + ycenter), (int)(y3 * z3  + ycenter)};
		g2D.fillPolygon(new Polygon(tabx, taby, 3));
	}

	public void renderObject() {
		for (int i = 0 ; i < trianglearray.length ; i++) {
			renderTriangle(pointarray[trianglearray[i][0]], pointarray[trianglearray[i][1]], pointarray[trianglearray[i][2]]);
		}
	}

	public void move() {
		while (true) {
			for (int j = 0 ; j < 360 ; j++) {
				for (int i = 0 ; i < pointarray.length ; i++) {
					pointarray[i] = RotatePointAroundAxes(pointarray[i], Math.PI / 101, Math.PI / 171, Math.PI / 343);
				}
				g2D.clearRect(0, 0, 500, 500);
// je repete 20 fois pour ralentir , j'ai pas encore trouvé comment faire un wait en java
				renderObject();
				renderObject();
				renderObject();
				renderObject();
				renderObject();
				renderObject();
				renderObject();
				renderObject();
				renderObject();
				renderObject();
				renderObject();
				renderObject();
				renderObject();
				renderObject();
				renderObject();
			}
		}
	}

[edit]Edité par freka le 09-03-2002 à 12:04:23[/edit]

29

	public Point3D RotatePointAroundAxes(Point3D p3d, double alphax, double alphay, double alphaz) {
		double x = p3d.getX();
		double y = p3d.getY();
		double z = p3d.getZ();
		p3d.setY(y * Math.cos(alphax) + z * Math.sin(alphax));
		p3d.setZ(-y * Math.sin(alphax) + z * Math.cos(alphax));
		x = p3d.getX();
		y = p3d.getY();
		z = p3d.getZ();
		p3d.setX(x * Math.cos(alphay) + z * Math.sin(alphay));
		p3d.setZ(-x * Math.sin(alphay) + z * Math.cos(alphay));
		x = p3d.getX();
		y = p3d.getY();
		z = p3d.getZ();
		p3d.setX(x * Math.cos(alphaz) + y * Math.sin(alphaz));
		p3d.setY(-x * Math.sin(alphaz) + y * Math.cos(alphaz));
		return p3d;
	}


	public class Point3D {

		private double x;
		private double y;
		private double z;

		public Point3D(double x, double y, double z) {
			this.setX(x);
			this.setY(y);
			this.setZ(z);
		}

		public double getX() {
			return this.x;
		}

		public double getY() {
			return this.y;
		}

		public double getZ() {
			return this.z;
		}

		public void setX(double value) {
			 this.x = value;
		}

		public void setY(double value) {
			 this.y = value;
		}

		public void setZ(double value) {
			 this.z = value;
		}
	}
}


30

ben voila un superbe exemple qui n'utilise PAS les matrices smile
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960

*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina