J360
360 Video and Photo Capture in 4K for Three.js
Install / Use
/learn @imgntn/J360README
This project shows how to export 4K resolution 360 Videos and Photos from inside of Three.js scenes.
The process is described in this blog post: https://medium.com/p/788226f2c75f
Examples
example 4k video from demo scene on YouTube

example 4k test video on YouTube

How this works
Basically you take a cube camera, save it to equirectangular photo, and then stitch those together to make a video. Add some metadata and voila! You can then post them to Facebook and Youtube.
I made some modifications to the CCapture.js library, where I added a CC360Encoder class that calls into an cubemap to equirectangular image capture library from the same author. I made modifications to that library also, where I prepare the cube camera data for the encoder with the preBlob class. Finally, I was running into memory issues very quickly, so I re-implemented the broken batching in CCapture.js for .jpg sequences.
The app will capture a batch every N seconds, according to the autoSaveTime parameter. Save and unarchive these .tar files, then use FFMPEG to stitch the images together. See the post on Medium for more about metadata.
Try Online
Example files
Clone the repository and serve its files using a webserver of your choice.
index.html contains simple test shapes. moving the camera during capture has no effect.
demo.html is hacked into a three.js demo scene. moving the camera during capture will change the final shot.
Use it yourself
Include the modified CCapture.js and CubeMapToEquirectangular.js libraries. You'll need tar.js and download.js as well. Which controls to include are up to you.
Instantiate a capturer. Batches will download automatically every N seconds according to the autoSaveTime property.
// Create a capturer that exports Equirectangular 360 JPG images in a TAR file
var capturer360 = new CCapture({
format: 'threesixty',
display: true,
autoSaveTime: 3,
});
Add a managed CubemapToEquirectangular camera when you setup your scene.
Here we use “4K” but you can also use “2K” or “1K” as resolutions.
equiManaged = new CubemapToEquirectangular(renderer, true,"4K");
Call the capture method at the end render loop, and give it your canvas.
capturer360.capture(canvas);
These functions will start and stop the recording.
function startCapture360(event) {
capturer360.start();
}
function stopCapture360(event) {
capturer360.stop();
}
Unarchive, Convert, and Add Metadata
Unarchive the .tar files to a single folder and then convert the whole folder of images into a movie with one FFMPEG command
ffmpeg -i %07d.jpg video.mp4
The “%07d” tells FFMPEG that there are 7 decimals before the “.jpg” extension in each filename.
In tests of a 30 second capture, I've seen a 1.66GB folder of 4K 360 images compress into a single 3.12mb 4K 360 video. A lot depends on how much movement there is in the scene, but the reductions are dramatic.
Then use the Spatial Media Metadata Injector to add spatial metadata and upload.
Contact
Get in touch with me on LinkedIn for custom 360 content or more versatile deployments of this software.
https://www.linkedin.com/in/jamespollack
Related Skills
qqbot-channel
346.4kQQ 频道管理技能。查询频道列表、子频道、成员、发帖、公告、日程等操作。使用 qqbot_channel_api 工具代理 QQ 开放平台 HTTP 接口,自动处理 Token 鉴权。当用户需要查看频道、管理子频道、查询成员、发布帖子/公告/日程时使用。
docs-writer
100.1k`docs-writer` skill instructions As an expert technical writer and editor for the Gemini CLI project, you produce accurate, clear, and consistent documentation. When asked to write, edit, or revie
model-usage
346.4kUse CodexBar CLI local cost usage to summarize per-model usage for Codex or Claude, including the current (most recent) model or a full model breakdown. Trigger when asked for model-level usage/cost data from codexbar, or when you need a scriptable per-model summary from codexbar cost JSON.
Design
Campus Second-Hand Trading Platform \- General Design Document (v5.0 \- React Architecture \- Complete Final Version)1\. System Overall Design 1.1. Project Overview This project aims t
