|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Vovanius Uryvaeff 2:5020/400 25 Apr 2002 13:57:49 To : Evgeniy Jirnov Subject : Помогите pls... -------------------------------------------------------------------------------- Wed Apr 24 2002 20:48, Evgeniy Jirnov wrote to All: EJ> Мир твоему дому, All. EJ> Сабж, а то я с математикой и векторами не очень дружу: есть квадратный EJ> рисунок размером NxN, как нарисовать 3-х мерный куб(6-ти гранный), каждая EJ> сторона которого будет покрыта этим рисунком? Причем длина/высота/ширина EJ> куба - совпадает с картинкой - N. EJ> В общем-то мне надо узнать как одну сторону(повернутую на XAngle,YAngle EJ> и/или ZAngle) нарисовать с текстурой, а с остальными я уж сам как-нибудь. Ээээ... занесло тебя браток.... ну ладно, поможем.. пусть наш куб располагается центром в точке например (0,0,d) имеет размер 2x2x2 (по одному в каждую сторону координат) повернут сначала вокруг оси X, потом Y, потом Z. отгда координаты каждой вершины можно вычислить так: x' = a | y' = b*cos(XAngle)-c*sin(XAngle) | поворот вокруг X z' = b*sin(XAngle)+c*cos(XAngle) | x" = x'*cos(YAngle)-z'*sin(YAngle) | y" = y' | поворот вокруг Y z" = x'*sin(YAngle)+z'*cos(YAngle) | x = x"*cos(ZAngle)-y"*sin(ZAngle) | y = x"*sin(ZAngle)+y"*sin(ZAngle) | поворот вокруг Z z = z" где abc определяют помер вершины: (-1,1,1) +-----+ (1,1,1) /| /| (-1,-1,1) +-----+ |(1,-1,1) (-1,1,-1) | +---|-+ (1,1,-1) |/ |/ (-1,-1,-1) +-----+ (1,-1,-1) отсюда находим x0,y0,z0,x1,y1,z1,x2,y2,z2 для дальнейших вычислений берем одну грань, например переднюю выбираем точки так: t2 +-----+ | | | | t0 +-----+ t1 и считаем x0 = x(t0), y0 = y(t0),z0 = z(t0) x1 = (x(t1)-x0)/N, y1 = (y(t1)-y0)/N, z1 = (z(t1)-z0)/N x2 = (x(t2)-x0)/N, y1 = (y(t2)-y0)/N, z1 = (z(t2)-z0)/N угол твоей картинки в пространстве находится в точке (x0,y0,z0), а картинка располагается так что пикселы по х лежат вдоль вектора (x1,y1,z1), а по y - (x2,y2,z2). тогда произвольный пиксел будет лежать в пространстве в точке: x(i,j) = x0+i*x1+j*x2 y(i,j) = y0+i*y1+j*y2 z(i,j) = z0+i*z1+j*z2, где i,j - координаты в матрице картинки x и y соответственно. теперь спроэцируем это все на экран. пусть мы смотрим из точки 0,0,0 в сторону оси z координаты точки x,y,z на экране будут Xscr = x*f/z Yscr = y*f/z, f - фокусное расстояние - от него зависит размер изображения на экране (подобрать по вкусу - обычно f~z0) таким образом мы можем наставить точек на экране соответствующих этой плоскости. Красивее сделать конечно все это через матрицы 4x4 но для этого случая с учетом твоего отношения к ним можно так. ...сижу тут, никого не трогаю, примус починяю... --- ifmail v.2.15dev5 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/166798fffae53.html, оценка из 5, голосов 10
|