Je suis en mesure d'afficher un chiffre THREE.TubeGeometry comme suit affichage incrémentalement Three.js TubeGeometry
code ci-dessous, lien vers jsbin
<html>
<body>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r75/three.js"></script>
<script>
// global variables
var renderer;
var scene;
var camera;
var geometry;
var control;
var count = 0;
var animationTracker;
init();
drawSpline();
function init()
{
// create a scene, that will hold all our elements such as objects, cameras and lights.
scene = new THREE.Scene();
// create a camera, which defines where we're looking at.
camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 0.1, 1000);
// create a render, sets the background color and the size
renderer = new THREE.WebGLRenderer();
renderer.setClearColor('lightgray', 1.0);
renderer.setSize(window.innerWidth, window.innerHeight);
// position and point the camera to the center of the scene
camera.position.x = 0;
camera.position.y = 40;
camera.position.z = 40;
camera.lookAt(scene.position);
// add the output of the renderer to the html element
document.body.appendChild(renderer.domElement);
}
function drawSpline(numPoints)
{
var numPoints = 100;
// var start = new THREE.Vector3(-5, 0, 20);
var start = new THREE.Vector3(-5, 0, 20);
var middle = new THREE.Vector3(0, 35, 0);
var end = new THREE.Vector3(5, 0, -20);
var curveQuad = new THREE.QuadraticBezierCurve3(start, middle, end);
var tube = new THREE.TubeGeometry(curveQuad, numPoints, 0.5, 20, false);
var mesh = new THREE.Mesh(tube, new THREE.MeshNormalMaterial({
opacity: 0.9,
transparent: true
}));
scene.add(mesh);
renderer.render(scene, camera);
}
</script>
</body>
</html>
Cependant, je voudrais afficher progressivement, comme dans, comme un arc qui se charge, de telle sorte qu'il commence comme point de départ, dessine de façon incrémentielle et finalement regarde l'arc ci-dessous à la fin. J'ai fait un peu d'effort, et j'ai réussi à le faire en stockant tous les points/coordonnées couverts par l'arc, et en traçant des lignes entre les coordonnées consécutives, de manière à obtenir la sensation de 'chargement de l'arc incrémental'. Cependant, y a-t-il un meilleur moyen d'y parvenir? Ceci est le lien vers jsbin
Ajout du code ici et
<!DOCTYPE html>
<html>
<head>
<title>Incremental Spline Curve</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r75/three.js"></script>
<style>
body {
margin: 0;
overflow: hidden;
}
</style>
</head>
<script>
// global variables
var renderer;
var scene;
var camera;
var splineGeometry;
var control;
var count = 0;
var animationTracker;
// var sphereCamera;
var sphere;
var light;
function init() {
// create a scene, that will hold all our elements such as objects, cameras and lights.
scene = new THREE.Scene();
// create a camera, which defines where we're looking at.
camera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 0.1, 1000);
// create a render, sets the background color and the size
renderer = new THREE.WebGLRenderer();
// renderer.setClearColor(0x000000, 1.0);
renderer.setClearColor(0xffffff, 1);
renderer.setSize(window.innerWidth, window.innerHeight);
// position and point the camera to the center of the scene
camera.position.x = 0;
camera.position.y = 40;
camera.position.z = 40;
camera.lookAt(scene.position);
// add the output of the renderer to the html element
document.body.appendChild(renderer.domElement);
// //init for sphere
// sphereCamera = new THREE.PerspectiveCamera(45, window.innerWidth/window.innerHeight, 1, 1000);
// sphereCamera.position.y = -400;
// sphereCamera.position.z = 400;
// sphereCamera.rotation.x = .70;
sphere = new THREE.Mesh(new THREE.SphereGeometry(0.8,31,31), new THREE.MeshLambertMaterial({
color: 'yellow',
}));
light = new THREE.DirectionalLight('white', 1);
// light.position.set(0,-400,400).normalize();
light.position.set(0,10,10).normalize();
//get points covered by Spline
getSplineData();
}
//save points in geometry.vertices
function getSplineData() {
var curve = new THREE.CubicBezierCurve3(
new THREE.Vector3(-5, 0, 10),
new THREE.Vector3(0, 20, 0),
new THREE.Vector3(0, 20, 0),
new THREE.Vector3(2, 0, -25)
);
splineGeometry = new THREE.Geometry();
splineGeometry.vertices = curve.getPoints(50);
animate();
}
//scheduler loop
function animate() {
if(count == 50)
{
cancelAnimationFrame(animationTracker);
return;
}
//add line to the scene
drawLine();
renderer.render(scene, camera);
// renderer.render(scene, sphereCamera);
count += 1;
// camera.position.z -= 0.25;
// camera.position.y -= 0.25;
animationTracker = requestAnimationFrame(animate);
}
function drawLine() {
var lineGeometry = new THREE.Geometry();
var lineMaterial = new THREE.LineBasicMaterial({
color: 0x0000ff
});
console.log(splineGeometry.vertices[count]);
console.log(splineGeometry.vertices[count+1]);
lineGeometry.vertices.push(
splineGeometry.vertices[count],
splineGeometry.vertices[count+1]
);
var line = new THREE.Line(lineGeometry, lineMaterial);
scene.add(line);
}
// calls the init function when the window is done loading.
window.onload = init;
</script>
<body>
</body>
</html>
Inconvénient: L'inconvénient de le faire de la manière ci-dessus est que, à la fin de la journée, je dessine une ligne entre les points consécutifs , et ainsi je perds sur beaucoup d'effets possibles dans TubeGeometry tels que, épaisseur, transparence etc.
Veuillez me suggérer une manière alternative d'obtenir une charge incrémentielle douce pour le TubeGeometry.
merci beaucoup, c'est génial. J'ai passé un peu de temps à essayer de le comprendre et j'ai pu m'accorder à mon goût (jouer du violon comme commentaire suivant). Je viens d'avoir quelques questions. Q1.Je comprends nMax = geometry.attributes.position.count Qu'est-ce que nMax exactement? Est-ce que ma géométrie a été convertie en 24576 points? Est-ce que ces points définissent la géométrie que je veux dessiner? Dans votre violon, points.length == 18 et nMax == 245762. Q2.Vous mentionnez dans votre commentaire que vous affectez nStep à 90, car 30 faces * 3 sommets/face. Je n'ai pas compris, votre violon ressemble à un petit intestin, je ne vois pas 30 visages. :) – PepperBoy
Mon violon: http://jsbin.com/taqareyeqi/edit?html,js,output – PepperBoy
Conseil: étudiez et comprenez 'BufferGeometry'. Il serait utile que vous fassiez cela. Étudie aussi le violon pour que tu comprennes chaque ligne. (1) 'nMax' = nombre total de sommets (positions) dans la géométrie du tampon. 'points' est un tableau temporaire utilisé pour définir la courbe. (2) 'nStep' est maintenant beaucoup de vertices supplémentaires pour dessiner chaque image. Dans ce cas, 30 faces supplémentaires sont restituées à chaque image. (2b) Les visages sont minuscules. Il y en a beaucoup. :) – WestLangley