TCH (statz) | #1, Főfasz (10466) |
2117 | #4f27 | ^ | Idézet | Wed, 26 Feb 2020 21:56:39 +01 |
94.21.*.* | *.pool.digikabel.hu |
Így lehet egy 3D-s pontot leképezni 2D-re (Related: https://en.wikipedia.org/wiki/3D_projection, http://eab.abime.net/showthread.php?t=101151):typedef struct { float x, y, z, thx, thy, thz; } Camera; typedef struct { float x, y; int beyond; } Point2D; typedef struct { float x, y, z; } Point3D; void TransformPoint3DToPoint2D(Point3D *p3D, Camera *C, Point2D *p2D) { float x, y, z, cx, cy, cz, sx, sy, sz, dx, dy, dz, ex, ey, ez, a; if ((p3D == NULL) || (C == NULL) || (p2D == NULL)) { return; } a = 90.0; x = p3D->x - c->x; y = p3D->y - c->y; z = p3D->z - c->z; ex = 0.0; ey = 0.0; ez = cos(a / 2) / sin(a / 2); cx = cos(C->thx); cy = cos(C->thy); cz = cos(C->thz); sx = sin(C->thx); sy = sin(C->thy); sz = sin(C->thz); dx = cy * (sz * y + cz * x) - sy * z; dy = sx * (cy * z + sy * (sz * y + cz * x)) + cx * (cz * y - sz * x); dz = cx * (cy * z + sy * (sz * y + cz * x)) - sx * (cz * y - sz * x); p2D->x = ((ez / dz) * dx) + ex; p2D->y = ((ez / dz) * dy) + ey; p2D->beyond = dz < 0.0; }Illetve így kéne, de amint lehet látni, az ex, ey és ez változók nincsenek feltöltve. Elméletileg ez lenne a célfelület a kamerához képest számítva, ami elméletileg ugye konstans, de fingom nincs, minek kéne lennie... Még túrom a netet. (Ja, amúgy ez még nincs optimalizálva sem.) Sz*rk: Az ex, ey esetünkben nulla, az ez pedig egy pozitív, de kicsi érték, még próbálgatom a dolgot. Sz*rk #2: Úgy néz ki az tkp. a távolság a kamera és a leképzendő pont között, de nem merek rá megesküdni. Matekból segg vagyok. Sz*rk #3: Tényleg az. Csak kell hozzá a "látószög". Ezért rühellem a matekot. Feloldod valamelyik ismeretlent egy egyenlettel, amiben van egy újabb ismeretlen... Mondjuk ezt be lehet lőni konstansra is; hát próba cseszernye. Ápdét: 90° a helyes megfejtés. Azaz az ez értéke tkp. 1.0. |