I'm new to three.js and just tried some ideas. Now the problem is I created a line in the scene and used it as a base to clone and transform. So that the cloned ones will be shown as a sequence of transformation in the scene.
The simplified code is like:
var line, scene, camera, light, renderer;
var frame = 0;
var random_degree = Math.round(Math.random() * 360);
var container = document.getElementById( 'container' );
init();
animate();
function init() {
renderer = new THREE.WebGLRenderer();
renderer.setSize( window.innerWidth, window.innerHeight );
container.appendChild( renderer.domElement );
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera( 70, window.innerWidth / window.innerHeight, 1, 1000 );
scene.add( camera );
camera.position.x = 0;
camera.position.y = 0;
camera.position.z = 200;
var material = new THREE.LineBasicMaterial({
transparent: true,
color: 0x0000ff
});
var geometry = new THREE.Geometry();
geometry.vertices.push(
new THREE.Vector3( -100, 0, 0 ),
new THREE.Vector3( 0, 100, 0 ),
new THREE.Vector3( 100, 0, 0 )
);
line = new THREE.Line( geometry, material );
//borrowed the code from http://threejs.org/docs/#Reference/Objects/Line
//just wanted to make it simple
}
function animate() {
requestAnimationFrame( animate );
frame ++;
if( frame < 1500){
var newCurve = line.clone();
newCurve.rotation.x = ((random_degree + frame * 0.25) % 360) * Math.PI / 180;
newCurve.rotation.y = ((random_degree + frame * 0.25) % 360) * Math.PI / 180;
newCurve.rotation.z = ((random_degree + frame * 0.25) % 360) * Math.PI / 180;
newCurve.material.opacity = 0.2;
scene.add(newCurve);
}
renderer.render( scene, camera );
}
and The html part is just <div id='container'></div>
It is all working well, but as you can see that I can only limit the new line numbers to 1500, when the line number is over 2000, I started to get rendering problem, the the fps drops quickly after then when the number of lines increasing.
I tried to merge like:
var totalGeometry = new THREE.Geometry();
....
function init(){
....
for(var i=0; i< 1500; i++){
var newCurve = line.clone();
newCurve.rotation.x = ((random_degree + frame * 0.25) % 360) * Math.PI / 180;
newCurve.rotation.y = ((random_degree + frame * 0.25) % 360) * Math.PI / 180;
newCurve.rotation.z = ((random_degree + frame * 0.25) % 360) * Math.PI / 180;
newCurve.updateMatrix();
totalGeometry.merge(newCurve.geometry, newCurve.matrix);
}
var totalLine = new THREE.Line(totalGeometry, material);
....
}
But I can only merge in the init process not in the rendering process. If I use the above code in function animate()
, It only render one line instead of a whole group of lines:
function animate(){
.....
if( frame < 1500){
var newCurve = curve1.clone();
newCurve.rotation.x = ((random_degree + frame * 0.25) % 360) * Math.PI / 180;
newCurve.rotation.y = ((random_degree + frame * 0.25) % 360) * Math.PI / 180;
newCurve.rotation.z = ((random_degree + frame * 0.25) % 360) * Math.PI / 180;
newCurve.material.opacity = 0.2;
newCurve.updateMatrix();
totalGeo.merge(newCurve.geometry, newCurve.matrix);
totalMesh = new THREE.Line(totalGeo, newCurve.material);
scene.add(totalMesh);
}
}
Anyone got suggestions? Thanks.