fixing control

This commit is contained in:
Frater 2026-05-14 23:02:23 +02:00
commit 2c525cb5e0
3 changed files with 48 additions and 33 deletions

View file

@ -274,7 +274,7 @@ Particulièrement utile pour orienter une primitive lors de l'initialisation (ex
---
## Orbite de l'observateur (`main.c`)
## Orbite et distance (`main.c`)
Les objets ont des positions de base fixes dans l'espace scène, définies par rapport au centre `(0, 0, 300)` :
@ -283,13 +283,13 @@ Les objets ont des positions de base fixes dans l'espace scène, définies par r
| Sphère (universe[0]) | (+60, 0, 0) |
| Cylindre (universe[1]) | (−60, 0, 0) |
Chaque frame, la matrice d'orbite `orbit = rotX(anglex) × rotY(angley)` est calculée et appliquée uniformément à chaque objet (transform 3D complet sur `base_pos`) :
Chaque frame, la matrice d'orbite `orbit = rotX(anglex) × rotY(angley)` est calculée et appliquée uniformément à chaque objet (transform 3D complet sur `base_pos`). La distance (initialement 300) peut être modifiée :
```c
obj->rot = orbit;
obj->pos.x = f_mul(bx, orbit.m[0][0]) + f_mul(by, orbit.m[1][0]) + f_mul(bz, orbit.m[2][0]);
obj->pos.y = f_mul(bx, orbit.m[0][1]) + f_mul(by, orbit.m[1][1]) + f_mul(bz, orbit.m[2][1]);
obj->pos.z = int_to_f(300) + f_mul(bx, orbit.m[0][2]) + f_mul(by, orbit.m[1][2]) + f_mul(bz, orbit.m[2][2]);
obj->pos.z = distance + f_mul(bx, orbit.m) + f_mul(by, orbit.m) + f_mul(bz, orbit.m);
```
Les trois composantes de `base_pos` (bx, by, bz) sont toutes prises en compte — les objets à `base_pos.y != 0` ou `base_pos.z != 0` sont correctement transformés.
@ -305,13 +305,13 @@ La caméra reste à l'origine (+ translations clavier). L'effet visuel est celui
| Z / S | Caméra avance / recule (axe Z) |
| Q / D | Caméra gauche / droite (axe X) |
| A / E | Caméra haut / bas (axe Y) |
| + / − | Orbite vertical (anglex ±3°) |
| / / * | Orbite horizontal (angley ±3°) |
| 1 / 2 / 3 | Mode fil-de-fer / caché / solide |
| Flèche Haut / Bas | Orbite vertical (anglex ±3°) |
| Flèche Gauche / Droite | Orbite horizontal (angley ±3°) |
| F1 / F2 / F3 | Mode fil-de-fer / caché / solide |
| R | Reset caméra + angles |
| Esc | Quitter |
Les touches étendues (F1–F12, flèches…) retournent `0` depuis `getch()` ; le scan code suivant est consommé sans effet.
Les touches étendues (F1–F12, flèches…) retournent `0` depuis `getch()` ; le scan code suivant est alors consommé pour identifier la touche spéciale.
---

View file

