I’m Ayush Dhar Dubey, a 2nd-year undergrad from Indian Institute of Technology Roorkee, and I’m thrilled to be working with OSM community this summer as part of Google Summer of Code 2025!
My project focuses on modernizing the 3D Model Repository (3DMR) a very helpful tool that connects 3D models to OpenStreetMap data for real world rendering. Over the summer, I’ll be upgrading the codebase from Django 2.0.2 to Django 5.2 along with all related dependencies, and some feature and UI/UX improvements.
The full roadmap is outlined in my proposal, and I’m always open to feedback, ideas, or collaboration.
Excited to grow with the community and build something awesome together!
I will be logging progress in this thread for continuous feedback.
Here’s a quick update from my Community Bonding Period (May 8 - June 1)
We’ve successfully migrated the legacy repo to the latest 3DMR repo: everything’s now in one place and set up for further improvements and streamlined discussions!
Over the CBP period, I:
Explored pygltflib to understand how to read and analyze glTF files — this will be super useful later for validating models during upload.
Checked out the obj2gltf converter to help with our planned OBJ-to-glTF migration - it looks like a great fit.
Explored OSM2World, rendering both my own mapped data and some iconic Indian landmarks.
Exported .osm files and tried converting them to glTF/OBJ gave me a clearer picture of the rendering pipeline.
Experimented with mapping and really enjoyed it, 'am planing to continue adding features from my local area whenever I get time!
Refactored my pre-GSoC work and opened a cleaner PR in the master repo to integrate earlier contributions more cleanly, which has been merged too.
We also had regular biweekly meetups with my mentors Tobias and Sarah, who’ve been incredibly helpful, patient and encouraging throughout. Their guidance really helped me understand the project goals, community culture and expectations from me more clearly
For the first week of the coding period we have decided to finish writting a solid test suite for the project. This will make it much easier to safely upgrade dependencies later on without breaking anything.
If time permits, I’ll also start working on the Django upgrade.
the coding period has officially begun and we’ve made some solid progress on the foundational stuff.
I finished writing the preliminary test suite to test the essential features so that if something would break during the package updates, it would be super easy to trace it. We successfully got the pr merged and my mentor’s appreciation read, the tests were good enough as initial version but we will need to extend them to test the outputs exhaustively.
While writing the tests we found some bugs, took care of them wherever I could and have filed issues for the rest to be fixed later.
I’ve also finalized the django and python upgrade and got it merged. Materialized views have been creating quite a few issues throughout this process. We discussed that we may need to get rid of django_pgviews in the long run as the package is no longer maintained.
The materialized views were causing issues in migrations as they did not allow the db schema to be changed but newer django version demanded BigAutoField instead of AutoField. managed to work around it for now by updating the db schema while conserving the data, but it’s definitely something we’ll need to address properly later.
Importantly, the authentication is restored and working nicely. (It was broken since OSM moved to OAuth2 and OAuth became obsolete)
With the django upgrade now finished and working, it feels as if half of the MVP problem statement has already been covered. the foundation is solid now - modern django stack, working auth, decent test coverage. We can soon start to actually start building features instead of just fixing infrastructure.
Now we will be working on retiring the obj support and moving forward with gltf pipelines.
apart from developing the infrastructure for gltf upload and rendering, we will be converting the existing obj models into gltf. for this we have zeroed down to use obj2gltf. I have already commenced test run on a large segment of models from the prod. The package developed by CesiumGS is capable of handling the conversion along with all the textures and seems to be working perfectly fine as per our requirements.
Over the coding period me and my mentors had agreed upon weekly meetups and have already had two of them. Looking forward to delving into 3D…
Hi! Good to hear, 3dmr.eu is alive.
GLB-Files are a good improvement. Many of the uploaded models have been GLB originally.
www.f4map.com is using models too; but closed source, respective locked for download. But how could I find them in the browser cash?
My www.OSMgo.org is also using the 3dmr.eu and I may help testing your work.
There are two use cases:
Some models are unique like the Eiffel Tower. The position parameters aren in 3dmr. I once made a small editor for positioning models and get the parameters, in A-Frame. If you like, we could include it in the web site.
Others are used many times, like a lantern or a power mast. The coordinates have to be in the OSM tagging and need an OSM Wiki page.
thanks, it really means a lot to hear that. I was honestly so excited when i first heard from my mentors that you are actually using 3dmr.eu in production. That kind of real-world usage is super motivating for any contributor. And OSMgo is a very cool project in itself actually, I loved the gamified world view.
And yes, it’s always great to integrate existing tools wherever possible. I’m definitely looking forward to learning more about the A-Frame–based editor, how it works, and how it might be integrated with OSMgo and 3dmr.eu.
Also, thanks for offering to help with testing! That would be amazing. I’ve been trying to find a small set of .glb models: both valid and especially broken ones, to properly test our backend’s validation logic. I haven’t had much luck yet, so if you know of anything (or have a stash you can share), I’d be super grateful.
I am hoping my mentors would be able to push the latest changes to the production server sometime next week maybe; given the GLTF pipeline and Django upgrades would be fully functional… Once that’s live, having an extra hand to test edge cases with different kinds of models would be super helpful.
Alternatively, if you’re up for it, feel free to clone the 3dmr repo and run the development version locally via ./manage.py runserver. (…the README might be a bit out of date, I’m not entirely sure the steps will all work as-is…)
Oh, and one more thing: @tordanik has posted a draft for the content guidelines here.
If you have thoughts, especially around minimum model stats like triangle or vertex counts, we’d really love to hear them from someone experienced in the domain.
Here’s a quick recap of what I’ve been up to this past week:
I wrote a conversion script that takes all our existing obj-mtl models and turns them into .glb using the obj2gltf npm package. Ran it on a snapshot of prod’s model directory, and everything converted nicely. I and @tordanik tested the results, and the models seem to be working just fine!
In the last meet I discussed with my mentor: minimum model standards and if it would be possible to optimize the models further. We discussed that we will enforce 2 step validation: present relevant statistics to the users before submitting models and for already uploaded models
we would enforce some validation checks to force users to upload quality models.
It was recommended that we will utilize any general gltf validator to check the models for any issues during upload + enforce a few of our own statistical constraints.
By the time i am writting this, I have been able to complete the backend validation part of the model upload process, i initially decided to use pygltflib but when implemented it came out to be really slow on mosques and other complex models, after a few tries, it came out that glTF Validator suggested by @tordanik is actually the best possible option: I have switched to using the glTF Validator.
For the custom checks, I am strongly looking forward to community feedback on the aforementioned thread, but until then I am considering triangle count in the range (100, 1000000), vertex count (100, 1500000) and material count (1, 100). but these are very vague assumptions and i need an expert opinion on this one.
Now, I have started working on the frontend part of the pre-model upload feedback; For this one I think we are good with the three.js, which we are already using for rendering. the page will be displaying the model statistics to the user before upload and advise them accordingly if need be, most probably i will be done with the gltf pipeline in 2-3 days.
"gamified world view” is nice, I call it “symbolic”: just as the tagging is. But OSM2World is my favourite.
A-Frame was a quick solution. We can talk about a good way. May be inside OSMgo/OSM2World and copy the parameters or open a dialog of 3dmr.
Testing bad, small and large glb models is possible. I do not have much models but may find some. The download API is the fun part. By changing to your “beta” url and glb files in my OSMgo. I could clone your repo but don’t know python. I may ask you.
About vertex counts, I only can try it on my old iPhone SE2 to see if it works.
Staying with threeJS is fine cause OSMgo uses it to.
"displaying the model statistics to the user before upload” means: Uploading to the server, check the model and uploading/adding to the model repository, right?
Hi @karlos
thankyou for your insights on the content guidlines thread, the suggestions are very helpful and will try my best to incorporate all’em.
don’t bother cloning the repo if that is not something in your convenience, we might be able to release a beta version pretty soon anyways, that being said please feel free to reach out if you are cloning the development server, i would be happy to help.
Ah no… actually what i meant here was, as the user selects the model on the upload page, before hitting the submit button, they will see some statistical feedback like “try adding some more meshes”, “vertex count too low” etc. so that they may refine it if needed to…
and after they submit, there would be a backend validation check also to enforce the rules before adding the model to repository.
Yes, a very minimalistic validation, written using threeJS only, running in browser, i thought it would be good to let the users know before submitting…
please let me know if you feel otherwise?
We’ve been able to launch the beta server!
We’d love for community members to give it a spin and help us test it.
If you notice any bugs, have suggestions, or just want to share feedback, please drop your thoughts here or on the Github repo.
The server now fully supports .glb file rendering and displays basic model statistics, color-coded feedback to help encourage quality uploads from contributors.
Besides that, I’ve been working on numerous refinements across the codebase: like discontinuing the django_pgviews dependency and removing our reliance on Postgres HstoreField.
Also added animation support in the model renderer. But this one is not pushed on the beta server as of now, will be able to do, probably by tomorrow…
In the immediate last meet (3 days ago), we went through all the issues on the legacy codebase and closed many that were already fixed across various pull requests in the new GitHub repo.
Moving forward, the immediate goal is to work the remaining open issues/suggestions on the GitHub repo, GitLab repo and work on feedback from the community based on beta server tests.
The first start shows empty squares. A sandglass while download the model? Do we really need a 3D view in the overview view; or should we simply have PNGs, may be Animated GIF wit 3-4 Views directions?
The Eiffeltower looks great, is it a new model?
The “ofr mars” model misses 2 walls!. What is it? Where on Earth is it?
** Could we have a cross reference to OSM, an OSM Node or Relation ID, using the 3DMR tag?
** I know, Tordanik yes not like the world map, or at last geo-coordinates at the models. I think, we should still have a world map for unique used models. May be just raw coordinates (Fetched automatically by the ID).
I love that windmill! I need to use it. Should not be a problem in OSMgo.org.
** The GLB animation is nice. But it makes a “jump”. Only in the preview? An animation should have a clean cycle end to start.
We should keep the 3DMR-IDs from the old server, so we don’t need to change existing tagging. That also means to move all the models.
A way cross just appeared. Until now, I assumed 3DMR just for 3D constructed models, not for scanned point could objects. But sure, why not. It’s a bit like WikiMedia, anything goes. - Found it: Node: 1378969150 | OpenStreetMap - No 3dmr tag yet; but I will simulate that in my OSMgo …
All the models currently on the beta site are from the original repository, with the exception of the wind turbine (which is used to test animation support). The original models are 4, 35 and 38.
We have discussed including an Overpass Turbo link on the model page to make it easy to find all the locations where this model is used in OSM.
We plan to convert the existing content once the code is ready to go on the main site. @Ayush_Dhar_Dubey has already looked into suitable tooling and performed a successful test run of the conversion script. This also means that any model IDs on the beta server should be considered temporary.
@karlos Thank you very much for your remarks; Glad you liked the model stats, all of that is thanks to the insights of @Tordanik
Actually this specific model was originally in FBX format and converted to GLB. The conversion resulted in broken animation. It was just for testing the animation support, so I didn’t bother finding another “perfect” model. As I had mentioned previously we have also integrated the new gltf-validation so normally any other user will not be able to upload such broken model over the repository; You would not find any such broken models in production, moving forward.
I would personally prefer the 3D overview, but we can ofcourse have further opinions over it in the community.
django_compressor doesn’t support ES6 modules see #19, so after a bit of back and forth, we finalized the move to Vite for bundling all our Three.js-related static files: the model viewer scripts that import from three.
We discussed to have a user-facing documentation (how to upload models, which kinds of models are acceptable, etc.) on the Wiki page, which can now be discovered as a new nav item on the beta site.
We also updated model stats to show whether textures are present, and how many PBR textures are included: as an indication of model quality. (updated over beta too)
Merged/closed a bunch of PRs on the GitLab repo: many were duplicated in my work independently…
Most recently, we ran into a weird behavior around 3dmr usernames see #25. The default Django + social-app-django behaviour strips whitespace from usernames, causing inconsistency.
To fix this, we decided to use OSM user_id as the primary identifier of a user and store the OSM display_name for showing to the user. We’ll drop the 3dmr username field entirely from the UI to avoid confusion.
Username issue fix: The current implementation now saves/updates the OSM display_name on the each login. Until the user logs in again, the username field (which is essentially a modified/mangled display_name) will continue to be shown.
UI improvements:
Added footer links for the community forum and GitHub repo.
Introduced an additional helper flow for better license tagging (available over the beta server).
Added a new Source field to record the original source of a model (if applicable).
Added an obj2glb script as a Django management command in the original repo: #30.
In Progress
@tordanik’s suggested to have, two orientation arrows to help uploaders better understand the model’s alignment (preview available over the beta server). This feature is currently in progress: #36.
To have a hyperlink to OSM user page over the 3dmr user page
To have an overpass turbo link over each model page for 3dmr=*