{"id":25774454,"url":"https://github.com/markusand/proj3d","last_synced_at":"2026-06-09T04:33:30.468Z","repository":{"id":167415351,"uuid":"97579952","full_name":"markusand/proj3D","owner":"markusand","description":"Display projection into a 3D surface in Processing","archived":false,"fork":false,"pushed_at":"2019-01-01T19:58:39.000Z","size":2733,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-02-27T05:47:48.126Z","etag":null,"topics":["cityscope","processing","visualization"],"latest_commit_sha":null,"homepage":null,"language":"Processing","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/markusand.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-07-18T09:28:54.000Z","updated_at":"2022-01-05T15:21:49.000Z","dependencies_parsed_at":null,"dependency_job_id":"6607da32-ede3-4d1b-abb4-2d06cda9f3c9","html_url":"https://github.com/markusand/proj3D","commit_stats":null,"previous_names":["markusand/proj3d"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/markusand/proj3D","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markusand%2Fproj3D","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markusand%2Fproj3D/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markusand%2Fproj3D/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markusand%2Fproj3D/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/markusand","download_url":"https://codeload.github.com/markusand/proj3D/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/markusand%2Fproj3D/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34092260,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cityscope","processing","visualization"],"created_at":"2025-02-27T05:30:01.037Z","updated_at":"2026-06-09T04:33:30.463Z","avatar_url":"https://github.com/markusand.png","language":"Processing","funding_links":[],"categories":[],"sub_categories":[],"readme":"# proj3D\nDisplay projection into a 3D surface in Processing\n\nAdjusting images projected from a beamer into a surface needs some perspective parametrization. A great option in Processing is using [Keystone library](https://github.com/davidbouchard/keystone) by [@davidbouchard](https://github.com/davidbouchard). However, this does not work when the surface to project on is irregular, where more options are needed to adjust control points and adapt them to the surface.\n\n## Getting started\nCreate surface object that will allow to deform all its control points, and provide its vertices coordinates\n```java\nfinal LatLon[] ROI = new LatLon[] {\n    new LatLon(42.505085,1.509961),\n    new LatLon(42.517067,1.544024),\n    new LatLon(42.508160,1.549798),\n    new LatLon(42.496162,1.515728)\n};\n\nWarpSurface surface = new WarpSurface(this, 700, 300, 20, 10, ROI);\n\n```\n\nCreate a canvas object to draw into and that will be used as the surface texture. Canvas must have defined its bounds coordinates, so the surface will select the area inside the Region of Interest\n```java\nfinal LatLon[] bounds = new LatLon[] {\n    new LatLon(42.5181, 1.50803),\n    new LatLon(42.495, 1.50803),\n    new LatLon(42.495, 1.55216),\n    new LatLon(42.5181, 1.55216)\n};\n\nWarpCanvas canvas = new WarpCanvas(this, 500, 300, bounds);\n```\n\nDraw into canvas as it would be done into any PGraphics object.\n```java\ncanvas.beginDraw();\ncanvas.background(0);\ncanvas.fill(#FF0000);\ncanvas.noStroke();\ncanvas.ellipse(mouseX, mouseY, 5, 5);\ncanvas.endDraw();\n```\n\nApply the canvas into the surface\n```java\nsurface.draw(canvas);\n```\n\nMapping from (lat,lon) location to (x,y) screen position and vice versa is possible through the given methods. If screen position or geographic location don't belong to surface, null value is returned\n```java\nPVector position = surface.mapPoint(42.246543, 1.568294);\nLatLon location = surface.unmapPoint(mouseX, mouseY);\n```\n\nThe WarpSurface is observable and returns the location of the clicked point (if the point is inside the surface's borders) to any class implementing the Observer interface that is observing it.\n\n\n## Licensing\nThis project is licensed under the terms of the MIT license\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarkusand%2Fproj3d","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmarkusand%2Fproj3d","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmarkusand%2Fproj3d/lists"}