Morphing Tubes
How do I make an morphing tubes?
Testing spline behaviour and morphing for Codevember 2016 Created by XORXOR, 2016 Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0). What is a morphing tubes? How do you make a morphing tubes? This script and codes were developed by XORXOR on 27 January 2023, Friday.
Morphing Tubes - Script Codes HTML Codes
<!DOCTYPE html>
<html >
<head> <meta charset="UTF-8"> <title>Morphing Tubes</title>
</head>
<body> <html> <head> <meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"> <title>[lines]</title> <style> body { margin: 0px; overflow: hidden; background-color: #FFB347; font-family: 'Arial'; } #help{ position: absolute; top: 1%; left: 1%; font-size: 30px; color: #489eba; } </style> </head> <body> </body>
</html> <script src='https://cdnjs.cloudflare.com/ajax/libs/three.js/r79/three.min.js'></script> <script src="js/index.js"></script>
</body>
</html>
Morphing Tubes - Script Codes JS Codes
var contianer, renderer, camera, scene;
var material;
var letters = [];
var vertices=[];
var offsets = [];
var targetVertices,currentVertices;
var mainGeometry
var vertexCount = 32;
var clock = new THREE.Clock();
var boxhelper;
var line;
var helpCube1,helpCube2;
var smallCubes = [];
var mainLines =[];
var time;
var step = 0;
var morphstep = 0;
var current = 0;
var target = 1;
var wait = true;
var waittimer = 0
var randomTarget = 0;
var randomCurrent = 0;
var prevRandom;
var helpCube3
init()
function init() { container = document.createElement('div'); document.body.appendChild(container); camera = new THREE.PerspectiveCamera( 120, window.innerWidth/window.innerHeight, .1, 100000 ); camera.position.set(0, 0, 5); scene = new THREE.Scene(); scene.fog = new THREE.FogExp2(0x5d4e46, .013); renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setSize(window.innerWidth, window.innerHeight); renderer.shadowMap.enabled = true; renderer.shadowMap.type = THREE.PCFSoftShadowMap; renderer.setClearColor(0x5d4e46); container.appendChild(renderer.domElement); var size = 10; //geometry for (var i = 0; i < 256; i++) { var curve = new THREE.CubicBezierCurve3(); for (var j = 0; j < 4; j++) { var vec = new THREE.Vector3(Math.floor(Math.random()*size)*size,Math.floor(Math.random()*size)*size,Math.floor(Math.random()*size)*size) vec.z -= Math.floor(Math.random()*size*j) vec.x += Math.floor(Math.random()*size*j) vec.y -= Math.floor(Math.random()*size*j) curve["v"+j] = vec } var geometry = new THREE.Geometry(); geometry.vertices = curve.getPoints( vertexCount ); if (i%32 ==0 ) { var lineGeometry = new THREE.Geometry(); for (var j = 0; j < vertexCount; j++) { var x = geometry.vertices[j].x; var y = geometry.vertices[j].y; var z = geometry.vertices[j].z; lineGeometry.vertices.push( new THREE.Vector3( x, y, z )) } var material = new THREE.LineBasicMaterial( { color : 0xffffff,linewidth:3} ); material.color.setHSL(1,0,100); var line = new THREE.Line( lineGeometry, material ); mainLines.push(line) scene.add( line ); } else{ vertices.push(geometry.vertices) } } boxhelper = new THREE.BoxHelper( line, 0xffffff ); scene.add( boxhelper ); //light var ambient = new THREE.AmbientLight( 0xffffff ); scene.add(ambient); var material = new THREE.MeshLambertMaterial({color: 0xa69e8f}); var smallCubeGeometry = new THREE.BoxBufferGeometry(.2,.2,.2); var s = 15 for (var i = 0; i < s; i++) { for (var j = 0; j < s; j++) { for (var k = 0; k < s; k++) { var smallCube = new THREE.Mesh(smallCubeGeometry, material); smallCube.position.set(i*10,j*10,k*10) scene.add(smallCube) } } } var solidMaterial = new THREE.MeshLambertMaterial({color: 0xffffff}); var helpCubeMesh = new THREE.SphereGeometry(1,32); helpCube1 = new THREE.Mesh(helpCubeMesh, solidMaterial); scene.add(helpCube1) helpCube2 = new THREE.Mesh(helpCubeMesh, solidMaterial); scene.add(helpCube2) window.addEventListener('resize', onWindowResize, false); animate();
}
function animate() { time = performance.now()*.0002 morphstep +=4; if (wait) { waittimer +=1; randomTarget = Math.floor(Math.random()*(vertices.length)) randomCurrent = Math.floor(Math.random()*(mainLines.length)) wait = false waittimer = 0; morphstep = 0; mainGeometry = mainLines[randomCurrent].geometry targetVertices = vertices[randomTarget] } else { boxhelper.update(mainLines[randomCurrent]); helpCube1.position.set(mainGeometry.vertices[0].x,mainGeometry.vertices[0].y,mainGeometry.vertices[0].z) helpCube2.position.set(mainGeometry.vertices[vertexCount-1].x,mainGeometry.vertices[vertexCount-1].y,mainGeometry.vertices[vertexCount-1].z) currentVertices = mainGeometry.vertices for (var i = 0; i < vertexCount; i++) { var point = currentVertices[i] var targetPoint = targetVertices[i] var x = point.x+(targetPoint.x - point.x) * morphstep/100; var y = point.y+(targetPoint.y - point.y) * morphstep/100; var z = point.z+(targetPoint.z - point.z) * morphstep/100; mainGeometry.vertices[i].x = x; mainGeometry.vertices[i].y = y; mainGeometry.vertices[i].z = z; } mainGeometry.verticesNeedUpdate = true; } step += 4; if (step%100 == 0 ) { wait = true morphstep = 100; } var r = 50//*Math.sqrt(2)/2 camera.position.set(r*Math.sin(time)+50,50,r*Math.cos(time)+50) camera.lookAt(new THREE.Vector3(50,50,50)) requestAnimationFrame(animate); renderer.render(scene, camera);
}
function random(seed) { var x = Math.sin(seed) * 10000; return x - Math.floor(x);
}
radians = function(degrees) { return degrees * Math.PI / 180;
};
function onWindowResize() { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize( window.innerWidth, window.innerHeight );
}
Developer | XORXOR |
Username | xorxor_hu |
Uploaded | January 27, 2023 |
Rating | 4.5 |
Size | 3,406 Kb |
Views | 4,048 |
Find the perfect freelance services for your business! Fiverr's mission is to change how the world works together. Fiverr connects businesses with freelancers offering digital services in 500+ categories. Find Developer!
Name | Size |
Birds | 5,934 Kb |
Pipes | 3,300 Kb |
2050 | 3,612 Kb |
Cubic Tunnel | 4,791 Kb |
Grid of Birds | 3,512 Kb |
Complex Form with Black and White Bands | 3,209 Kb |
Complex Form with Black and White Spirals | 3,340 Kb |
Pastel Pump | 3,763 Kb |
The Walking Raymarcher | 7,934 Kb |
Kaleidoscope | 3,536 Kb |
Jasper is the AI Content Generator that helps you and your team break through creative blocks to create amazing, original content 10X faster. Discover all the ways the Jasper AI Content Platform can help streamline your creative workflows. Start For Free!
Name | Username | Size |
Pericles mi loro... | Judag | 4,125 Kb |
Twitch TV | Natester13 | 4,488 Kb |
Material Design-Layout-Principles Practice | Fraina | 2,331 Kb |
Highbrow Basic HTML Lesson 8 | Kimlarocca | 2,094 Kb |
3d css cube | Semenchenko | 4,578 Kb |
Coming Soon | MariamMassadeh | 1,680 Kb |
Simple star rating using js and data-uri | TheEnd | 5,795 Kb |
Scroll to top button | DominicFrancois | 3,743 Kb |
Popover Example | Seanboom | 2,429 Kb |
Cloudy Spiral CSS animation | Hakimel | 6,587 Kb |
Surf anonymously, prevent hackers from acquiring your IP address, send anonymous email, and encrypt your Internet connection. High speed, ultra secure, and easy to use. Instant setup. Hide Your IP Now!