3D куб на LCD

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

3D куб на LCD

Сообщение drakon »

увидел видео вращающегося 3D куба на дисплее:
http://www.youtube.com/watch?v=OlgqC8HLBTA.
хочу такое же себе сделать, нашел только 2 примера, ни один из них корректно не заработал.
если кто-то такое писал, поделитесь пж кодом.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: 3D куб на LCD

Сообщение Аlex »

Интересно, а для чего такое себе делать ? :shock: Применение этому назовите. :roll:
Ладно, чисто для обучения и доказательства себе, что можешь сделать. Но в этом случае не просят готовый код, а пытаются сами его написать.
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Re: 3D куб на LCD

Сообщение drakon »

Аlex, какой толк с вашего сообщения? это будет заставка для одного устройства. еще понять основные принципы 3D графики, только не сразу с сухой теории.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: 3D куб на LCD

Сообщение ILYAUL »

Это не 3D графика. Это псевдо. А проще обман зрения. Нарисуйте на листочке миллиметровке куб. Затем ещё один с поворотом в 1mm и т.д
И занесите точки отсчётов в таблицу. Затем Вам просто надо соединить линиями Ваши точки
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: 3D куб на LCD

Сообщение Аlex »

drakon писал(а):Аlex, какой толк с вашего сообщения?
А от Вашего есть толк ? Или все сообщения должны быть такими, какими Вы их хотите видеть ?
Может Вам тут обязаны чем-то, и я что-то пропустил ? :roll:
SergKT
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Сб сен 28, 2013 09:22:38

Re: 3D куб на LCD

Сообщение SergKT »

Теория таких рисунков такова.
Это проекция 3-ех мерного предмета на плоскость.

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

Выглядит сложно, но когда напишешь формулы и алгоритмы, они упростятся, все очень просто и гибко.
Можно будет вращать предмет в разные стороны, менять "ось зрения", приближать или отдалять предмет.
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3868
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: 3D куб на LCD

Сообщение Engineer_Keen »

Когда-то давно, еще на delphi пытался рисовать 3D куб, безо всяких OpenGL-ов, очень помогла эта статья.
SergKT
Первый раз сказал Мяу!
Сообщения: 20
Зарегистрирован: Сб сен 28, 2013 09:22:38

Re: 3D куб на LCD

Сообщение SergKT »

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

Кстати, где-то есть еще и удаление невидимых граней, тоже не очень сложно.
И это задание входит в тот же комплект контрольных по компьютерной графике.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: 3D куб на LCD

Сообщение Аlex »

Вот хороший примерчик - http://forum.pascalnet.ru/index.php?showtopic=4526
У меня по нему получилось нарисовать куб с поворотом по XYZ.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: 3D куб на LCD

Сообщение А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

А стоило то всего лишь часик посидеть в гугле и часик поэксперементировать :)
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Re: 3D куб на LCD

Сообщение drakon »

всем спасибо. в воскресенье кое-что нашел, получилось: https://www.youtube.com/watch?v=p2QJFnASX0g.
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: 3D куб на LCD

Сообщение Аlex »

Отлично.
Можете даже поделиться исходником, вдруг кому пригодится :)
Аватара пользователя
drakon
Грызет канифоль
Сообщения: 271
Зарегистрирован: Вт авг 09, 2011 15:01:44
Откуда: Харьков

Re: 3D куб на LCD

Сообщение drakon »

вот еще интересная ссылка c теорией: pmg.org.ru/basic3d.
я нашел статью с названием "Софт рендер"
Ответить

Вернуться в «Разные вопросы по МК»