Страница 1 из 1

3D куб на LCD

Добавлено: Пт окт 25, 2013 18:49:41
drakon
увидел видео вращающегося 3D куба на дисплее:
http://www.youtube.com/watch?v=OlgqC8HLBTA.
хочу такое же себе сделать, нашел только 2 примера, ни один из них корректно не заработал.
если кто-то такое писал, поделитесь пж кодом.

Re: 3D куб на LCD

Добавлено: Пт окт 25, 2013 21:04:04
Аlex
Интересно, а для чего такое себе делать ? :shock: Применение этому назовите. :roll:
Ладно, чисто для обучения и доказательства себе, что можешь сделать. Но в этом случае не просят готовый код, а пытаются сами его написать.

Re: 3D куб на LCD

Добавлено: Пт окт 25, 2013 21:25:22
drakon
Аlex, какой толк с вашего сообщения? это будет заставка для одного устройства. еще понять основные принципы 3D графики, только не сразу с сухой теории.

Re: 3D куб на LCD

Добавлено: Пт окт 25, 2013 22:39:47
ILYAUL
Это не 3D графика. Это псевдо. А проще обман зрения. Нарисуйте на листочке миллиметровке куб. Затем ещё один с поворотом в 1mm и т.д
И занесите точки отсчётов в таблицу. Затем Вам просто надо соединить линиями Ваши точки

Re: 3D куб на LCD

Добавлено: Сб окт 26, 2013 21:41:54
Аlex
drakon писал(а):Аlex, какой толк с вашего сообщения?
А от Вашего есть толк ? Или все сообщения должны быть такими, какими Вы их хотите видеть ?
Может Вам тут обязаны чем-то, и я что-то пропустил ? :roll:

Re: 3D куб на LCD

Добавлено: Вс окт 27, 2013 09:20:24
SergKT
Теория таких рисунков такова.
Это проекция 3-ех мерного предмета на плоскость.

1. Задай координаты точек (углов) в 3-ех мерном пространстве.
2. Направь "ось зрения" на точку в том-же пространстве (внутри предмета).
3. Установи координату "глаз" на "оси зрения" в том-же пространстве (откуда смотреть на предмет).
4. Установи плоскость "проекция" перпендикулярно "оси зрения", в том-же пространстве. (обычно между точкой "глаз" и предметом).
5. Проведи прямые от каждой точки до точки "глаз".
6. По учебнику геометрии 7-8 класса вычисли координаты пересечения этих линий и плоскости "проекции".
7. Установи на плоскости "проекция" 2-ух мерную систему координат и переведи полученные точки в эту систему.
8. Соедини координаты точек линиями.

Выглядит сложно, но когда напишешь формулы и алгоритмы, они упростятся, все очень просто и гибко.
Можно будет вращать предмет в разные стороны, менять "ось зрения", приближать или отдалять предмет.

Re: 3D куб на LCD

Добавлено: Пн окт 28, 2013 07:48:31
Engineer_Keen
Когда-то давно, еще на delphi пытался рисовать 3D куб, безо всяких OpenGL-ов, очень помогла эта статья.

Re: 3D куб на LCD

Добавлено: Пн окт 28, 2013 10:32:13
SergKT
Это если знать, как этими матрицами пользоваться, в частности умножать.
И если матрицы верны.
Когда я учился, в учебнике матрицы были с ошибками, неделю по ним пытался алмаз/куб крутить, пока не плюнул и просто геометрией формулы не составил. А когда их написал и упростил, то они стали очень похожи на эти матрицы, и ошибки в них проявились.

Кстати, где-то есть еще и удаление невидимых граней, тоже не очень сложно.
И это задание входит в тот же комплект контрольных по компьютерной графике.

Re: 3D куб на LCD

Добавлено: Пн окт 28, 2013 12:25:47
Аlex
Вот хороший примерчик - http://forum.pascalnet.ru/index.php?showtopic=4526
У меня по нему получилось нарисовать куб с поворотом по XYZ.

Re: 3D куб на LCD

Добавлено: Пн окт 28, 2013 13:19:11
Аlex
Для тех, кто совсем в танке :)

Спойлер

Код: Выделить всё

/**************************************************************************/
#define PI      3.1415927

