wavey-wind/test.js

494 lines
12 KiB
JavaScript
Raw Normal View History

2021-08-12 18:10:19 +02:00
console.log("Hello, Sky!");
/**** ******
2021-09-08 18:56:44 +02:00
/ Test skripta *
2021-08-12 18:10:19 +02:00
************/
2022-11-30 12:55:09 +01:00
// Ker kegel imamo?
var izbranKegel = 1;
if (window.location.hash.indexOf('kegel') > -1) {
izbranKegel = window.location.hash.split('=')[1];
}
2021-08-12 18:10:19 +02:00
// Vidni kot
var FOV = 90;
2021-08-12 18:10:19 +02:00
2021-12-24 07:17:42 +01:00
// Parametri rotacije (euler)
2021-08-12 18:10:19 +02:00
var rotacijaX = 0.000;
var rotacijaY = 0.000;
var rotacijaZ = 0.000;
2021-12-24 07:17:42 +01:00
// Parametri pospeska
var accX = 0.000;
var accY = 0.000;
var accZ = 0.000;
2022-11-30 16:25:09 +01:00
var deformiraj = false;
2021-08-12 18:10:19 +02:00
// Scena, kamera in render
2022-11-28 14:28:45 +01:00
var scene = new THREE.Scene;
window.scene = scene;
2021-08-12 18:10:19 +02:00
2022-11-30 12:55:09 +01:00
/*
const axesHelper = new THREE.AxesHelper( 5 );
scene.add( axesHelper );
*/
var camera = new THREE.PerspectiveCamera(FOV, window.innerWidth / window.innerHeight, 0.1, 2000);
2022-11-28 14:28:45 +01:00
window.camera = camera;
2022-11-30 17:21:03 +01:00
// Polozaj kamere
camera.position.z = 10;
2021-08-12 18:10:19 +02:00
2022-11-30 12:55:09 +01:00
var renderer = new THREE.WebGLRenderer({
2021-08-12 18:10:19 +02:00
alpha: true
});
renderer.setSize(window.innerWidth, window.innerHeight);
// Belo ozadje
renderer.setClearColor(0xFFFFFF, 1);
// Črno ozadje
//renderer.setClearColor(0x000000, 1);
2022-11-30 12:55:09 +01:00
//var skupina = new THREE.Group();
2021-12-24 07:17:42 +01:00
2022-11-30 16:25:09 +01:00
/********
* KEGEL *
*********/
// Sirina in visina test objekta
var width = 16;
var height = 128;
var radialnihSegmentov = 4;
var visinskihSegmentov = 128;
2022-11-30 16:25:09 +01:00
var geo = new THREE.BufferGeometry();
var offset = width;
var polozaji = [];
// visina: 128 segmentov
// sirina: 9 segmentov
var sirinaSegmentov = 9;
// Najprej "spodnja buba"
var faktor = [
2/sirinaSegmentov, 2/sirinaSegmentov
];
// Pol rocaj (1.4 do 2.8 segmenta, dolgo 62 segmentov)
var rocajSegmentov = 46;
for (var i = 0; i <= rocajSegmentov; i++) {
faktor.push((1.4 + i / rocajSegmentov * 1.4) / sirinaSegmentov);
}
// pol stresica dol (2.8 do 7.4 segmenta)
var stresicaSegmentov = 48;
for (i = 0; i <= stresicaSegmentov; i++) {
faktor.push((2.8 + i / stresicaSegmentov * 4.6) / sirinaSegmentov);
}
// Pa se zadnji naklon (7.4 do 3 segmente)
var konecSegmentov = 30;
for (i = 0; i <= konecSegmentov; i++) {
faktor.push((7.4 - i / konecSegmentov * 4.4) / sirinaSegmentov);
}
// spodnji krog
for (var s = 0; s < radialnihSegmentov; s++) {
polozaji.push(
0.0,
0.0,
0.0,
Math.sin(2 * Math.PI * s / radialnihSegmentov) * width * faktor[0],
Math.cos(2 * Math.PI * s / radialnihSegmentov) * width * faktor[0],
0.0,
Math.sin(2 * Math.PI * (s + 1) / radialnihSegmentov) * width * faktor[0],
Math.cos(2 * Math.PI * (s + 1) / radialnihSegmentov) * width * faktor[0],
0.0
);
}
console.log(polozaji);
// vmesni segmenti
for (var h = 0; h < visinskihSegmentov; h++) {
for (s = 0; s < radialnihSegmentov; s++) {
polozaji.push(
Math.sin(2 * Math.PI * s / radialnihSegmentov) * width * faktor[h],
Math.cos(2 * Math.PI * s / radialnihSegmentov) * width * faktor[h],
h * height / visinskihSegmentov,
Math.sin(2 * Math.PI * (s + 1) / radialnihSegmentov) * width * faktor[h],
Math.cos(2 * Math.PI * (s + 1) / radialnihSegmentov) * width * faktor[h],
h * height / visinskihSegmentov,
Math.sin(2 * Math.PI * (s + 1) / radialnihSegmentov) * width * faktor[h],
Math.cos(2 * Math.PI * (s + 1) / radialnihSegmentov) * width * faktor[h],
(h + 1) * height / visinskihSegmentov,
);
}
}
// zgornji krog
for (s = 0; s < radialnihSegmentov; s++) {
polozaji.push(
0,
0,
height,
Math.sin(2 * Math.PI * s / radialnihSegmentov) * width * faktor[31],
Math.cos(2 * Math.PI * s / radialnihSegmentov) * width * faktor[31],
height,
Math.sin(2 * Math.PI * (s + 1) / radialnihSegmentov) * width * faktor[31],
Math.cos(2 * Math.PI * (s + 1) / radialnihSegmentov) * width * faktor[31],
height
);
}
2022-11-28 14:01:32 +01:00
for (i = 0; i < polozaji.length; i++) {
if (i % 3 == 2) {
polozaji[i] -= height / 2;
}
}
// Spremeni v vertexe
var vertices = new Float32Array(polozaji);
geo.setAttribute('position', new THREE.BufferAttribute(vertices, 3));
window.geo = geo;
2022-11-30 12:55:09 +01:00
var barva = new THREE.Color(0, 0, 0);
var barvaDodatni = new THREE.Color();
barvaDodatni.setHSL(0.6, 1.0, 0.5);
2021-08-12 18:10:19 +02:00
var mat = new THREE.MeshBasicMaterial({
//color: 0xff00ff,
color: barva,
2022-11-30 12:55:09 +01:00
wireframe: true,
transparent: true
2021-08-12 18:10:19 +02:00
});
window.mat = mat;
//var mat = new THREE.LineBasicMaterial({ color: 0xff00ff });
2022-11-30 16:25:09 +01:00
var kegel = new THREE.Mesh(geo.clone(), mat);
2022-11-30 17:21:03 +01:00
kegel.position.z = 20; // gor / dol
kegel.position.y = -30; // levo / desno
kegel.position.x = 12; // levo / desno drugic
if (izbranKegel == 1) {
kegel.position.x -= 10;
kegel.position.y += 8;
kegel.position.z += 3;
2022-11-30 12:55:09 +01:00
}
2022-11-30 16:25:09 +01:00
/*********
* ZOGICE *
*********/
var barvnaPaleta = [
new THREE.Color(0x003F5C),
new THREE.Color(0x58508D),
new THREE.Color(0xBC5090),
new THREE.Color(0xFF6361),
new THREE.Color(0xFFA600),
// Simetrija
new THREE.Color(0xFF6361),
new THREE.Color(0xBC5090),
new THREE.Color(0x58508D),
];
console.log(barvnaPaleta);
var barvnaPaletaIdx = 0;
2022-11-30 12:55:09 +01:00
var barvaKrogleO = new THREE.Color();
barvaKrogleO.setHSL(Math.random(), 0.8, 0.5);
function novaKrogla () {
2022-11-30 16:25:09 +01:00
//var barvaKrogle = barvaKrogleO.clone();
var barvaKrogle = barvnaPaleta[barvnaPaletaIdx];
2022-11-30 12:55:09 +01:00
var mat = new THREE.MeshBasicMaterial({
color: barvaKrogle,
wireframe: true,
transparent: true
});
var velikost = 1 + Math.random() * 5;
var kroglaGeo = new THREE.SphereGeometry(velikost, 12, 12);
var krogla = new THREE.Mesh(kroglaGeo, mat);
krogla.position.x = (Math.random() - 1) * 200;
krogla.position.y = (Math.random() - 1) * 10;
krogla.position.z = (Math.random() - 1) * 300;
krogla.position.y -= 100;
krogla.position.x += 150;
krogla.position.z += 230; // gor/dol
//krogla.position.y += 200;
scene.add(krogla);
krogle.push(krogla);
}
//skupina.add(kegel);
2021-12-24 07:17:42 +01:00
// Za pospeskomer - os X
var gAX = new THREE.CylinderGeometry(10, 10, 10, 16);
2022-01-01 22:10:59 +01:00
var mAX = new THREE.MeshBasicMaterial({ color: 0xff000055 });
2021-12-24 07:17:42 +01:00
var AX = new THREE.Mesh(gAX, mAX);
//skupina.add(AX);
2021-12-24 07:17:42 +01:00
// Damo vse skupaj v kader
2022-11-30 12:55:09 +01:00
// scene.add(skupina);
scene.add(kegel);
2021-12-24 07:17:42 +01:00
// Quaternioni za rotacijo in kalibracijo
var qWW = new THREE.Quaternion();
2022-11-30 12:55:09 +01:00
var qPrej = new THREE.Quaternion();
var qObj = new THREE.Quaternion();
var qStart = new THREE.Quaternion();
2021-12-24 07:17:42 +01:00
var reset = false;
2022-11-28 14:28:45 +01:00
var calibrate = true;
2021-09-08 18:56:44 +02:00
2021-08-12 18:10:19 +02:00
var objekti = [kegel];
2022-11-30 12:55:09 +01:00
var dodatniObjekti = [];
var krogle = [];
var stevec = 0;
2022-11-30 12:55:09 +01:00
// Zacetna orientacija kegla
2022-11-28 14:28:45 +01:00
scene.rotation.x = 90;
2022-11-30 12:55:09 +01:00
scene.rotation.z = 270;
//skupina.position.z = 32;
//skupina.position.y = -100;
2022-11-28 14:28:45 +01:00
2022-11-30 12:55:09 +01:00
function inputHandle () {
if (kbdPressed.c) {
calibrate = true;
sendAll('/ww/calibrate');
}
2022-11-30 16:25:09 +01:00
if (kbdPressed['-']) {
sendAll('/ww/reload');
window.location.reload();
}
if (kbdPressed.d) {
deformiraj = !deformiraj
}
2022-11-30 12:55:09 +01:00
}
2021-08-12 18:10:19 +02:00
function render () {
2021-12-24 07:17:42 +01:00
requestAnimationFrame(render);
renderer.render(scene, camera);
2022-11-30 12:55:09 +01:00
stevec += 1;
2021-12-24 07:17:42 +01:00
objAnim();
2022-11-30 12:55:09 +01:00
inputHandle();
2022-11-30 17:21:03 +01:00
while (krogle.length > 50) {
scene.remove(krogle[0]);
krogle.shift();
2022-11-30 12:55:09 +01:00
}
2021-08-12 18:10:19 +02:00
};
// Funkcija za animacijo objektov
function objAnim() {
2022-11-28 14:28:45 +01:00
// Rotacija kegla
2021-08-12 18:10:19 +02:00
objekti.map(function (obj) {
2021-12-24 07:17:42 +01:00
// Apliciramo rotacijo (po quaternionih - eulerji zajebavajo.)
qObj = qWW.clone();
qObj.multiply(qStart);
obj.setRotationFromQuaternion(qObj);
2022-01-01 22:10:59 +01:00
AX.scale.x = accX / 1000;
2022-11-30 16:25:09 +01:00
// Deformiranje kegla!
// Random 500 zamaknemo
if (deformiraj) {
var koti = obj.geometry.attributes.position.array;
var faktorD = 5;
for (var i = 0; i < 500; i++) {
koti[Math.floor(Math.random() * koti.length)] += (Math.random() - 1) * faktorD;
}
}
// In priblizamo osnovni geometriji
var koti = kegel.geometry.attributes.position.array;
for (var i = 0; i < koti.length; i++) {
koti[i] = (geo.attributes.position.array[i] - koti[i]) * 0.75;
}
obj.geometry.attributes.position.needsUpdate = true;
2021-08-12 18:10:19 +02:00
});
2022-11-30 12:55:09 +01:00
// Ce jih je prevec, pucaj
while (dodatniObjekti.length > 100) {
scene.remove(dodatniObjekti[0]);
dodatniObjekti.shift();
}
dodatniObjekti.map(function (obj) {
// Apliciramo rotacijo (po quaternionih - eulerji zajebavajo.)
qObj = qWW.clone();
//qObj.multiply(obj.qStart).multiply(qStart);
//obj.setRotationFromQuaternion(qObj);
obj.translateOnAxis(obj.premakniAxis, obj.premakniKolicina);
// obj.material.color.offsetHSL(0, 0, 0.003);
obj.material.opacity *= 0.98;
obj.premakniKolicina *= 0.98;
var dQ = obj.quaternion.multiply(obj.rotirajQ);
/*
dQ.multiply(obj.rotirajQ);
obj.setRotationFromQuaternion(dQ);
*/
/*
obj.premakni.x *= 1.1;
obj.premakni.y *= 1.1;
obj.premakni.z *= 1.1;
*/
obj.material.opacity *= 0.98;
});
barvaKrogleO.offsetHSL(-(2/1000), 0, 0);
krogle.map(function (obj) {
obj.material.opacity *= 0.98;
2022-11-30 16:25:09 +01:00
var scaleF = 0.05;
obj.scale.x += scaleF;
obj.scale.y += scaleF;
obj.scale.z += scaleF;
2022-11-30 12:55:09 +01:00
});
2021-12-24 07:17:42 +01:00
2022-11-28 14:28:45 +01:00
// Kalibracija rotacije kegla
if (calibrate) {
qStart = qWW.clone();
qStart.conjugate();
calibrate = false;
console.log("RESET!");
}
// rotiramo skupino da se vidi
//skupina.rotation.x += 0.003;
//skupina.rotation.y += 0.005;
//skupina.rotation.z += 0.007;
if (kegel.scale.x > 1) {
kegel.scale.x *= 0.95;
}
if (kegel.scale.z > 1) {
kegel.scale.z *= 0.95;
}
2022-11-30 12:55:09 +01:00
// Dupliranje keglov
//console.log(accX);
kegel.material.color.offsetHSL(2 / 1000, 0, 0);
if (accX > 1/* && (stevec % 10) == 0*/) {
var dodatni = kegel.clone();
dodatni.renderOrder = stevec;
var dodatniMat = kegel.material.clone();
var dodatniBarva = barvaDodatni.clone();
dodatniMat.color = dodatniBarva;
dodatni.material = dodatniMat;
dodatni.premakniAxis = new THREE.Vector3(
Math.random(),
Math.random(),
Math.random()
);
dodatni.premakniKolicina = (Math.random() - 1) * 10;
var rQ = qWW.clone();
rQ.invert();
rQ.multiply(qPrej);
dodatni.rotirajQ = rQ;
//dodatni.qStart = kegel.quaternion.clone();
dodatniObjekti.push(dodatni);
scene.add(dodatni);
2021-12-24 07:17:42 +01:00
}
2021-08-12 18:10:19 +02:00
};
// Inicializiraj
document.onreadystatechange = function () {
2022-11-30 12:55:09 +01:00
if (document.readyState === 'complete') {
document.getElementById("anim-container").appendChild(renderer.domElement);
render();
}
2021-08-12 18:10:19 +02:00
};
// Lep risajz
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}
window.addEventListener('resize', onWindowResize, false);
2021-08-14 15:15:16 +02:00
// Poslusaj OSC evente
2022-11-25 12:36:15 +01:00
var keysPressed = [0, 0, 0, 0];
2021-08-14 15:15:16 +02:00
2021-09-08 18:56:44 +02:00
const getVal = function (msg) {
return msg.value;
}
2022-11-30 12:55:09 +01:00
var prepend = `/ww/0/ww/${izbranKegel}`;
console.log('prepend!', prepend);
2022-11-25 12:36:15 +01:00
var oscCallbacks = {};
oscCallbacks[`${prepend}'/keys`] = function(args) {
keysPressed = args.map(getVal);
};
oscCallbacks[`${prepend}/quaternion`] = function (args) {
// Popravimo osi (w x y z po defaultu HMM)
2022-11-30 12:55:09 +01:00
[qPrej.w, qPrej.x, qPrej.y, qPrej.z] = [qWW.w, qWW.x, qWW.y, qWW.z];
2022-11-25 12:36:15 +01:00
[qWW.w, qWW.x, qWW.y, qWW.z] = args.map(getVal);
};
oscCallbacks[`${prepend}/accel`] = function (args) {
[accX, accY, accZ] = args.map(getVal);
};
oscCallbacks[`${prepend}/gyro`] = function (args) {
[rotacijaX, rotacijaY, rotacijaZ] = args.map(getVal);
};
2022-11-30 12:55:09 +01:00
oscCallbacks['/ww/calibrate'] = function () {
calibrate = true;
};
2022-11-30 16:25:09 +01:00
oscCallbacks['/ww/reload'] = function () {
window.location.reload();
};
2022-11-30 17:21:03 +01:00
oscCallbacks['/midi-in'] = function (args) {
//console.log("MAMOMO MIDI!", args);
2022-11-30 12:55:09 +01:00
var minus = (izbranKegel == 1) ? -1 : 1;
// kegel.material.color.offsetHSL(minus * args[2].value / 1000, 0, 0);
barvaDodatni.offsetHSL(minus * args[2].value / 1000, 0, 0);
if (Math.random() < 0.5) {
kegel.scale.x *= 1.5;
} else {
kegel.scale.z *= 1.5;
}
//kegel.scale.y *= 1 + (args[2] / 100000);
//kegel.scale.z *= 1 + (args[2] / 100000);
2022-11-30 17:21:03 +01:00
novaKrogla();
barvnaPaletaIdx = (barvnaPaletaIdx + 1) % barvnaPaleta.length;
};
2022-11-28 14:28:45 +01:00
const kbdPressed = {
a: false,
s: false,
d: false,
f: false,
c: false
};
window.addEventListener('keydown', (e) => {
kbdPressed[e.key] = true;
});
window.addEventListener('keyup', (e) => {
if (e.key in kbdPressed) {
kbdPressed[e.key] = false;
}
});