转动的球点

转动的球点

更多有趣示例 尽在知屋安砖社区

示例

在这里插入图片描述

HTML

.container.fixed-top.header
  .row
    .col
      h1
        strong Sphere
      //p.lead – Information –

CSS

$white: #FFFFFF
$black: #000000

body 
  color: $black
  margin: 0
  text-align: center
  background-color: $black

canvas 
  display: block
  width: 100%
  height: 100%

p 
  color: rgba(255,255,255, 0.5)

.header 
  top: 50%
  transform: translatey(-50%)

a, a:hover, a:visited 
  color: $white
  text-decoration: none

h1 
  &:after 
    content: ' ThreeJS'
    font-size: 0.6rem
    position: relative
    top: -1rem

JS

// Three JS
//--------------------------------------------------------------------
var scene, camera, renderer, container;
var _width, _height;
var userDataGUI;
var _ambientLights, _lights;
var mousePointerX, mousePointerY;
var geoetry_space = 100;
//---
var _c = 1000; // Amount
var _s = 3;   // Shape
var _a = 1;   // Radio
//---

var Options = {
  cam: {
    zoom: 450
  },
  sphere: {
    vel: 0.5,
    segm: _s,
    size: _a,
    cant: _c,
    distance: 30,
    theta: 0.0138,
    angle: 0.01,
    phi: 10
  }
}
//---

var _groupItem = new THREE.Group();
window.addEventListener('load', init, false);
function init() {
  createGUI();
  createWorld();
  createLights();
  //createGrid();
  createPrimitive();
  createMousePointer();
  createCircles();
  //---
  animation();
}


var Theme = {
  primary: 0xFFFFFF,
  secundary: 0x0000FF,
  danger: 0xFF0000,
  darker: 0x111111
};

function createWorld() {
  _width = window.innerWidth;
  _height= window.innerHeight;
  //---
  scene = new THREE.Scene();
  scene.fog = new THREE.Fog(Theme.darker, 400, 700);
  scene.background = new THREE.Color(Theme.darker);
  //---
  camera = new THREE.PerspectiveCamera(35, _width/_height, 1, 5000);
  camera.position.set(0,0,1000);
  //---
  renderer = new THREE.WebGLRenderer({antialias:true, alpha:false});
  renderer.setSize(_width, _height);
  renderer.shadowMap.enabled = true;
  //---
  document.body.appendChild(renderer.domElement);
  //---
  window.addEventListener('resize', onWindowResize, false);
}
function onWindowResize() {
  _width = window.innerWidth;
  _height = window.innerHeight;
  renderer.setSize(_width, _height);
  camera.aspect = _width / _height;
  camera.updateProjectionMatrix();
  console.log('- resize -');
}
//--------------------------------------------------------------------
function createLights() {
  //_ambientLights = new THREE.AmbientLight(0xFFFFFF, 1);
  _ambientLights = new THREE.HemisphereLight(Theme.primary, Theme.secundary, 2);
  _lights = new THREE.PointLight(Theme.primary, 1);
  _lights.position.set(1000,1000,-500);
  scene.add(_lights);
  scene.add(_ambientLights);
}

function createMousePointer() {
  var starsGeometry = new THREE.Geometry();
  for ( var i = 0; i < 1000; i ++ ) {
    var star = new THREE.Vector3();
    var distance = 2;
    var theta = THREE.Math.randFloatSpread(90);
    var phi = THREE.Math.randFloatSpread(90);
    //---
    star.x = distance * Math.sin(theta) * Math.cos(phi);
    star.y = distance * Math.sin(theta) * Math.sin(phi);
    star.z = distance * Math.cos(theta);
    starsGeometry.computeBoundingSphere();
    //starsGeometry.normalize();
    starsGeometry.vertices.push( star );
    //---
  }
  var starsMaterial = new THREE.PointsMaterial( { color: 0xFFFFFF } );
  var starField = new THREE.Points( starsGeometry, starsMaterial );
  //_primitive.mesh.add( starField );
}

function createCircles() {
  //---
  for (var i = _groupItem.children.length - 1; i >= 0; i--) {
    _groupItem.remove(_groupItem.children[i]);
  }
  //---
  var geometry = new THREE.CircleBufferGeometry( _a, _s);
  var material = new THREE.MeshStandardMaterial( {
    //color: 0xffffff,
    side:THREE.DoubleSide,
    wireframe:false
  } );
  //---
  var distance = Options.sphere.distance;
  for (var i = 0; i<_c ; i++) {
    var circle = new THREE.Mesh( geometry, material );
    var theta = (i*(360 / (26)));
    var phi = i / 26;
    //var phi = THREE.Math.randFloatSpread(360);
    //---
    /*circle.position.x = distance * Math.sin(theta + i) * Math.cos(phi);
    circle.position.y = distance * Math.sin(theta+i) * Math.sin(phi);
    circle.position.z = distance * Math.cos(theta+i);*/
    //---
    _groupItem.add( circle );
  }
  scene.add(_groupItem);
}