typedef struct{
    short x;
    short y;
}P_Pos;
/**************************************************************************/
P_Pos Get_Point(short p_num, int zoom, double Xan, double Yan, double Zan){
short   Yt, Xt, Zt;
short   X, Y, Z;
short   cube[][3]={-1,-1,-1,-1,-1,1,-1,1,-1,-1,1,1,1,-1,-1,1,-1,1,1,1,-1,1,1,1};
P_Pos   ret;

X=cube[p_num][0]*zoom;
Y=cube[p_num][1]*zoom;
Z=cube[p_num][2]*zoom;
Xan *= PI/180;          // Переводим градусы в радианы
Yan *= PI/180;          //
Zan *= PI/180;          //

Yt = Y * cos(Xan) - Z * sin(Xan);
Zt = Y * sin(Xan) + Z * cos(Xan);
Y = Yt;
Z = Zt;
Xt = X * cos(Yan) - Z * sin(Yan);
Zt = X * sin(Yan) + Z * cos(Yan);
X = Xt;
Z = Zt;
Xt = X * cos(Zan) - Y * sin(Zan);
Yt = X * sin(Zan) + Y * cos(Zan);
X = Xt;
Y = Yt;

ret.x = X;
ret.y = Y;
return ret;
}
/**************************************************************************/
void Draw_Cube(P_Pos *p_arr){
Line(p_arr[0].x, p_arr[0].y, p_arr[1].x, p_arr[1].y);
Line(p_arr[1].x, p_arr[1].y, p_arr[3].x, p_arr[3].y);
Line(p_arr[3].x, p_arr[3].y, p_arr[2].x, p_arr[2].y);
Line(p_arr[2].x, p_arr[2].y, p_arr[0].x, p_arr[0].y);
Line(p_arr[4].x, p_arr[4].y, p_arr[5].x, p_arr[5].y);
Line(p_arr[5].x, p_arr[5].y, p_arr[7].x, p_arr[7].y);
Line(p_arr[7].x, p_arr[7].y, p_arr[6].x, p_arr[6].y);
Line(p_arr[6].x, p_arr[6].y, p_arr[4].x, p_arr[4].y);
Line(p_arr[1].x, p_arr[1].y, p_arr[5].x, p_arr[5].y);
Line(p_arr[0].x, p_arr[0].y, p_arr[4].x, p_arr[4].y);
Line(p_arr[3].x, p_arr[3].y, p_arr[7].x, p_arr[7].y);
Line(p_arr[2].x, p_arr[2].y, p_arr[6].x, p_arr[6].y);
}
/**************************************************************************/

Вращаем по всем 3-ём координатам:
Спойлер

Код: Выделить всё

/**************************************************************************/
void Task_1(void){
static short    zoom;
static short    i, grad;
static P_Pos    pos[8], pos_prev[8];
static char     zoom_op=0;

for(i=0;i<8;i++)    pos_prev[i].x=pos_prev[i].y=0;

zoom = 40;
grad=15;

while(1){
OS_Delay(20 Ms);

/****************************************************************/
grad+=1;                // Увеличиваем угол поворота
if(grad>360) grad=0;    //
/******* Узнаём координаты 8-ми точек, учитывая поворот **********/
for(i=0;i<8;i++){
    pos[i]=Get_Point(i , zoom, grad, grad, grad);
    pos[i].x +=(320/2);
    pos[i].y +=(240/2);
}
/****************************************************************/
SetColor(RGB565CONVERT(0,0,0));         // Закрашиваем куб чёрным цветом
Draw_Cube(pos_prev);                    // по старым координатам
SetColor(RGB565CONVERT(0,250,0));       // Рисуем новый куб зелёным цветом
Draw_Cube(pos);                         //
for(i=0;i<8;i++)    pos_prev[i]=pos[i]; // Сохраняем текущие координаты
/****************************************************************/
}
}
/**************************************************************************/
Видео - http://yadi.sk/d/zmnM-JblBhzoJ

Вращение с изменением размера:
Спойлер

Код: Выделить всё

/**************************************************************************/
void Task_1(void){
static short    zoom;
static short    i, grad;
static P_Pos    pos[8], pos_prev[8];
static char     zoom_op=0;

for(i=0;i<8;i++)    pos_prev[i].x=pos_prev[i].y=0;

zoom = 40;
grad=15;

while(1){
OS_Delay(20 Ms);

/****************************************************************/
grad+=1;                // Увеличиваем угол поворота
if(grad>360) grad=0;    //
/****************************************************************/
if(zoom_op){
    if(--zoom<10)   zoom_op=0;
}
else{
    if(++zoom>60)   zoom_op=1;
}
/******* Узнаём координаты 8-ми точек, учитывая поворот **********/
for(i=0;i<8;i++){
    pos[i]=Get_Point(i , zoom, grad, grad, grad);
    pos[i].x +=(320/2);
    pos[i].y +=(240/2);
}
/****************************************************************/
SetColor(RGB565CONVERT(0,0,0));         // Закрашиваем куб чёрным цветом
Draw_Cube(pos_prev);                    // по старым координатам
SetColor(RGB565CONVERT(0,250,0));       // Рисуем новый куб зелёным цветом
Draw_Cube(pos);                         //
for(i=0;i<8;i++)    pos_prev[i]=pos[i]; // Сохраняем текущие координаты
/****************************************************************/
}
}
/**************************************************************************/
Видео - http://yadi.sk/d/eBgz0D2CBi24A

А стоило то всего лишь часик посидеть в гугле и часик поэксперементировать :)

Re: 3D куб на LCD

Добавлено: Вт окт 29, 2013 11:17:45
drakon
всем спасибо. в воскресенье кое-что нашел, получилось: https://www.youtube.com/watch?v=p2QJFnASX0g.

Re: 3D куб на LCD

Добавлено: Вт окт 29, 2013 11:21:35
Аlex
Отлично.
Можете даже поделиться исходником, вдруг кому пригодится :)

Re: 3D куб на LCD

Добавлено: Вт окт 29, 2013 11:29:55
drakon
вот еще интересная ссылка c теорией: pmg.org.ru/basic3d.
я нашел статью с названием "Софт рендер"