Hi, I have a point cloud file that records the XYZ coordinates and their color.
0.1 0.2 -0.1 250 124 45
......
What should I do in order to render the figure below by using three.js?
Hi, I have a point cloud file that records the XYZ coordinates and their color.
0.1 0.2 -0.1 250 124 45
......
What should I do in order to render the figure below by using three.js?
You could consume the data and place spheres at each coordinate and give it that RGB value.
Don’t do that. Rendering your data as a PointCloud
by loading them via XYZLoader
will result in a way better performance. The following example demonstrates this approach:
Sweet. Didn’t even know there was an XYZ loader.
I tried to make the example work on my local machine. But it did not work. I think I am very close to success. Could you guide me please? Thank you! And I have downloaded the ‘three.module.js’, ‘XYZLoader’, and ‘helix_201.xyz’ at the same level of this HTML file.
<!DOCTYPE html>
<html lang="en">
<head>
<title>three.js webgl - loaders - XYZ</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<link type="text/css" rel="stylesheet" href="main.css">
</head>
<body>
<div id="info">
<a href="https://threejs.org" target="_blank" rel="noopener">three.js</a> - XYZ loader<br/>
asset from <a href="https://people.math.sc.edu/Burkardt/data/xyz/xyz.html" target="_blank" rel="noopener">people.math.sc.edu</a> via GNU LGPL
</div>
<!-- Import maps polyfill -->
<!-- Remove this when import maps will be widely supported -->
<script async src="https://unpkg.com/es-module-shims@1.3.6/dist/es-module-shims.js"></script>
<script type="importmap">
{
"imports": {
"three": "./three.module.js"
}
}
</script>
<script type="module">
import * as THREE from 'three';
import { XYZLoader } from './XYZLoader.js';
let camera, scene, renderer, clock;
let points;
init();
animate();
function init() {
camera = new THREE.PerspectiveCamera( 50, window.innerWidth / window.innerHeight, 0.1, 100 );
camera.position.set( 10, 7, 10 );
scene = new THREE.Scene();
scene.add( camera );
camera.lookAt( scene.position );
clock = new THREE.Clock();
const loader = new XYZLoader();
loader.load('helix_201.xyz', function ( geometry ) {
geometry.center();
const vertexColors = ( geometry.hasAttribute( 'color' ) === true );
const material = new THREE.PointsMaterial( { size: 0.1, vertexColors: vertexColors } );
points = new THREE.Points( geometry, material );
scene.add( points );
} );
//
renderer = new THREE.WebGLRenderer();
renderer.setPixelRatio( window.devicePixelRatio );
renderer.setSize( window.innerWidth, window.innerHeight );
document.body.appendChild( renderer.domElement );
//
window.addEventListener( 'resize', onWindowResize );
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize( window.innerWidth, window.innerHeight );
}
function animate() {
requestAnimationFrame( animate );
const delta = clock.getDelta();
if ( points ) {
points.rotation.x += delta * 0.2;
points.rotation.y += delta * 0.5;
}
renderer.render( scene, camera );
}
</script>
<script type="module">
import {PerspectiveCamera, Scene, BoxGeometry, MeshNormalMaterial, Mesh, WebGLRenderer} from 'https://cdn.skypack.dev/three';
let camera, scene, renderer;
let geometry, material, mesh;
init();
function init() {
camera = new PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 0.01, 10 );
camera.position.z = 1;
scene = new Scene();
geometry = new BoxGeometry( 0.2, 0.2, 0.2 );
material = new MeshNormalMaterial();
mesh = new Mesh( geometry, material );
scene.add( mesh );
renderer = new WebGLRenderer( { antialias: true } );
renderer.setSize( window.innerWidth, window.innerHeight );
renderer.setAnimationLoop( animation );
document.body.appendChild( renderer.domElement );
}
function animation( time ) {
mesh.rotation.x = time / 2000;
mesh.rotation.y = time / 1000;
renderer.render( scene, camera );
}
</script>
</body>
</html>
The second cubic mesh is rendered while the point cloud failed. I really do not know why.
XYZLoader.js (1.8 KB)
webgl_loader_xyz.html (3.3 KB)
three.module.js (1.1 MB)
helix_201.xyz (9.0 KB)
Remove the second <script type="module">
section in your HTML file an try again.
Hi, Thanks for the reply. But after the removal. The canvas becomes a blank canvas.