2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2, 3, 4, 5 ... 7  След.
 
 Приглашаю помочь и заняться интересным 2d 3d web построение
Сообщение08.10.2009, 18:43 


31/08/09
183
Короче у меня курсовая построение 2d 3d графиков,фигур и другого в веббраузере. Я сделал вот это http://my2d3d.narod.ru/ не могу найти формулы 3d, такие что бы я их мог использовать у себя в курсовой. Уже разок спрашивал на этом форуме про 3d ответили но в итоге ничего не получилось.
Глядет сайт лучше в Мозиле... Если кто нормально шарит в 3d пишите

 Профиль  
                  
 
 Re: Приглашаю помочь и заняться интересным 2d 3d web построение
Сообщение09.10.2009, 10:59 
Заслуженный участник
Аватара пользователя


18/05/06
13437
с Территории
Неплохо. Quite a something для курсовой, я бы сказал.
(Несмотря на очевидные ляпы, типа: отрисовка на чуть менее гладких функциях глючит, перетаскивание мышой просто неправильное, ещё что-то хотел сказать про выбор точек для делений шкалы. Whatever.)
Я бы вот эти мелочи починил для начала. А то ведь сделать 3d ничего не стоит.

 Профиль  
                  
 
 Re: Приглашаю помочь и заняться интересным 2d 3d web построение
Сообщение09.10.2009, 17:14 


31/08/09
183
Это я поченю, просто сейчас модульные контрольные.

Короче я уже 3-ий год не могу с 3-d разобраться, у кого только не спрашивал. Мне нужно для примера вот что-то типа вращения куба, например вот на сайте есть пример для explorer http://explorercanvas.googlecode.com/files/excanvas_r3.zip там в папке examples пример 2. Я хочу для начала сделать, что-то наподобие , но там реализовано через 3d сцены, я их не понимаю.
Если можете, пожалуйста, реализуй вращение обычной линии без всяких сцен, просто преобразованием координат из 3d + углы наклона относительно трех осей. Мне фактически нужен только этот пример, а дальше я могу сам.

 Профиль  
                  
 
 Re: Приглашаю помочь и заняться интересным 2d 3d web построение
Сообщение09.10.2009, 18:57 
Заслуженный участник


26/07/09
1559
Алматы
Цитата:
Если можете, пожалуйста, реализуй вращение обычной линии без всяких сцен, просто преобразованием координат из 3d + углы наклона относительно трех осей. Мне фактически нужен только этот пример, а дальше я могу сам.


А в чем проблема-то? Все вроде бы очень просто... Чтобы крутануть отрезок, достаточно крутануть его концы, и все! То есть вам достаточно научиться вращать точку! Если её мировые координаты суть компоненты вектора $p$, то для получения экранных координат (компонент $p'$) вам нужно просто умножить её слева на подходящую матрицу поворота (обозначим её $R(\rho)$, где $\rho=(\rho_x,\rho_y,\rho_z)$ -- радианные углы поворота вокруг соответствующих осей), возможно дополнив преобразование некоторым смещением на вектор $s$, т.е. $p'=s+R(\rho)p$.

Для рисования куба вам будет достаточно крутить 8 точек, а потом соединять их образы на экране отрезками.

Для справки, матрица $R(\rho)$ может быть определена как $R(\rho)=R_x(\rho_x)R_y(\rho_y)R_z(\rho_z)$, где $R_x(\rho)$, $R_y(\rho)$, и $R_z(\rho)$ -- матрицы поворота вокруг осей $x$, $y$ и $z$, соответственно.

$R_x(\rho)=\left(\begin{array}{ccc}1&0&0\\0&\cos\rho&\sin\rho\\0&-\sin\rho&\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)$

$R_z(\rho)=\left(\begin{array}{ccc}\cos\rho&\sin\rho&0\\-\sin\rho&\cos\rho&0\\0&0&1\end{array}\right)$

Матрицы вычисляются лишь при смене углов, а затем используются многократно для вращения точек. Элементарно. :)

