Цитата:
Если можете, пожалуйста, реализуй вращение обычной линии без всяких сцен, просто преобразованием координат из 3d + углы наклона относительно трех осей. Мне фактически нужен только этот пример, а дальше я могу сам.
А в чем проблема-то? Все вроде бы очень просто... Чтобы крутануть отрезок, достаточно крутануть его концы, и все! То есть вам достаточно научиться вращать точку! Если её мировые координаты суть компоненты вектора
![$p$ $p$](https://dxdy-03.korotkov.co.uk/f/2/e/c/2ec6e630f199f589a2402fdf3e0289d582.png)
, то для получения экранных координат (компонент
![$p'$ $p'$](https://dxdy-01.korotkov.co.uk/f/4/a/e/4ae3393b40dfbbbc0932cf55cbc55bc382.png)
) вам нужно просто умножить её слева на подходящую матрицу поворота (обозначим её
![$R(\rho)$ $R(\rho)$](https://dxdy-02.korotkov.co.uk/f/d/0/3/d0338feccb127a761cbe2a11eb29369282.png)
, где
![$\rho=(\rho_x,\rho_y,\rho_z)$ $\rho=(\rho_x,\rho_y,\rho_z)$](https://dxdy-04.korotkov.co.uk/f/3/6/3/363dc14efd4c8969e23a2b4959c6fd2c82.png)
-- радианные углы поворота вокруг соответствующих осей), возможно дополнив преобразование некоторым смещением на вектор
![$s$ $s$](https://dxdy-03.korotkov.co.uk/f/6/f/9/6f9bad7347b91ceebebd3ad7e6f6f2d182.png)
, т.е.
![$p'=s+R(\rho)p$ $p'=s+R(\rho)p$](https://dxdy-04.korotkov.co.uk/f/f/c/0/fc0991d2462a026af0cc1d07c252305e82.png)
.
Для рисования куба вам будет достаточно крутить 8 точек, а потом соединять их образы на экране отрезками.
Для справки, матрица
![$R(\rho)$ $R(\rho)$](https://dxdy-02.korotkov.co.uk/f/d/0/3/d0338feccb127a761cbe2a11eb29369282.png)
может быть определена как
![$R(\rho)=R_x(\rho_x)R_y(\rho_y)R_z(\rho_z)$ $R(\rho)=R_x(\rho_x)R_y(\rho_y)R_z(\rho_z)$](https://dxdy-02.korotkov.co.uk/f/9/b/4/9b4a646a0e5431c3f8d50bbf5aad9e4682.png)
, где
![$R_x(\rho)$ $R_x(\rho)$](https://dxdy-02.korotkov.co.uk/f/9/3/7/937fcf62fc67fae54f18758e987fd72082.png)
,
![$R_y(\rho)$ $R_y(\rho)$](https://dxdy-01.korotkov.co.uk/f/4/6/3/463391424f9b05f2668f827ac1a22bb082.png)
, и
![$R_z(\rho)$ $R_z(\rho)$](https://dxdy-04.korotkov.co.uk/f/b/8/5/b85dbd7b5ed0d0aef08aeafb4e104b4d82.png)
-- матрицы поворота вокруг осей
![$x$ $x$](https://dxdy-04.korotkov.co.uk/f/3/3/2/332cc365a4987aacce0ead01b8bdcc0b82.png)
,
![$y$ $y$](https://dxdy-02.korotkov.co.uk/f/d/e/c/deceeaf6940a8c7a5a02373728002b0f82.png)
и
![$z$ $z$](https://dxdy-04.korotkov.co.uk/f/f/9/3/f93ce33e511096ed626b4719d50f17d282.png)
, соответственно.
![$R_x(\rho)=\left(\begin{array}{ccc}1&0&0\\0&\cos\rho&\sin\rho\\0&-\sin\rho&\cos\rho\end{array}\right)$ $R_x(\rho)=\left(\begin{array}{ccc}1&0&0\\0&\cos\rho&\sin\rho\\0&-\sin\rho&\cos\rho\end{array}\right)$](https://dxdy-04.korotkov.co.uk/f/7/1/d/71d1b53d65987a6a1b4df4ace8b5d97b82.png)
![$R_y(\rho)=\left(\begin{array}{ccc}\cos\rho&0&-\sin\rho\\0&1&0\\\sin\rho&0&\cos\rho\end{array}\right)$ $R_y(\rho)=\left(\begin{array}{ccc}\cos\rho&0&-\sin\rho\\0&1&0\\\sin\rho&0&\cos\rho\end{array}\right)$](https://dxdy-01.korotkov.co.uk/f/4/8/0/480d3799dcd8bdbeca125d4a4869567282.png)
![$R_z(\rho)=\left(\begin{array}{ccc}\cos\rho&\sin\rho&0\\-\sin\rho&\cos\rho&0\\0&0&1\end{array}\right)$ $R_z(\rho)=\left(\begin{array}{ccc}\cos\rho&\sin\rho&0\\-\sin\rho&\cos\rho&0\\0&0&1\end{array}\right)$](https://dxdy-03.korotkov.co.uk/f/a/c/2/ac22c450cf9326f4123b478efd7b479782.png)
Матрицы вычисляются лишь при смене углов, а затем используются многократно для вращения точек. Элементарно.
![Smile :)](./images/smilies/icon_smile.gif)
Кстати, после таких преобразований ваша 3d-графика будет смотреться не очень хорошо. Это можно исправить добавив эффект перспективы. Все очень просто, когда вы получите экранные координаты, например
![$x$ $x$](https://dxdy-04.korotkov.co.uk/f/3/3/2/332cc365a4987aacce0ead01b8bdcc0b82.png)
,
![$y$ $y$](https://dxdy-02.korotkov.co.uk/f/d/e/c/deceeaf6940a8c7a5a02373728002b0f82.png)
,
![$z$ $z$](https://dxdy-04.korotkov.co.uk/f/f/9/3/f93ce33e511096ed626b4719d50f17d282.png)
, просто умножьте каждую из них на
![$k/z$ $k/z$](https://dxdy-04.korotkov.co.uk/f/3/5/c/35c8490b8a96fb7af43296bf0aa4437582.png)
, где
![$k$ $k$](https://dxdy-03.korotkov.co.uk/f/6/3/b/63bb9849783d01d91403bc9a5fea12a282.png)
-- расстояние от экрана до сцены (можно подобрать экспериментально).
Потом подумайте об отсечении невидимых (экранированных) примитивов, освещении, и т.д.
-- Пт окт 09, 2009 22:32:21 --Перед тем, как честно и аккуратно реализовать необходимые операции линейной алгебры вы можете запрототипировать проецирование, что позволит поиграться с 3d уже через пару минут кодинга.
Псевдокод (здесь не учитывается трансляция, зато добавлен параметр, управляющий масштабированием, позволяющим хорошо разглядеть сцену):
Код:
Project(Vertex, Angle, Scale)
{
// Introduce short aliases.
sinx = sin(Angle->x);
siny = sin(Angle->y);
sinz = sin(Angle->z);
cosx = cos(Angle->x);
cosy = cos(Angle->y);
cosz = cos(Angle->z);
x = Vertex->x;
y = Vertex->y;
z = Vertex->z;
// Rotate it!
yx = y*cosx + z*sinx;
zx = z*cosx - y*sinx;
xy = x*cosy + zx*siny;
zy = zx*cosy - x*siny;
xz = xy*cosz + yx*sinz;
yz = yx*cosz - xy*sinz;
// Final step.
Vertex->u = Canvas->Width/2+xz*Scale;
Vertex->v = Canvas->Height/2+yz*Scale;
// Now we have the desired point at (u,v) on the screen.
}
Примерно так.
![Smile :)](./images/smilies/icon_smile.gif)