sono in grado di visualizzare una figura THREE.TubeGeometry come segue incrementale visualizzazione Three.js TubeGeometry
codice qui sotto, link per 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>
Tuttavia, vorrei visualizzazione incrementale, come in, come un arco che si sta caricando, in modo tale che inizi come punto di partenza, disegna in modo incrementale e alla fine sembra l'arco sotto il completamento.
Ho messo un po 'di sforzo, e sono stato in grado di farlo memorizzando tutti i punti/coordinate coperte dall'arco, e disegnando linee tra le coordinate consecutive, in modo tale da ottenere la sensazione di' arco che carica in modo incrementale '. Tuttavia, c'è un modo migliore per raggiungere questo obiettivo? Questo è il link per jsbin
Aggiungendo il codice qui pure
<!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>
Svantaggio: Lo svantaggio di farlo nel modo sopra è che, alla fine della giornata, sto disegnando una linea tra punti consecutivi , quindi ho perso molti degli effetti possibili in TubeGeometry come spessore, trasparenza, ecc.
Per favore suggeriscimi un modo alternativo per ottenere un carico incrementale regolare per TubeGeometry.
grazie mille, è grandioso. Ho passato un po 'di tempo a cercare di capirlo ed è stato in grado di sintonizzare i miei gusti (violino come prossimo commento). Ho appena fatto un paio di domande. Q1. Capisco nMax = geometry.attributes.position.count Che cosa è esattamente nMax? La mia geometria è stata convertita in 24576 punti? Questi punti definiscono la geometria che voglio disegnare? Nel tuo violino, points.length == 18 and nMax == 245762. Q2. Nel tuo commento hai menzionato che assegni nStep a 90, perché 30 facce * 3 vertici/faccia. Non ho capito, il tuo violino sembra un intestino tenue, non vedo 30 facce. :) – PepperBoy
Il mio violino: http://jsbin.com/taqareyeqi/edit?html,js,output – PepperBoy
Consiglio amichevole: studia e capisci "BufferGeometry". Sarebbe utile per te farlo. Studia anche il violino così capisci ogni riga di esso. (1) 'nMax' = numero totale di vertici (posizioni) nella geometria del buffer. 'points' è una matrice temporanea utilizzata per definire la curva. (2) 'nStep' ora sono molti altri vertici per disegnare ogni fotogramma. In questo caso, 30 volti aggiuntivi sono resi ogni fotogramma. (2b) I volti sono piccoli. Ce ne sono molti. :) – WestLangley