Кстати, после таких преобразований ваша 3d-графика будет смотреться не очень хорошо. Это можно исправить добавив эффект перспективы. Все очень просто, когда вы получите экранные координаты, например $x$, $y$, $z$, просто умножьте каждую из них на $k/z$, где $k$ -- расстояние от экрана до сцены (можно подобрать экспериментально).

Потом подумайте об отсечении невидимых (экранированных) примитивов, освещении, и т.д. :)

-- Пт окт 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.
}



Примерно так. :)

 Профиль  
                  
 
 Re: Приглашаю помочь и заняться интересным 2d 3d web построение
Сообщение09.10.2009, 21:53 


31/08/09
183
А в декартовой системе координат можно это реализовать, дело в том, что мне уже ни раз говорили , что с полярными лучше не связываться, потому как постоянно придётся вычислять радиус и угл. А в декартовых только угл + сами координаты.
Дело ещё в том, что вроде всё просто, но реально не врубаю, может есть какой нормальный учедник.
Я в нете уже столько статей на эту тему прочитал , и учебник по Opengl Хилла смотрел , но не врубаю ...........

Может есть у кого либо прога на с++ или ещё на чём с 3d-линией?

 Профиль  
                  
 
 Re: Приглашаю помочь и заняться интересным 2d 3d web построение
Сообщение09.10.2009, 21:58 
Заслуженный участник
Аватара пользователя


18/05/06
13437
с Территории
Это и есть в декартовой. Врубать тут нечего. Матрицы множить умеете?

 Профиль  
                  
 
 Re: Приглашаю помочь и заняться интересным 2d 3d web построение
Сообщение09.10.2009, 22:45 


31/08/09
183
Если честно то нет ....

 Профиль  
                  
 
 Re: Приглашаю помочь и заняться интересным 2d 3d web построение
Сообщение09.10.2009, 22:50 
Заслуженный участник
Аватара пользователя


18/05/06
13437
с Территории
"Строки первой на столбцы второй." Прочтите эти слова дважды. А потом посмотрите в любой книге или в википедии, что это значит на самом деле.
Без умножения матриц ничего не получится. Ни в какой системе координат.

 Профиль  
                  
 
 Re: Приглашаю помочь и заняться интересным 2d 3d web построение
Сообщение10.10.2009, 06:14 
Заслуженный участник


26/07/09
1559
Алматы
2mycoding
Я же вам готовый пример привел (на псевдокоде), там уже матричное умножение вшито. Даете ему точку в 3d (Vertex->x, Vertex->y, Vertex->z), а получаете координаты точки на экране (числа Vertex->u, Vertex->v). Образом отрезка будет отрезок, поэтому, чтобы спроецировать отрезок, сначала проецируете его концы, а потом полученные на экране две точки соединяете линией. Для проверки проецирование с отрисовкой можете поместить в цикл и плавно менять углы, e.g. Angle->x += 0.05; Angle->y += 0.05. Приведенный мной псевдокод плох тем, что матрица преобразования вычисляется для каждой точки, а это непозволительное излишество.

Цитата:
может есть какой нормальный учедник.

Честно говоря, именно для этой задачи вполне сгодится школьный учебник по геометрии. Хотя наверное стоит что-нибудь посерьезнее подыскать, аналитическая геометрия, линейная алгебра, и т.д.

ИСН в сообщении #250523 писал(а):
Это и есть в декартовой. Врубать тут нечего. Матрицы множить умеете?
mycoding в сообщении #250539 писал(а):
Если честно то нет ....


Вам нужно просто все строки матрицы, рассматривая их как вектора, умножать скалярно на столбцы второй матрицы, получится набор чисел, которые будут компонентами новой матрицы. Со скалярным произведением проблем нет?

Формула применения матрицы, т.е. для вычисления $c=Ab,\ A\in\mathbb{R}^{3\times 3},\ b,c\in\mathbb{R}^3$ выглядит как $$c_i=\sum_{j=0}^2 A_{ij}b_j.$$

Тогда формула для $C=AB,\ A,B,C\in\mathbb{R}^{3\times 3}$ такова $$C_{ij}=\sum_{k=0}^2 A_{ik}B_{kj}.$$

