Перейти к содержанию
    

Помогите подключить библиотеку

Нарыл на просторах вот такую простую 3D библиотеку для STM32. Хотя она, в общем-то платформонезависимая, но автор запускал ее на STM32. Вот отличное видео 

 

 

Как подключить библиотеку, я думаю, разберусь, но вот что меня ввело в ступор, так это файл, заявленный как "утилита для импорта модели". Вот ссылка на нее, внутри код, на питоне что ли....   https://github.com/FabioRM/dsp3D/blob/master/utils/io_export_dsp3D.py

Во что скормить этот файл, чтобы получить модельку?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, xvr said:

Судя по коду это не отдельная утилита а плагин к чему то.

Вот и я об этом. Но этот вопрос уже отпал, ибо моя задача простая и будет заключаться в рисовании примитивов в процессе работы, без загрузки.

Разбираюсь с собственно библиотекой.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Черт.... помогите понять задумку автора библиотеки.

С режимом точечной визуализации все понятно:

numVert = dsp3dModel[0];

	for(i = 0; i < numVert; i++)
	{
		vertex[0] = dsp3dModel[2 + i * 6 + 0];
		vertex[1] = dsp3dModel[2 + i * 6 + 1];
		vertex[2] = dsp3dModel[2 + i * 6 + 2];

		dsp3D_projectVertex(vertex, coord);

		dsp3D_drawPoint((int32_t)coord[0], (int32_t)coord[1], LCD_COLOR_WHITE);
	}

dsp3dModel - массив, в который записывается модель.

dsp3dModel[0] - количество точек,  dsp3dModel[2,3,4] - координаты первой точки, dsp3dModel[8,9,10] - координаты второй точки и так далее....

 

А вот с режимом WireFrame уже хитрости....

 

float32_t vertex_a[4];
	float32_t vertex_b[4];
	float32_t vertex_c[4];

numVert = dsp3dModel[0];
	numFaces = dsp3dModel[1];

	for(i = 0; i < numFaces; i++)
	{
		a = dsp3dModel[2 + numVert * 6 + i * 6 + 0];
		b = dsp3dModel[2 + numVert * 6 + i * 6 + 1];
		c = dsp3dModel[2 + numVert * 6 + i * 6 + 2];

		RGBr = dsp3dModel[2 + numVert * 6 + i * 6 + 3];
		RGBg = dsp3dModel[2 + numVert * 6 + i * 6 + 4];
		RGBb = dsp3dModel[2 + numVert * 6 + i * 6 + 5];

		vertex_a[0] = dsp3dModel[2 + a * 6 + 0];
		vertex_a[1] = dsp3dModel[2 + a * 6 + 1];
		vertex_a[2] = dsp3dModel[2 + a * 6 + 2];

		vertex_b[0] = dsp3dModel[2 + b * 6 + 0];
		vertex_b[1] = dsp3dModel[2 + b * 6 + 1];
		vertex_b[2] = dsp3dModel[2 + b * 6 + 2];

		vertex_c[0] = dsp3dModel[2 + c * 6 + 0];
		vertex_c[1] = dsp3dModel[2 + c * 6 + 1];
		vertex_c[2] = dsp3dModel[2 + c * 6 + 2];
		vertex_c[3] = 0.0;

		dsp3D_projectVertex(vertex_a, coord_a);
		dsp3D_projectVertex(vertex_b, coord_b);
		dsp3D_projectVertex(vertex_c, coord_c);

		dsp3D_drawLine(coord_a[0], coord_a[1], coord_b[0], coord_b[1], ASSEMBLE_ARGB(0xFF, RGBr, RGBg, RGBb));
		dsp3D_drawLine(coord_b[0], coord_b[1], coord_c[0], coord_c[1], ASSEMBLE_ARGB(0xFF, RGBr, RGBg, RGBb));
		dsp3D_drawLine(coord_c[0], coord_c[1], coord_a[0], coord_a[1], ASSEMBLE_ARGB(0xFF, RGBr, RGBg, RGBb));
	}

Из кода понятно, что мы имеем дело уже не с массивом точек, а массивом поверхностей, каждая из которых описана 3-мя точками.

Мне не совсем понятен смысл переменных a,b,c - для чего они? Я так понимаю, записаны они, судя по всему, в конце фрагмента, описывающего Face, перед цветом...  По идее, для стройности массива они должны быть равны 0,1,2 соответственно?  Тогда зачем под них выделены ячейки массива? Почему под каждый Vertex выделено 4 ячейки, а не 3?

Изменено пользователем Salamander

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тихо сам с собою....

массив точек разбит на группы (FACES) по 3 точки, каждая группа - это треугольник.

vertex_a, vertex_b, vertex_c - вершины треугольников

a,b,c - некие индексы, которые показывают под каким номером в текущем FACE располагается точка.   Но скажите, зачем это нужно для треугольника? Нет нужды указывать какая точка с какой соединяется, если их ТРИ.

Кто что думает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 hours ago, Salamander said:

Кто что думает?

Думаю, что точки разделяются между треугольниками, т.е. там не просто набор треугольников, а mesh

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ужо разобрался. Следующий вопрос. Опять таки, если кто знает.

 

Массив я создал - забил в него вертексы, назначил их граням, в режиме Wireframe рисует отлично. Хочу теперь запустить имеющуюся функцию отрисовки в режиме Flat и Gouraud.

Для этого в массив к каждому вертексу нужно добавить нормали. Именно к вертексу, а не к грани. ДЛя вычисления нормали к грани там есть своя функция, но для этого в нее нужно ввести нормали вертексов.

Quote


    float32_t vertex_norm_a[3];
    float32_t vertex_norm_b[3];
    float32_t vertex_norm_c[3];
..............................
                vertex_norm_a[0] = dsp3dModel[2 + b * 6 + 3]; //   нормаль задается 3 числами
        vertex_norm_a[1] = dsp3dModel[2 + b * 6 + 4];//    заранее, при создании модели
        vertex_norm_a[2] = dsp3dModel[2 + b * 6 + 5];//    забитыми в массив


------------------------
// а потом вычисляется нормаль к грани
    dsp3D_calculateFaceNormal(vertex_norm_a, vertex_norm_b, vertex_norm_c, matrix_worldView, face_norm);


А как вычислить нормали к вертексам? 

Подвопрос: задает ли вершина нормаль? Или для ее расчета необходимы данные о всех трех ребрах, образующих грань?

P.S. Попытался в Blender создать куб, сохранить и посмотреть в сохраненный файл, но в него записались уже вычисленные нормали граней, а по вертексам данных нет.

Изменено пользователем Salamander

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...