FLOSS (Free-Libre Open Source Software) and general 3D game development in Python is better than ever, but almost as obscure as before. There are OpenGL backends and 3D engines, but a game engine is layer above a 3D engine and requires drastically less code on your part. I will try to enlighten you to the obscure world of Python 3D game development, but I will also point out other FLOSS engines that may be helpful. I haven’t yet decided whether to move on from Python for game development, but the question at https://www.reddit.com/r/learnpython/comments/1ga8f4y/what_are_the_applications_for_python/ led me to some interesting developments and new discoveries (This article adds more to my answer there to the author’s comment asking about game engines).
A recent 3D game engine for Python is Ursina Engine (supports desktop and Android; partial iOS port was done a while ago). It is slightly higher level than Panda 3D which it uses (However, I’ve only used Panda 3D). Panda 3D was partially developed by Disney and used for Pirates of Caribbean Online, Toontown, as well as many indie games such as listed at: https://steamdb.info/tech/Engine/Panda3D/ and https://www.reddit.com/r/panda3d/comments/cx6yq0/does_anyone_have_a_list_of_graphicly_good_games/ which has an itch.io link to another list.
If you want node-based logic (a.k.a. visual scripting), you may have to go beyond Python. Barring closed source solutions like Unity or UE, I only know about one Python solution: HARFANG 3D. The framework is free for most uses, while HARFANG Studio costs money for commercial use. You may want to try it out for free and see how you like the visual features then consider if the cost works for you. O3DE is mostly visual with some Lua. It has a much smaller community than the big names, but it is the successor to CryEngine (used for FarCry and Crysis) so it probably works fine… There is also Orchestrator for Godot/Redot (which would otherwise use GDScript or C#), and smaller engines like Armory 3D and UPBGE. Though these all have node-based logic, the only ones I know have good mobile support are O3DE and Godot/Redot.
If node-based logic is not a requirement, there are also other smaller Python engines such as Soya3D and smaller non-Python ones such as listed at: https://alternativeto.net/software/unity/?license=opensource. Soya3D only supports desktop (Windows, macOS, and Linux) not mobile (Android and iOS). However, if you get an engine working on a new platform, the developers would probably appreciate code contributions greatly. If you use Rust, there is Fyrox (focused on making GUI convenient including showing triggers, but requires coding for actual logic; supports only desktop & Android), Bevy (focused on making coding convenient; supports mobile) and smaller ones such as macroquad (recommended by TanTan, supports mobile; 3D support is low level). If you use Lua there is Luanti (formerly Minetest; supports desktop & Android but there are iOS versions) from minetest.net, or Final Minetest from minetest.org which has a stable backward-compatible API and therefore many working examples going back 10+ years (See also https://poikilos.org/2019/05/06/minetest-org-and-minetest-net-split/). In either one, your project is structured as Lua “mods” in a “game” folder (or modpack folder in the game to organize further), but can make an entire game from scratch. It based around a voxel sandbox world, but there have been many creative uses of the engine that don’t look like a sandbox world (not like Minecraft), including board games and a city-building sim. You define all of the nodes (blocks), craftitems, and callbacks for how they (and world generation a.k.a. mapgen) behave. Some scripting languages such as GDScript are similar to Python in some ways (including use of colons for functions and static typing). Much of learning a new language is just getting to know a good framework (the game engine in this case), which is what you have to learn to use anyway even if you want to stick with Python and start developing games with it.
The more you know the framework (and good plugins/addons or libraries), the less code you have to write. Less code is a good goal so you rely on well-tested code and have less development and maintenance time. Re-writing stuff that already exists isn’t as good of a learning experience as you might think, because you should be learning to use tools instead of making new ones in most cases. Great examples of that:
- Learning existing features and how to use signals & slots if using Qt in Python/C++
- Learning STL if using C++ (Can someone explain why Godot’s C++ code re-implements stuff already in STL?)
- Using existing modules for saving/loading well-known formats such as JSON, XML, or HTML.
If you still want to learn “how the sausage is made” (mundane but complex/scary backend code), read the code instead of writing it…then if you think you can do better make a pull request and support FLOSS! For maintainability you can also split your code into small well-named functions (or classes and methods), but still use functions and/or classes in the framework whenever available.
Avoid decision paralysis. Just try making something. In a related experience, I tried making music in several different editors and learned a lot from that (I like Ardour but didn’t try Reaper yet, and recommend Bosca Ceoil Blue for beginners or drafts). You will know better than someone else what engine works for you, but try to get over the initial learning curve using documentation and advice (in that order to get the best response) before you give up on one.