|
175 / 10 / 1
Регистрация: 05.08.2024
Сообщений: 73
|
||||||
Как сделать перемещение камеры в PyOpenGL?28.08.2024, 20:55. Показов 6656. Ответов 65
Метки нет (Все метки)
Мне помог один человек (в целях конфиденциальности я решил не писать его username) с изучением OpenGL с помощью Python. Я взял его код с крутящимся синим кубиком (фигур было больше, но для удобства я решил оставить одну). Код изучил я подробно, но возникла проблема с перемещением камеры клавишами: я не знаю как их сделать. Помогите, пожалуйста.
Вот код:
0
|
||||||
| 28.08.2024, 20:55 | |
|
Ответы с готовыми решениями:
65
Как сделать перемещение камеры в пространстве по типу FPS шутера
|
| 30.08.2024, 14:00 | ||
|
Если у вас появится желание параллельно изучать C++ и у вас Windows, то можете воспользоваться моим пошаговым руководством по началу использования SDL3, CMake, MinGW-w64. В нём сейчас следующие разделы:
1
|
||
|
175 / 10 / 1
Регистрация: 05.08.2024
Сообщений: 73
|
|
| 30.08.2024, 14:58 [ТС] | |
|
Здравствуйте! Я скачал blender 2.67. Все работает
0
|
|
| 30.08.2024, 15:49 | ||||||
|
Теперь создайте новый проект с кодом:
1
|
||||||
|
175 / 10 / 1
Регистрация: 05.08.2024
Сообщений: 73
|
|
| 31.08.2024, 11:22 [ТС] | |
|
Здравствуйте! Я сделал все по вашей инструкции, но не знаю, что делать после снятие галочки с include. Что надо ввести в верхнюю строчку "C:", чтобы сохранить проект на рабочий стол?
0
|
|
| 31.08.2024, 12:37 | ||
|
Забыл, написать, что надо прокрутить настройки экспорта ниже и удостовериться, что установлена галочка "Traingulate" и "Transformation Type" выставлено в значение "Matrix", по-моему, по умолчанию именно так и ничего менять здесь не надо: Что такое "Use Object Instances" я не знаю. Пусть установлено, как это есть по умолчанию. Далее, надо выбрать путь, куда сохранить файл - желательно выбрать путь к проекту, где будете писать код и ввести имя "plane.dae": Ещё очень часто бывает удобно на панели слева, почти в начале настроек, нажать кнопку "Bookmarks" > "Add": Тогда в следующий раз при экспорте отредактированного объекта, либо при экспорте нового объекта в тот же проект с кодом, не нужно будет указывать путь к проекту с кодом вручную. Достаточно будет на названия папки в разделе "Bookmarks": Теперь можно нажать кнопку "Export COLLADA" в правом вернем углу: Файл "plane.dae" будет сохранён в папку с кодом на Python. Теперь продолжайте изучать сообщение #18
1
|
||
|
175 / 10 / 1
Регистрация: 05.08.2024
Сообщений: 73
|
|
| 31.08.2024, 17:35 [ТС] | |
|
Спасибо, сохранить квадратик получилось, но я не очень понял из 18 сообщения, как достать координаты объекта (а также нормалей и т.д.) из файла
0
|
|
| 31.08.2024, 18:36 | ||||||
|
Двигаемся потихоньку шаг за шагом. Рядом с файлом "main.py" сейчас находится файл "plane.dae". Допишите код ниже, чтобы в нём читалось содержимое файла "plane.dae" и выводилось на экран. Если раньше не читали файл на Python, то нагуглите. Например, я в гугле набрал "read file content python". Одна из первых ссылок: https://www.w3schools.com/pyth... e_open.asp
Вот стартовый код в "main.py" куда нужно дописать чтение содержимого файла и вывод этого содержимого в консоль. Опубликуйте свой код полностью, то есть этот код с дописанным чтением файла и выводом его содержимого в консоль:
1
|
||||||
|
175 / 10 / 1
Регистрация: 05.08.2024
Сообщений: 73
|
||||||
| 01.09.2024, 10:31 [ТС] | ||||||
Сообщение было отмечено 8Observer8 как решение
Решение
Здравствуйте! Квадрат получился. Я взял за основу ваш код с синим кубом и тенями, чтобы выделить работу нормалей.
Вот код:
1
|
||||||
| 01.09.2024, 13:25 | ||||||||||||||||||||||||||||||||||||
|
Я не знаю, как решить проблему с кодировкой. Когда из консоли запускаю ваши программы с русскими комментариями, то всегда возникает ошибки при запуске на Windows 10 из CMD и из Far:
Мало того, ваш код выводит сферу (Shift+A > "Mesh" > "UV Sphere"). Опять же просто меняем в трёх местах в программе:
Кстати, возникает ошибка на 85 строке при импорте сферы:
Чтобы сфера была гладкой, надо в Blender слева на T-панели, которая открывается и закрывается с помощью клавиши "T" найти опцию, состоящую из двух кнопок "Smooth" и "Flat". Надо нажать "Smooth" (можно будет вернуться обратно к первоначальной сфере, нажав "Flat"), нормали будут усреднены: Надо всегда следить, чтобы имя объекта в ".dae" совпрадало с именем объекта в программе. Голова обезьяны: "Shift+A" > "Mesh" > "Monkey": Можно нажать кнопку "Smooth" на T-панели:
1
|
||||||||||||||||||||||||||||||||||||
| 01.09.2024, 13:33 | |
|
На этом нельзя останавливаться. Надо делать следующий шаг. Выведите разные стандартные объекты из Blender: куб, сфера, конус, цилиндр, голова обезьяны и т.д. одновременно. Пусть какие-то из них вращаются вокруг разных осей. Самое главное, что бы они были на одной сцене, но из разных файлов. Прикрепите архив:
1
|
|
|
175 / 10 / 1
Регистрация: 05.08.2024
Сообщений: 73
|
||||||
| 02.09.2024, 18:41 [ТС] | ||||||
|
Здравствуйте! Я выполнял ваше задание, решил пока просто отрисовать все объекты (без угла поворота). У меня возникла проблема, что я не вижу фигуры: квадрат, обезьянку, куб и шар
вот исходники в формате txt, т.к. формат ___.dae у меня выдавал ошибку, из-за чего я решил поменять в коде формат на txt. А также лучше скачайте zip папку снизу, там находятся все фигуры. Вот код:
0
|
||||||
| 02.09.2024, 20:06 | |||||||||||||||||||||||||||||||
|
Я попробовал оставить один объект в массиве names и добавил вывод имени в models3d()
Это неверный способ - добавить все вершины треугольников всех объектов в один буфер вершин и все нормали в один буфер нормалей. Надо для каждого объекта создать свой буфер вершин и свой буфер нормалей и делать привязку к буферам вершин и нормалей одного объекта перед рисованием, то есть перед вызовом glDrawArrays(). Для каждого объекта отправить свою MVP-матрицу и вызвать свой glDrawArrays() со своим количеством вершин. Перед каждым glDrawArrays нужно вызывать glBindBuffer(), glVertexAttribPointer() и glEnableVertexAttribArray() Это ваш код, который рисует все объекты в нулевой точке координат:
1
|
|||||||||||||||||||||||||||||||
| 02.09.2024, 23:53 | |||||||||||
|
Суть в том, что у каждого объекта есть свои атрибуты: вершины треугольников, нормали, текстурные координаты и т.д. В вершинном шейдере так и пишется "attribute". Вершинный шейдер берёт значения атрибутов из буферов, куда были загружены массивы данных. Чтобы шейдер понял из каких буферов брать данные и как эти данные хранятся нужно сделать привязку буферов, активацию переменной атрибута и настройку атрибута:
Например, надо рисовать куб. Массивы вершин треугольников были загружены в буфер cubeVertPosBuffer, а массив нормалей был загружен в буфер cubeNormalBuffer. Перед вызовом glDrawArrays(GL_TRIANGLES, 0, amountOfCubeVertices) надо сначала сделать привязку к cubeVertPosBuffer, активировать атрибут и настроить атрибут, чтобы шейдер понимал, что данные вершин занимают 3 позиции, то есть (x, y, z), так как в вершинном шейдере vec3, а данные в атрибуте имеют тип float:
Далее, нужно повторить туже самую процедуру для других объектов. Сделать привязку к буферу вершин, например, конуса, настроить атрибуты, сделать привязку к буферу нормалей конуса, настроить атрибуты, передать MVP-Матрицу и вызвать glDrawArrays(GL_TRIANGLES, 0, amountOfConeVertices). Только передать уже не число вершин куба, а число вершин конуса. Кстати, число вершин это не len(vertPositions), а len(vertPositions)//3, потому что vertPositions хранит x, y, z, x1, y1, z1 и т.д. то есть на одну вершину приходится три числа.
0
|
|||||||||||
| 03.09.2024, 01:35 | |
|
Добавил в ваш пример, который я исправил в сообщении 32, вращение камерой зажатой левой мышкой, перемещение камеры зажатой правой кнопкой мыши и приближение и отдаление камеры с помощью колёсика мыши. Я просто перевёл пример zayats80888 из Qt C++ на Python из этого сообщения: Вращение камеры мышкой после её перемещения
0
|
|
| 04.09.2024, 15:11 | |
|
Сделайте сначала другое задание в 2D (с ортогональной проекцией). Нарисуйте в одном окне три объекта:
0
|
|
| 05.09.2024, 14:32 | |
|
Исправлю описку
Добавлено через 42 секунды Не получилось. Написал "Селёный" Добавлено через 1 минуту Я думаю, что нужно создать отдельный класс для рисования объекта и предавать ему массив вершин треугольников. Хранить в этом классе вершинные буферы и т.д.
0
|
|
|
175 / 10 / 1
Регистрация: 05.08.2024
Сообщений: 73
|
|
| 05.09.2024, 18:06 [ТС] | |
|
Здравствуйте! У меня появилось свободное время, чтобы мог по программировать и посмотреть данный форум. Я прочитал ваше сообщение на счет буфера. Я не очень понял, как можно осуществить создание нескольких буферов. Я могу сделать отрисовку именных координат, с созданием разных мвп матриц, но я не очень понял, как будет работать код при нескольких буферов координат и нормалей.
0
|
|
| 05.09.2024, 20:08 | |||||||||||
|
Daniil_G, это будет понятно, когда вы попытаетесь добавить ещё один объект. Например, есть этот код, где треугольник двигается с помощью клавиш. Добавьте в него квадрат. Переименуйте этот массив и буфер в буфер треугольника, вот так:
Добавлено через 1 час 44 минуты Алгоритм подготовки и рисования нескольких объектов следующий:
Также создаём буферы для других объектов. Перед тем как рисовать, то есть перед вызовом glDrawArray() нужно сделать привязку к буферу (или буферам: вершин, нормалей, текстурных координат и т.д.), чтобы вершинный шейдер знал из каких буферов загружать данные, сделать настройку атрибутов, передать матрицу MVP вершинный шейдер, передать цвет в фрагментный шейдер. После этих подготовок нужно вызвать glDrawArray() и тогда запустятся вершинные шейдеры, которые параллельно в разных потоках будут обрабатывать данные из буферов. Например, брать вершины треугольников, умножать матрицу MVP на них.
0
|
|||||||||||
| 06.09.2024, 02:27 | ||||||||||||||||||||||||||||||||||||||||||||||
|
Так выглядит решение задачи по созданию общего класса для всех моделей. В примере ниже есть один общий класс с именем Model в отдельном файле "model.py". В конструктор этого класса передаются следующие данные и сохраняются. Написал в комментариях, что происходит:
color.vert
Создаётся общая для всех объектов projView-матрица:
1
|
||||||||||||||||||||||||||||||||||||||||||||||
|
175 / 10 / 1
Регистрация: 05.08.2024
Сообщений: 73
|
|
| 08.09.2024, 17:00 [ТС] | |
|
Здравствуйте! У меня снова появились 10 минут свободного времени. Желаю спросить. Возможно ли скрещивание FBO и класса отрисовки, чтобы это могло работать исправно? Просто желаю все это в выходные, если получиться, объединить.
0
|
|
| 08.09.2024, 17:00 | |
|
Помогаю со студенческими работами здесь
40
Как правильно настроить перемещение камеры? Перемещение камеры, как в редакторе unity в окне Scene
Как сделать перемещение нескольких файлов с заменой? И как это сделать проще? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера»
Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит.
Придуман Биллом Госпером в 1970-х, опубликован в. . .
|
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb">
<style>
<!]>
</ style>
<g id="bush">
</ g>
</ svg>
function fn(){
let rost;/ / высота древа
let xx=165,yy=210,w=256;
|
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов,
содержащихся в реализации модуля. По-умолчанию все члены модуля доступны:
module Foo
let x = 10
let boo () = printfn "boo"
. . .
|
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible". . .
|
|
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов.
import "math"
func angleClock(hour int, minutes int) float64 {
. . .
|
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo
https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html
и его же старой инструкции по установке Lazarus с gtk2. . .
|
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер.
Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
|
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта
Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
|