Пример применения матрицы A к вектору b (псевдокод):
Код:
MatrixByVector(A, b)
{
    for(i=0; i<3; i++)
    {
        c[i] = 0;
        for(j=0; j<3; j++)
            c[i] += A[i][j] * b[j];
    }
    return c;
}


Пример умножения двух $3\times 3$ матриц A и B (псевдокод):
Код:
MatrixByMatrix(A, B)
{
    for(i=0; i<3; i++)
        for(j=0; j<3; j++)
        {
            C[i][j] = 0;
            for(k=0; k<3; k++)
                C[i][j] += A[i][k] * B[k][j];
        }
    return C;
}


N.B.: В последнем примере результат вообще говоря сильно зависит от порядка передаваемых аргументов.

 Профиль  
                  
 
 Re: Приглашаю помочь и заняться интересным 2d 3d web построение
Сообщение10.10.2009, 18:18 


31/08/09
183
Ладно, я ещё по разбираюсь, как получится что-нибудь путёвое напишу...

 Профиль  
                  
 
 Re: Приглашаю помочь и заняться интересным 2d 3d web построение
Сообщение18.10.2009, 18:31 


31/08/09
183
Наконец то разобрался вот пример , открывать в мозиле
http://moc-081.narod.ru/data/3d/1.html

 Профиль  
                  
 
 Надо множить матрицы.
Сообщение19.10.2009, 09:35 
Заслуженный участник
Аватара пользователя


18/05/06
13437
с Территории
mycoding, Вы всё хотите обмануть природу и не множить матрицы. (Само-то по себе здравое желание, лень - двигатель прогресса.) Но так не выйдет. Над этим люди уже думали. Это как с вечным дрыгателем. Сейчас у Вас оси вращения сами вращаются вместе со всей системой, а надо, чтобы не. Надо множить матрицы. Иначе никак. Прочтите эти слова дважды. Надо множить матрицы.

 Профиль  
                  
 
 Re: Приглашаю помочь и заняться интересным 2d 3d web построение
Сообщение19.10.2009, 09:43 


04/02/08
325
Буково
ИСН в сообщении #252920 писал(а):
Прочтите эти слова дважды. Надо множить матрицы.

+1
Для матриц 3х3 совсем несложно написать функцию перемножения на JavaScript. Тогда у вас пользователь, загрузив страницу один раз, сможет вращать изображение без подкачивания доп. данных.
В интернете полно уже готовых исходников на разных языках программирования для работы с матрицами. Поищите на google-code.

 Профиль  
                  
 
 Re: Приглашаю помочь и заняться интересным 2d 3d web построение
Сообщение19.10.2009, 15:13 


31/08/09
183
вот получился куб
http://moc-081.narod.ru/data/3d/2.html

А про матрицы, можете пожалуйста ещё раз рассказать а то не понял...
И 2 вопроса
1 - а как сделать чтобы невидимые грани не показывались?
2 - я хочу на каждую сторону куба прицепить картинку , как это сделать?

 Профиль  
                  
 
 Re: Приглашаю помочь и заняться интересным 2d 3d web построение
Сообщение19.10.2009, 16:12 
Заслуженный участник
Аватара пользователя


18/05/06
13437
с Территории
Значит, так.
1. Надо всё время помнить матрицу поворота (трижды три - 9 чисел, стало быть).
2. При каждом нажатии "Повернуть вокруг чего-то" эта матрица умножается на другую матрицу, для каждой оси свою (их тут уже кто-то приводил).
3. Чтобы отобразить, грубо говоря, точку - надо вектор её координат умножить на эту матрицу. (Грубо - потому что Вы отображаете вообще не точки, а линии. Ну, это просто.)
Как умножать матрицы, посмотрите где угодно. Это примерно как прыгать с парашютом: страшно, но реального риска почти нет, зато потом круто.

На Ваши вопросы ответы такие:
1. Надо множить матрицы.
2. Надо множить матрицы.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 91 ]  На страницу 1, 2, 3, 4, 5 ... 7  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group