html3d万花筒,HTML5/WebGL交互式3D万花筒

JavaScript

语言:

JaveScriptBabelCoffeeScript

确定

var contianer, renderer, camera, scene;

var windowWidth = window.innerWidth;

var windowHeight = window.innerHeight;

var cube;

var cubes = [];

var center;

var bufferScene = new THREE.Scene();

var bufferTexture = new THREE.WebGLRenderTarget(window.innerWidth, window.innerHeight, {

minFilter: THREE.LinearFilter,

magFilter: THREE.NearestFilter

});

var triangleGeometry

var triangle;

var clock = new THREE.Clock();

var delta = 0;

var m;

var size;

var randomness = 0;

var rnd = 1;

init()

animate();

function init() {

container = document.createElement('div');

document.body.appendChild(container);

camera = new THREE.PerspectiveCamera(80, window.innerWidth / window.innerHeight, .1, 10000);

scene = new THREE.Scene();

renderer = new THREE.WebGLRenderer({

antialias: true

});

renderer.setSize(window.innerWidth, window.innerHeight);

container.appendChild(renderer.domElement);

//geometry

size = 100

var rot = Math.PI / 3

m = Math.sqrt(size * size - Math.pow(size / 2, 2))

var r = size / 2 * Math.sin(Math.PI / 3)

triangle = new THREE.Shape([

new THREE.Vector2(0, 0),

new THREE.Vector2(size / 2, (size / 2) / (1 / Math.tan(rot))),

new THREE.Vector2(-size / 2, (size / 2) / (1 / Math.tan(rot)))

]);

triangleGeometry = new THREE.ShapeGeometry(triangle);

triangleGeometry.computeFaceNormals();

triangleGeometry.faceVertexUvs[0][0][0] = new THREE.Vector2(0, 0);

triangleGeometry.faceVertexUvs[0][0][1] = new THREE.Vector2(0, 1);

triangleGeometry.faceVertexUvs[0][0][2] = new THREE.Vector2(1, 1);

triangleMirrored = new THREE.ShapeGeometry(triangle);

triangleMirrored.computeFaceNormals();

triangleMirrored.faceVertexUvs[0][0][2] = new THREE.Vector2(0, 0);

triangleMirrored.faceVertexUvs[0][0][1] = new THREE.Vector2(0, 1);

triangleMirrored.faceVertexUvs[0][0][0] = new THREE.Vector2(1, 1);

var kaleidoscope = new THREE.Object3D();

var sides = 6

for (var i = 0; i < sides + 1; i++) {

if (i % 2 == 0) {

var mesh = new THREE.Mesh(triangleGeometry, new THREE.MeshBasicMaterial({

map: bufferTexture.texture,

side: THREE.DoubleSide

}));

} else {

var mesh = new THREE.Mesh(triangleMirrored, new THREE.MeshBasicMaterial({

map: bufferTexture.texture,

side: THREE.DoubleSide

}));

}

kaleidoscope.add(mesh)

var rot = Math.PI / 3 * -i

var x = size / 2 * Math.cos(rot) * i;

var y = size / 2 * Math.sin(rot) * -i;

mesh.rotation.set(0, 0, rot);

}

scene.add(kaleidoscope)

// kaleidoscope.rotation.set(0,0,-Math.PI/6)

var allElems = new THREE.Object3D();

allElems.add(kaleidoscope)

var copy = kaleidoscope.clone()

copy.position.y = m;

copy.position.x = size * 1.5

allElems.add(copy)

var copy = kaleidoscope.clone()

copy.position.y = m * -1;

copy.position.x = size * 1.5

allElems.add(copy)

var copy = kaleidoscope.clone()

copy.position.y = m * -1;

copy.position.x = size * -1.5

allElems.add(copy)

var copy = kaleidoscope.clone()

copy.position.y = m * 1;

copy.position.x = size * -1.5

allElems.add(copy)

scene.add(allElems)

allElems.rotation.set(0, 0, Math.PI / 6)

camera.position.set(0, 0, 50)

for (var i = 0; i < 500; i++) {

var geometry = new THREE.BoxGeometry(Math.random() * 5, Math.random() * 5, Math.random() * 5);

var rand = Math.random()

var material = new THREE.MeshStandardMaterial({

color: 0xff0000,

metalness: rand

});

material.color.setHex(random(i) * 0xffffff)

material.depthTest = false

cube = new THREE.Mesh(geometry, material);

bufferScene.add(cube)

cube.position.set((Math.random() - .5) * size, (Math.random() - .5) * size, (Math.random() - .5) * size)

cube.rotation.set(0, Math.random() * Math.PI, Math.random() * Math.PI)

cubes.push(cube)

}

//light

var ambient = new THREE.AmbientLight(0xffffff);

bufferScene.add(ambient);

light = new THREE.SpotLight(0xffffff, 1, 0, Math.PI / 2);

light.position.set(600, 1500, 1000);

light.target.position.set(0, 0, 0);

bufferScene.add(light)

controls = new THREE.OrbitControls(camera, renderer.domElement);

controls.maxDistance = 70;

controls.minDistance = 45

controls.enableDamping = true;

controls.enablePan = false;

controls.enableRotate = false

controls.dampingFactor = .999;

window.addEventListener('resize', onWindowResize, false);

window.addEventListener('mousedown', randomize);

}

function randomize() {

randomness = Math.floor(time);

rnd = (Math.random() - .5) * 2;

}

function moveContent(time) {

var t = time * .2

delta = clock.getDelta()

for (var i = 0; i < cubes.length; i++) {

if (randomness % 2 == 0) {

cubes[i].position.x = rnd * random(i + randomness) * Math.sin(t + i) * size + .1;

}

if (randomness % 2 == 1) {

cubes[i].position.y = random(i * randomness) * Math.cos(t + i) * size;

}

cubes[i].rotation.set(random(i + randomness) + t, random(i + randomness) + t, random(i + randomness) + t, random(i + randomness) + t);

cubes[i].material.color.offsetHSL(delta / 10, 0, 0)

}

}

var time = 0;

function animate() {

time = performance.now() * 0.001;

moveContent(time);

renderer.render(bufferScene, camera, bufferTexture);

controls.update()

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);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值