| TCH (statz) | ![]() #1, Főfasz (10579) |
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. |