Salamander 2 13 декабря, 2020 Опубликовано 13 декабря, 2020 · Жалоба Нарыл на просторах вот такую простую 3D библиотеку для STM32. Хотя она, в общем-то платформонезависимая, но автор запускал ее на STM32. Вот отличное видео Как подключить библиотеку, я думаю, разберусь, но вот что меня ввело в ступор, так это файл, заявленный как "утилита для импорта модели". Вот ссылка на нее, внутри код, на питоне что ли.... https://github.com/FabioRM/dsp3D/blob/master/utils/io_export_dsp3D.py Во что скормить этот файл, чтобы получить модельку? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 13 декабря, 2020 Опубликовано 13 декабря, 2020 · Жалоба Питону и скормить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 14 декабря, 2020 Опубликовано 14 декабря, 2020 · Жалоба Судя по коду это не отдельная утилита а плагин к чему то. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 63 14 декабря, 2020 Опубликовано 14 декабря, 2020 · Жалоба 18 minutes ago, xvr said: плагин к чему то "blender": (2, 67, 0), Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 14 декабря, 2020 Опубликовано 14 декабря, 2020 · Жалоба 1 hour ago, xvr said: Судя по коду это не отдельная утилита а плагин к чему то. Вот и я об этом. Но этот вопрос уже отпал, ибо моя задача простая и будет заключаться в рисовании примитивов в процессе работы, без загрузки. Разбираюсь с собственно библиотекой. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 14 декабря, 2020 Опубликовано 14 декабря, 2020 (изменено) · Жалоба Черт.... помогите понять задумку автора библиотеки. С режимом точечной визуализации все понятно: 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? Изменено 14 декабря, 2020 пользователем Salamander Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 15 декабря, 2020 Опубликовано 15 декабря, 2020 · Жалоба Тихо сам с собою.... массив точек разбит на группы (FACES) по 3 точки, каждая группа - это треугольник. vertex_a, vertex_b, vertex_c - вершины треугольников a,b,c - некие индексы, которые показывают под каким номером в текущем FACE располагается точка. Но скажите, зачем это нужно для треугольника? Нет нужды указывать какая точка с какой соединяется, если их ТРИ. Кто что думает? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xvr 12 15 декабря, 2020 Опубликовано 15 декабря, 2020 · Жалоба 9 hours ago, Salamander said: Кто что думает? Думаю, что точки разделяются между треугольниками, т.е. там не просто набор треугольников, а mesh Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Salamander 2 15 декабря, 2020 Опубликовано 15 декабря, 2020 (изменено) · Жалоба Ужо разобрался. Следующий вопрос. Опять таки, если кто знает. Массив я создал - забил в него вертексы, назначил их граням, в режиме 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 создать куб, сохранить и посмотреть в сохраненный файл, но в него записались уже вычисленные нормали граней, а по вертексам данных нет. Изменено 15 декабря, 2020 пользователем Salamander Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться