На странице есть канвас, который рендерится через Three.js. Вот он:
Service.js
var Scamera = void 0,
Sscene = void 0,
Srenderer = void 0;
var Splane = void 0;
var Sraycaster = new THREE.Raycaster();
var SnormalizedMouse = {
x: 0,
y: -180
};
var lightBlue = {
r: 34,
g: 183,
b: 236
};
var darkBlue = {
r: 0,
g: 132,
b: 184
};
var baseColorRGB = darkBlue;
var baseColor = "rgb(" + baseColorRGB.r + "," + baseColorRGB.g + "," + baseColorRGB.b + ")";
var nearStars = void 0,
farStars = void 0,
farthestStars = void 0;
var canv = $('#service-bg canvas');
function init() {
Scamera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
Srenderer = new THREE.WebGLRenderer();
// Scene initialization
Scamera.position.z = 50;
Srenderer.setClearColor("#121212", 1.0);
var height = $('.services').innerHeight();
Srenderer.setSize($(window).width(), height);
Srenderer.setPixelRatio(window.devicePixelRatio);
document.getElementById('service-bg').appendChild(Srenderer.domElement);
// Lights
var topLight = new THREE.DirectionalLight(0xffffff, 1);
topLight.position.set(0, 1, 1).normalize();
Sscene.add(topLight);
var bottomLight = new THREE.DirectionalLight(0xffffff, 0.4);
bottomLight.position.set(1, -1, 1).normalize();
Sscene.add(bottomLight);
var skyLightRight = new THREE.DirectionalLight(0x666666, 0.2);
skyLightRight.position.set(-1, -1, 0.2).normalize();
Sscene.add(skyLightRight);
var skyLightCenter = new THREE.DirectionalLight(0x666666, 0.2);
skyLightCenter.position.set(-0, -1, 0.2).normalize();
Sscene.add(skyLightCenter);
var skyLightLeft = new THREE.DirectionalLight(0x666666, 0.2);
skyLightLeft.position.set(1, -1, 0.2).normalize();
Sscene.add(skyLightLeft);
// Mesh creation
var geometry = new THREE.PlaneGeometry(400, 400, 70, 70);
var darkBlueMaterial = new THREE.MeshPhongMaterial({ color: 0xffffff, shading: THREE.FlatShading, side: THREE.DoubleSide, vertexColors: THREE.FaceColors });
geometry.vertices.forEach(function (vertice) {
vertice.x += (Math.random() - 0.5) * 4;
vertice.y += (Math.random() - 0.5) * 4;
vertice.z += (Math.random() - 0.5) * 4;
vertice.dx = Math.random() - 0.5;
vertice.dy = Math.random() - 0.5;
vertice.randomDelay = Math.random() * 5;
});
for (var i = 0; i < geometry.faces.length; i++) {
geometry.faces[i].color.setStyle(baseColor);
geometry.faces[i].baseColor = baseColorRGB;
}
Splane = new THREE.Mesh(geometry, darkBlueMaterial);
Sscene.add(Splane);
// Create stars
farthestStars = createStars(1200, 420, "#0952BD");
farStars = createStars(1200, 370, "#A5BFF0");
nearStars = createStars(1200, 290, "#118CD6");
Sscene.add(farthestStars);
Sscene.add(farStars);
Sscene.add(nearStars);
farStars.rotation.x = 0.25;
nearStars.rotation.x = 0.25;
// Uncomment for testing second camera position
// camera.rotation.x = Math.PI / 2;
// camera.position.y = -0;
// camera.position.z = 20;
// plane.scale.x = 2;
}
function createStars(amount, yDistance) {
var color = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "0x000000";
var opacity = Math.random();
var starGeometry = new THREE.Geometry();
var starMaterial = new THREE.PointsMaterial({ color: color, opacity: opacity });
for (var i = 0; i < amount; i++) {
var vertex = new THREE.Vector3();
vertex.z = (Math.random() - 0.5) * 1500;
vertex.y = yDistance;
vertex.x = (Math.random() - 0.5) * 1500;
starGeometry.vertices.push(vertex);
}
return new THREE.Points(starGeometry, starMaterial);
}
var timer = 0;
function render() {
requestAnimationFrame(render);
timer += 0.01;
var vertices = Splane.geometry.vertices;
for (var i = 0; i < vertices.length; i++) {
// Ease back to original vertice position while still maintaining sine wave
vertices[i].x -= Math.sin(timer + vertices[i].randomDelay) / 40 * vertices[i].dx;
vertices[i].y += Math.sin(timer + vertices[i].randomDelay) / 40 * vertices[i].dy;
// ((vertices[i].x - vertices[i].originalPosition.x) * 0.1) +
}
// Determine where ray is being projected from camera view
Sraycaster.setFromCamera(SnormalizedMouse, Scamera);
// Send objects being intersected into a variable
var intersects = Sraycaster.intersectObjects([Splane]);
if (intersects.length > 0) {
var faceBaseColor = intersects[0].face.baseColor;
Splane.geometry.faces.forEach(function (face) {
face.color.r *= 255;
face.color.g *= 255;
face.color.b *= 255;
face.color.r += (faceBaseColor.r - face.color.r) * 0.01;
face.color.g += (faceBaseColor.g - face.color.g) * 0.01;
face.color.b += (faceBaseColor.b - face.color.b) * 0.01;
var rInt = Math.floor(face.color.r);
var gInt = Math.floor(face.color.g);
var bInt = Math.floor(face.color.b);
var newBasecol = "rgb(" + rInt + "," + gInt + "," + bInt + ")";
face.color.setStyle(newBasecol);
});
Splane.geometry.colorsNeedUpdate = true;
intersects[0].face.color.setStyle("#006ea0");
Splane.geometry.colorsNeedUpdate = true;
}
Splane.geometry.verticesNeedUpdate = true;
Splane.geometry.elementsNeedUpdate = true;
farthestStars.rotation.y -= 0.00001;
farStars.rotation.y -= 0.00005;
nearStars.rotation.y -= 0.00011;
Srenderer.render(scene, Scamera);
}
init();
window.addEventListener("resize", function () {
Scamera.aspect = window.innerWidth / window.innerHeight;
Scamera.updateProjectionMatrix();
Srenderer.setSize(window.innerWidth, window.innerHeight);
});
window.addEventListener("mousemove", function (event) {
// Normalize mouse coordinates
SnormalizedMouse.x = event.clientX / window.innerWidth * 2 - 1;
SnormalizedMouse.y = -(event.clientY / window.innerHeight) * 2 + 1;
});
var introContainer = $('.intro-container');
var skyContainer = $('.sky-container');
var xMark = $('.x-mark');
$('.shift-camera-button').click(function () {
var introTimeline = new TimelineMax();
introTimeline.add([TweenLite.fromTo(introContainer, 0.5, { opacity: 1 }, { opacity: 0, ease: Power3.easeIn }), TweenLite.to(Scamera.rotation, 3, { x: Math.PI / 2, ease: Power3.easeInOut }), TweenLite.to(Scamera.position, 2.5, { z: 20, ease: Power3.easeInOut }), TweenLite.to(Scamera.position, 3, { y: 120, ease: Power3.easeInOut }), TweenLite.to(Splane.scale, 3, { x: 2, ease: Power3.easeInOut })]);
introTimeline.add([TweenLite.to(xMark, 2, { opacity: 1, ease: Power3.easeInOut }), TweenLite.to(skyContainer, 2, { opacity: 1, ease: Power3.easeInOut })]);
});
$('.x-mark').click(function () {
var outroTimeline = new TimelineMax();
outroTimeline.add([TweenLite.to(xMark, 0.5, { opacity: 0, ease: Power3.easeInOut }), TweenLite.to(skyContainer, 0.5, { opacity: 0, ease: Power3.easeInOut }), TweenLite.to(Scamera.rotation, 3, { x: 0, ease: Power3.easeInOut }), TweenLite.to(Scamera.position, 3, { z: 50, ease: Power3.easeInOut }), TweenLite.to(Scamera.position, 2.5, { y: 0, ease: Power3.easeInOut }), TweenLite.to(Splane.scale, 3, { x: 1, ease: Power3.easeInOut })]);
outroTimeline.add([TweenLite.to(introContainer, 0.5, { opacity: 1, ease: Power3.easeIn })]);
});
render();
jsfiddle
И тут появляется ошибка Cannot read property 'add' of undefined
Также на странице есть еще один рендер, но он слишком длинный и не помещается. С ним все хорошо, а с этим плохо. Чтобы не было конфликта имен, я поменял в этом скрипте названия переменных, т.е. вариант, что там могут совпадать переменные отпадает. Очевидно, .add
получает в функцию undefined
и поэтому ругается, но почему он получает undefined
- непонятно. Где здесь ошибка?
Ошибки так как у Вас Sscene = void 0
, это значит Sscene==undefined
,
надо указать Sscene = new THREE.Scene()
.Если смотреть дальше,появляется ошибка
Uncaught TypeError: THREE.PointsMaterial is not a constructor
,полез смотреть объект,исправил на new THREE.PointCloudMaterial
.Далее получил ошибку на
Uncaught TypeError: THREE.Points is not a constructor
исправил на new THREE.PointCloud
.Далее выходит ошибка
Uncaught ReferenceError: scene is not defined
,а это как раз Sscene
.
И все должно render!
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Подскажите пожалуйста, насколько сложно сделать анимацию такого типа, как с машинкой на сайте: http://rit-teamru/ Это очень важно
У меня не получается написать программу, выводящую на экран таблицу, в которой количество строк и столбцов задается пользователемВ каждой...
Имеются 3 step by step вкладкиПосле открытия второй вкладки активируется прогресс бар, нужно сделать так что бы, после того как прогресс бар дойдет...
Необходимо задать следующую разметку, используя bootstrap, согласно макетуВажно, чтобы была адаптивность