JavaScript
语言:
JaveScriptBabelCoffeeScript
确定
var container;
var scene, camera, renderer;
var material, shaderUniforms = {},
shaderAttributes = {};
var plane;
var center = {
cx: 0,
cy: 0
};
var infoText = document.getElementById("complex-number");
var complexC = {
cx: -0.13573,
cy: -0.650
};
var time = 0;
var control = function() {
this.cx = 0.24;
this.cy = 0.64;
this.useMouse = true;
};
var gui = new dat.GUI({
width: 500
});
var controller = new control();
gui.add(controller, 'cx', -2.0, 2.0).step(0.01).listen();
gui.add(controller, 'cy', -2.0, 2.0).step(0.01).listen();
gui.add(controller, 'useMouse');
init();
createPlane();
tick();
function init() {
createScene();
center = {
x: window.innerWidth / 2,
y: window.innerHeight / 2
};
}
window.onresize = function() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
scene.getObjectByName("plane").geometry = new THREE.PlaneGeometry(window.innerWidth, window.innerWidth);
shaderUniforms.uResolution.x = window.innerWidth;
shaderUniforms.uResolution.y = window.innerHeight;
render();
};
window.onmousemove = function(e) {
complexC = {
cx: (e.clientX - center.x) / (window.innerWidth / 2) * 1,
cy: -(e.clientY - center.y) / (window.innerHeight / 2) * 1
};
};
function setUniforms() {
shaderUniforms = {
uResolution: {
type: "v2",
value: new THREE.Vector2(window.innerWidth, window.innerHeight)
},
uC: {
type: "v2",
value: new THREE.Vector2(complexC.cx, complexC.cy)
}
};
}
function createScene() {
container = document.getElementById('container');
scene = new THREE.Scene();
camera = new THREE.PerspectiveCamera(45, window.innerWidth / window.innerHeight, 1, 1000);
camera.position.z = 250;
camera.lookAt(scene.position);
renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.setClearColor(0xffccff, 1);
container.appendChild(renderer.domElement);
}
function render() {
renderer.render(scene, camera);
}
function tick() {
requestAnimationFrame(tick);
update();
render();
}
function createPlane() {
setUniforms();
material = new THREE.ShaderMaterial({
attributes: shaderAttributes,
uniforms: shaderUniforms,
vertexShader: document.getElementById("vertexShader").textContent,
fragmentShader: document.getElementById("fragmentShader").textContent
});
var planeGeom = new THREE.PlaneGeometry(window.innerWidth, window.innerWidth);
plane = new THREE.Mesh(planeGeom, material);
plane.name = "plane";
scene.add(plane);
}
function update() {
if (controller.useMouse) {
shaderUniforms.uC.value.x = complexC.cx;
shaderUniforms.uC.value.y = complexC.cy;
controller.cx = complexC.cx;
controller.cy = complexC.cy;
} else {
shaderUniforms.uC.value.x = controller.cx;
shaderUniforms.uC.value.y = controller.cy;
}
infoText.innerHTML = 'C = ( ' + complexC.cx.toFixed(5) + ', ' + complexC.cy.toFixed(5) + 'i )';
}