3D куб на LCD
3D куб на LCD
увидел видео вращающегося 3D куба на дисплее:
http://www.youtube.com/watch?v=OlgqC8HLBTA.
хочу такое же себе сделать, нашел только 2 примера, ни один из них корректно не заработал.
если кто-то такое писал, поделитесь пж кодом.
http://www.youtube.com/watch?v=OlgqC8HLBTA.
хочу такое же себе сделать, нашел только 2 примера, ни один из них корректно не заработал.
если кто-то такое писал, поделитесь пж кодом.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: 3D куб на LCD
Интересно, а для чего такое себе делать ?
Применение этому назовите.
Ладно, чисто для обучения и доказательства себе, что можешь сделать. Но в этом случае не просят готовый код, а пытаются сами его написать.
Ладно, чисто для обучения и доказательства себе, что можешь сделать. Но в этом случае не просят готовый код, а пытаются сами его написать.
Re: 3D куб на LCD
Аlex, какой толк с вашего сообщения? это будет заставка для одного устройства. еще понять основные принципы 3D графики, только не сразу с сухой теории.
Re: 3D куб на LCD
Это не 3D графика. Это псевдо. А проще обман зрения. Нарисуйте на листочке миллиметровке куб. Затем ещё один с поворотом в 1mm и т.д
И занесите точки отсчётов в таблицу. Затем Вам просто надо соединить линиями Ваши точки
И занесите точки отсчётов в таблицу. Затем Вам просто надо соединить линиями Ваши точки
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: 3D куб на LCD
А от Вашего есть толк ? Или все сообщения должны быть такими, какими Вы их хотите видеть ?drakon писал(а):Аlex, какой толк с вашего сообщения?
Может Вам тут обязаны чем-то, и я что-то пропустил ?
Re: 3D куб на LCD
Теория таких рисунков такова.
Это проекция 3-ех мерного предмета на плоскость.
1. Задай координаты точек (углов) в 3-ех мерном пространстве.
2. Направь "ось зрения" на точку в том-же пространстве (внутри предмета).
3. Установи координату "глаз" на "оси зрения" в том-же пространстве (откуда смотреть на предмет).
4. Установи плоскость "проекция" перпендикулярно "оси зрения", в том-же пространстве. (обычно между точкой "глаз" и предметом).
5. Проведи прямые от каждой точки до точки "глаз".
6. По учебнику геометрии 7-8 класса вычисли координаты пересечения этих линий и плоскости "проекции".
7. Установи на плоскости "проекция" 2-ух мерную систему координат и переведи полученные точки в эту систему.
8. Соедини координаты точек линиями.
Выглядит сложно, но когда напишешь формулы и алгоритмы, они упростятся, все очень просто и гибко.
Можно будет вращать предмет в разные стороны, менять "ось зрения", приближать или отдалять предмет.
Это проекция 3-ех мерного предмета на плоскость.
1. Задай координаты точек (углов) в 3-ех мерном пространстве.
2. Направь "ось зрения" на точку в том-же пространстве (внутри предмета).
3. Установи координату "глаз" на "оси зрения" в том-же пространстве (откуда смотреть на предмет).
4. Установи плоскость "проекция" перпендикулярно "оси зрения", в том-же пространстве. (обычно между точкой "глаз" и предметом).
5. Проведи прямые от каждой точки до точки "глаз".
6. По учебнику геометрии 7-8 класса вычисли координаты пересечения этих линий и плоскости "проекции".
7. Установи на плоскости "проекция" 2-ух мерную систему координат и переведи полученные точки в эту систему.
8. Соедини координаты точек линиями.
Выглядит сложно, но когда напишешь формулы и алгоритмы, они упростятся, все очень просто и гибко.
Можно будет вращать предмет в разные стороны, менять "ось зрения", приближать или отдалять предмет.
- Engineer_Keen
- Друг Кота
- Сообщения: 3868
- Зарегистрирован: Пт янв 29, 2010 10:27:40
- Откуда: Москва
Re: 3D куб на LCD
Когда-то давно, еще на delphi пытался рисовать 3D куб, безо всяких OpenGL-ов, очень помогла эта статья.
Re: 3D куб на LCD
Это если знать, как этими матрицами пользоваться, в частности умножать.
И если матрицы верны.
Когда я учился, в учебнике матрицы были с ошибками, неделю по ним пытался алмаз/куб крутить, пока не плюнул и просто геометрией формулы не составил. А когда их написал и упростил, то они стали очень похожи на эти матрицы, и ошибки в них проявились.
Кстати, где-то есть еще и удаление невидимых граней, тоже не очень сложно.
И это задание входит в тот же комплект контрольных по компьютерной графике.
И если матрицы верны.
Когда я учился, в учебнике матрицы были с ошибками, неделю по ним пытался алмаз/куб крутить, пока не плюнул и просто геометрией формулы не составил. А когда их написал и упростил, то они стали очень похожи на эти матрицы, и ошибки в них проявились.
Кстати, где-то есть еще и удаление невидимых граней, тоже не очень сложно.
И это задание входит в тот же комплект контрольных по компьютерной графике.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: 3D куб на LCD
Вот хороший примерчик - http://forum.pascalnet.ru/index.php?showtopic=4526
У меня по нему получилось нарисовать куб с поворотом по XYZ.
У меня по нему получилось нарисовать куб с поворотом по XYZ.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: 3D куб на LCD
Для тех, кто совсем в танке
Вращаем по всем 3-ём координатам:Видео - http://yadi.sk/d/zmnM-JblBhzoJ
Вращение с изменением размера:Видео - http://yadi.sk/d/eBgz0D2CBi24A
А стоило то всего лишь часик посидеть в гугле и часик поэксперементировать
Спойлер
Код: Выделить всё
/**************************************************************************/
#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]; // Сохраняем текущие координаты
/****************************************************************/
}
}
/**************************************************************************/
Вращение с изменением размера:
Спойлер
Код: Выделить всё
/**************************************************************************/
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]; // Сохраняем текущие координаты
/****************************************************************/
}
}
/**************************************************************************/
А стоило то всего лишь часик посидеть в гугле и часик поэксперементировать
Re: 3D куб на LCD
всем спасибо. в воскресенье кое-что нашел, получилось: https://www.youtube.com/watch?v=p2QJFnASX0g.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: 3D куб на LCD
Отлично.
Можете даже поделиться исходником, вдруг кому пригодится
Можете даже поделиться исходником, вдруг кому пригодится
Re: 3D куб на LCD
вот еще интересная ссылка c теорией: pmg.org.ru/basic3d.
я нашел статью с названием "Софт рендер"
я нашел статью с названием "Софт рендер"