//--------------------------------------------------------------------


function createGUI() {
  var gui = new dat.GUI();
  //gui.close();
  
  var cameraGUI = gui.addFolder('Camera');
  var setupGUI = gui.addFolder('Setup');
  var sphereGUI = gui.addFolder('Sphere');
  
  cameraGUI.add(Options.cam, 'zoom', 0, 500);
  setupGUI.add(Options.sphere, 'segm', 3, 7).step(1).name('Shape').onChange(function(argument) {
    //---
    _s = argument;
    createCircles();
    //---
  });
  setupGUI.add(Options.sphere, 'cant', 100, 2000).name('Amount').onChange(function(newValue) {
    //---
    _c = newValue;
    createCircles();
    //---
  });
  setupGUI.add(Options.sphere, 'size', 1, 10).step(1).name('Size').onChange(function(newValue) {
    //---
    _a = newValue;
    createCircles();
    //---
  });
  
  sphereGUI.add(Options.sphere, 'vel', 0.1, 1.0).name('Speed');
  sphereGUI.add(Options.sphere, 'distance', 10, 100).name('Radius').step(1);
  //sphereGUI.add(Options.sphere, 'theta', 0.01, 0.1).name('Theta');
  sphereGUI.add(Options.sphere, 'angle', 0.01, 0.1).name('Angle');
  sphereGUI.add(Options.sphere, 'phi', 1, 20).name('PI');
  
  sphereGUI.open();
  setupGUI.close();
  
}

function createBGColor() {
  renderer.setClearColor(new THREE.Color(Options.color.bgcolor));
}
//--------------------------------------------------------------------
var primitiveElement = function() {
  this.mesh = new THREE.Object3D();
  var geo = new THREE.IcosahedronGeometry(0.7, 4);
  var mat = new THREE.MeshPhongMaterial({color:Theme.primary, flatShading:false, wireframe:false});
  var matl = new THREE.MeshPhysicalMaterial({color:Theme.primary, flatShading:true});
  var mesh = new THREE.Mesh(geo, mat);
  var line = new THREE.Line(geo, matl);
  //---
  this.mesh.add(mesh);
  //this.mesh.add(line);
}
var _primitive;
function createPrimitive() {
  _primitive = new primitiveElement();
  _primitive.mesh.scale.set(100,100,100);
  scene.add(_primitive.mesh);
}
function createGrid() {
  var gridHelper = new THREE.GridHelper(20, 20);
  gridHelper.position.y = -1;
  scene.add(gridHelper);
}
//--------------------------------------------------------------------
function animation() {
  var time = Date.now() / 100000;
  _primitive.mesh.rotation.y += 0.001;
  _groupItem.rotation.y = _primitive.mesh.rotation.y;
  _groupItem.rotation.x = _primitive.mesh.rotation.y;
  _groupItem.rotation.z = _primitive.mesh.rotation.y;
  //---

  //--- THREE.Math.randFloatSpread(90)
  var d = (Options.sphere.distance * 5);
  var t = Math.sin(Options.sphere.theta) * 100;
  var a = ((Options.sphere.vel * 10) + time) + Math.sin((Math.cos(Options.sphere.angle) * 90)) * 15;
  var p = Math.cos(Options.sphere.phi) * 45;
  //---
  var f = 2;
  var r = THREE.Math.randFloatSpread(360);
  //---
  TweenMax.to(camera.position, 1, {z:-Options.cam.zoom + 1000});
  TweenMax.to(_primitive.mesh.scale, 1, {
    x:d / f,
    y:d / f,
    z:d / f
  })
  //---
  for (var i = 0, l = _groupItem.children.length; i<l; i++) {
    var _particle = _groupItem.children[i];
    var theta = ((i + 1)*(a / t)) * Math.PI / 180;
    var phi = (i + 1) / p;
    //---
    _particle.position.x = d * Math.sin(theta + i) * Math.cos(phi);
    _particle.position.y = d * Math.sin(theta + i) * Math.sin(phi);
    _particle.position.z = d * Math.cos(theta + i);
    
    _particle.lookAt(scene.position);
   }
  //---
  requestAnimationFrame(animation);
  renderer.render(scene, camera);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值