Iridescence
Visualization library for rapid prototyping of 3D algorithms [C++, Python]
Install / Use
/learn @koide3/IridescenceREADME

Iridescence is a light-weight visualization library for rapid prototyping of 3D algorithms. This library is designed for accelerating personal research and development projects (mainly focuing on point-cloud-related algorithms) and is NOT intended to be a general-purpose visualization library with rich rendering capabilities.
Documentation (en), Documentation (日本語), API(C++), API(Python)
on Ubuntu 22.04 / 24.04 and Windows
Features
What this library provides:
- An easy-to-use 3D visualization framework (inpaticular suitable for rendering point clouds)
- Tightly integrated Dear ImGui interfaces for rapid UI design
What this library does NOT provide:
- Realistic rendering and shading
- Rich textured 3D mesh rendering
See documentation for details.
Dependencies
- GLFW (zlib/libpng license)
- gl3w (Public domain)
- Dear ImGui (MIT license)
- ImGuizmo (MIT license)
- implot (MIT license)
- Eigen (MPL2 license)
- rapidhash (MIT license)
- portable-file-dialogs (WTFPL license)
Installation
C++ : Install from PPA (Ubuntu)
# Install from PPA
sudo add-apt-repository -y ppa:koide3/iridescence
sudo apt install libiridescence-dev
Python : Install from PyPI (Ubuntu and Windows)
Note : Source installation is required for Python 3.14.
# Install from PyPI
pip install pyridescence
<details>
<summary>Install from source</summary>
C++ : Install from source (Ubuntu)
# Install dependencies
sudo apt-get install -y libglm-dev libglfw3-dev libpng-dev libjpeg-dev libeigen3-dev
# Build and install Iridescence
git clone https://github.com/koide3/iridescence --recursive
mkdir iridescence/build && cd iridescence/build
cmake ..
make -j
sudo make install
Python : Install from source
git clone https://github.com/koide3/iridescence --recursive
cd iridescence
pip install .
</details>
Usage
C++ : Use Iridescence in your cmake project
# Find package
find_package(Iridescence REQUIRED)
# Add include dirs and link libraries
add_executable(your_program
src/your_program.cpp
)
target_link_libraries(your_program
Iridescence::Iridescence
)
C++ : Minimum example
C++:
#include <glk/primitives/primitives.hpp>
#include <guik/viewer/light_viewer.hpp>
int main(int argc, char** argv) {
// Create a viewer instance (global singleton)
auto viewer = guik::LightViewer::instance();
float angle = 0.0f;
// Register a callback for UI rendering
viewer->register_ui_callback("ui", [&]() {
// In the callback, you can call ImGui commands to create your UI.
// Here, we use "DragFloat" and "Button" to create a simple UI.
ImGui::DragFloat("Angle", &angle, 0.01f);
if (ImGui::Button("Close")) {
viewer->close();
}
});
// Spin the viewer until it gets closed
while (viewer->spin_once()) {
// Objects to be rendered are called "drawables" and managed with unique names.
// Here, solid and wire spheres are registered to the viewer respectively with
// the "Rainbow" and "FlatColor" coloring schemes.
// The "Rainbow" coloring scheme encodes the height of each fragment using the
// turbo colormap by default.
Eigen::AngleAxisf transform(angle, Eigen::Vector3f::UnitZ());
viewer->update_drawable("sphere", glk::Primitives::sphere(), guik::Rainbow(transform));
viewer->update_drawable("wire_sphere", glk::Primitives::wire_sphere(), guik::FlatColor({0.1f, 0.7f, 1.0f, 1.0f}, transform));
}
return 0;
}
Python : Minimum example
#!/usr/bin/python3
import numpy
from scipy.spatial.transform import Rotation
from pyridescence import *
# Create a viewer instance (global singleton)
viewer = guik.LightViewer.instance()
angle = 0.0
# Define a callback for UI rendering
def ui_callback():
# In the callback, you can call ImGui commands to create your UI.
# Here, we use "DragFloat" and "Button" to create a simple UI.
global angle
_, angle = imgui.drag_float('angle', angle, 0.01)
if imgui.button('close'):
viewer.close()
# Register a callback for UI rendering
viewer.register_ui_callback('ui', ui_callback)
# Spin the viewer until it gets closed
while viewer.spin_once():
# Objects to be rendered are called "drawables" and managed with unique names.
# Here, solid and wire spheres are registered to the viewer respectively with
# the "Rainbow" and "FlatColor" coloring schemes.
# The "Rainbow" coloring scheme encodes the height of each fragment using the
# turbo colormap by default.
transform = numpy.identity(4)
transform[:3, :3] = Rotation.from_rotvec([0.0, 0.0, angle]).as_matrix()
viewer.update_drawable('sphere', glk.primitives.sphere(), guik.Rainbow(transform))
viewer.update_drawable('wire_sphere', glk.primitives.wire_sphere(), guik.FlatColor(0.1, 0.7, 1.0, 1.0, transform))

See documentation for details.
Some use examples in my academic works

License
This package is released under the MIT license.
Related Skills
node-connect
346.4kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
107.2kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
346.4kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
346.4kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