@ -193,7 +193,7 @@ add_math_surface(uni, 0, 0, 0, int_to_f(120), int_to_f(120), 30, 30, COLOR6, 0,
---
## Orbite de l'observateur (`main.c`)
## Orbite et distance (`main.c`)
Les objets ont des positions de base fixes dans l'espace scène, définies par rapport au centre `(0, 0, 300)` :
@ -202,13 +202,13 @@ Les objets ont des positions de base fixes dans l'espace scène, définies par r
| Sphère (universe[0]) | (+60, 0, 0) |
| Cylindre (universe[1]) | (−60, 0, 0) |
Chaque frame, la matrice d'orbite `orbit = rotX(anglex) × rotY(angley)` est calculée et appliquée uniformément à chaque objet (transform 3D complet sur `base_pos`) :
Chaque frame, la matrice d'orbite `orbit = rotX(anglex) × rotY(angley)` est calculée et appliquée uniformément à chaque objet (transform 3D complet sur `base_pos`). La distance (initialement 300) peut être modifiée :
```c
obj->rot = orbit;
obj->pos.x = f_mul(bx, orbit.m[0][0]) + f_mul(by, orbit.m[1][0]) + f_mul(bz, orbit.m[2][0]);
obj->pos.y = f_mul(bx, orbit.m[0][1]) + f_mul(by, orbit.m[1][1]) + f_mul(bz, orbit.m[2][1]);
obj->pos.z = int_to_f(300) + f_mul(bx, orbit.m[0][2]) + f_mul(by, orbit.m[1][2]) + f_mul(bz, orbit.m[2][2]);
obj->pos.z = distance + f_mul(bx, orbit.m) + f_mul(by, orbit.m) + f_mul(bz, orbit.m);
```
Les trois composantes de `base_pos` (bx, by, bz) sont toutes prises en compte — les objets à `base_pos.y != 0` ou `base_pos.z != 0` sont correctement transformés.
@ -224,13 +224,13 @@ La caméra reste à l'origine (+ translations clavier). L'effet visuel est celui
| Z / S | Caméra avance / recule (axe Z) |
| Q / D | Caméra gauche / droite (axe X) |
| A / E | Caméra haut / bas (axe Y) |
| + / − | Orbite vertical (anglex ±3°) |
| / / * | Orbite horizontal (angley ±3°) |
| 1 / 2 / 3 | Mode fil-de-fer / caché / solide |
| Flèche Haut / Bas | Orbite vertical (anglex ±3°) |
| Flèche Gauche / Droite | Orbite horizontal (angley ±3°) |
| F1 / F2 / F3 | Mode fil-de-fer / caché / solide |
| R | Reset caméra + angles |
| Esc | Quitter |
Les touches étendues (F1–F12, flèches…) retournent `0` depuis `getch()` ; le scan code suivant est consommé sans effet.
Les touches étendues (F1–F12, flèches…) retournent `0` depuis `getch()` ; le scan code suivant est alors consommé pour identifier la touche spéciale.
---

View file

@ -5,11 +5,13 @@ int main(void) {
Object3D *sph, *cyl, *tmp_obj;
Camera cam;
Matrix3 rotX, rotY, orbit;
int special=0;
int anglex, angley, key, render, o;
fixed bx, by, bz;
fixed bx, by, bz, distance;
anglex = angley = key = 0;
render = MODE_SOLID;
distance = int_to_f(300);
init_engine_math();
@ -50,25 +52,38 @@ int main(void) {
while (key != 27) {
if (kbhit()) {
special = 0;
key = getch();
if (key == 0) {
getch(); /* touche étendue (F1-F12, flèches…) : consommer le scan code */
special = 1;
key = getch(); /* touche étendue (F1-F12, flèches…) : consommer le scan code */
switch (key) {
case 59: render = MODE_WIRE; break; /* F1 */
case 60: render = MODE_HIDDEN; break; /* F2 */
case 61: render = MODE_SOLID; break; /* F3 */
case 71: distance -= int_to_f(10); break; /* Home : Rapprocher le centre */
case 79: distance += int_to_f(10); break; /* End : Eloigner le centre */
case 72: anglex = ((anglex - 3) % 360 + 360) % 360; break; /* Flèche Haut */
case 80: anglex = (anglex + 3) % 360; break; /* Flèche Bas */
case 75: angley = ((angley - 3) % 360 + 360) % 360; break; /* Flèche Gauche */
case 77: angley = (angley + 3) % 360; break; /* Flèche Droite */
}
} else {
switch (key) {
case 'Z': case 'z': cam.pos.z += int_to_f(10); break;
case 'S': case 's': cam.pos.z -= int_to_f(10); break;
case 'Q': case 'q': cam.pos.x -= int_to_f(10); break;
case 'D': case 'd': cam.pos.x += int_to_f(10); break;
case 'A': case 'a': cam.pos.y -= int_to_f(10); break;
case 'E': case 'e': cam.pos.y += int_to_f(10); break;
case 'R': case 'r': cam.pos.x = cam.pos.y = cam.pos.z = 0; anglex = angley = 0; break;
case '+': anglex = (anglex + 3) % 360; break;
case '-': anglex = ((anglex - 3) % 360 + 360) % 360; break;
case '/': angley = (angley + 3) % 360; break;
case '*': angley = ((angley - 3) % 360 + 360) % 360; break;
case '1': render = MODE_WIRE; break;
case '2': render = MODE_HIDDEN; break;
case '3': render = MODE_SOLID; break;
case 'Z':
case 'z': cam.pos.z += int_to_f(10); break;
case 'S':
case 's': cam.pos.z -= int_to_f(10); break;
case 'Q':
case 'q': cam.pos.x -= int_to_f(10); break;
case 'D':
case 'd': cam.pos.x += int_to_f(10); break;
case 'A':
case 'a': cam.pos.y -= int_to_f(10); break;
case 'E':
case 'e': cam.pos.y += int_to_f(10); break;
case 'R':
case 'r': cam.pos.x = cam.pos.y = cam.pos.z = 0; anglex = angley = 0; distance = int_to_f(300); break;
}
}
}
@ -84,9 +99,9 @@ int main(void) {
by = obj->base_pos.y;
bz = obj->base_pos.z;
obj->rot = orbit;
obj->pos.x = f_mul(bx, orbit.m[0][0]) + f_mul(by, orbit.m[1][0]) + f_mul(bz, orbit.m[2][0]);
obj->pos.y = f_mul(bx, orbit.m[0][1]) + f_mul(by, orbit.m[1][1]) + f_mul(bz, orbit.m[2][1]);
obj->pos.z = int_to_f(300) + f_mul(bx, orbit.m[0][2]) + f_mul(by, orbit.m[1][2]) + f_mul(bz, orbit.m[2][2]);
obj->pos.x = f_mul(bx, orbit.m[0][0]) + f_mul(by, orbit.m[1][0]) + f_mul(bz, orbit.m[2][0]);
obj->pos.y = f_mul(bx, orbit.m[0][1]) + f_mul(by, orbit.m[1][1]) + f_mul(bz, orbit.m[2][1]);
obj->pos.z = distance + f_mul(bx, orbit.m[0][2]) + f_mul(by, orbit.m[1][2]) + f_mul(bz, orbit.m[2][2]);
}
clear_buffers(0);