私はすべての粒子が同じ座標に、そして次々とランダムな方向に配置されている粒子システムを持っています。球体を形成する場面。Three.JS - 球を形成するランダムな方向の点を周回する粒子
私が今までに達成したのは、現在の角度に基づいてサインとコサインを計算するだけで、Z軸に沿って中心を周回する一連のVector3オブジェクト(パーティクル)のグループです。
私は数学ではあまりよくありません。私は正確に何を探すべきか分からないのです。ここで
は、私が書いたものです:あなたが生きて、それを見たい場合は
var scene = new THREE.Scene();
let container = document.getElementById('container'),
loader = new THREE.TextureLoader(),
renderer,
camera,
maxParticles = 5000,
particlesDelay = 50,
radius = 50,
sphereGeometry,
sphere;
loader.crossOrigin = true;
function init() {
let vw = window.innerWidth,
vh = window.innerHeight;
renderer = new THREE.WebGLRenderer();
renderer.setSize(vw, vh);
renderer.setPixelRatio(window.devicePixelRatio);
camera = new THREE.PerspectiveCamera(45, vw/vh, 1, 1000);
camera.position.z = 200;
camera.position.x = 30;
camera.position.y = 30;
camera.lookAt(scene.position);
scene.add(camera);
let controls = new THREE.OrbitControls(camera, renderer.domElement);
let axisHelper = new THREE.AxisHelper(50);
scene.add(axisHelper);
container.appendChild(renderer.domElement);
window.addEventListener('resize', onResize, false);
}
function onResize() {
camera.aspect = window.innerWidth/window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
}
function draw() {
sphereGeometry = new THREE.Geometry();
sphereGeometry.dynamic = true;
let particleTexture = loader.load('https://threejs.org/examples/textures/particle2.png'),
material = new THREE.PointsMaterial({
color: 0xffffff,
size: 3,
transparent: true,
blending: THREE.AdditiveBlending,
map: particleTexture,
depthWrite: false
});
for (let i = 0; i < maxParticles; i++) {
let vertex = new THREE.Vector3(radius, 0, 0);
vertex.delay = Date.now() + (particlesDelay * i);
vertex.angle = 0;
sphereGeometry.vertices.push(vertex);
}
sphere = new THREE.Points(sphereGeometry, material);
scene.add(sphere);
}
function update() {
for (let i = 0; i < maxParticles; i++) {
let particle = sphereGeometry.vertices[i];
if (Date.now() > particle.delay) {
let angle = particle.angle += 0.01;
particle.x = radius * Math.cos(angle);
if (i % 2 === 0) {
particle.y = radius * Math.sin(angle);
} else {
particle.y = -radius * Math.sin(angle);
}
}
}
sphere.geometry.verticesNeedUpdate = true;
}
function render() {
update();
renderer.render(scene, camera);
requestAnimationFrame(render);
}
init();
draw();
render();
そして、ここではJSFiddleです: https://jsfiddle.net/kekkorider/qs6s0wv2/
EDIT:Working example
誰かが私に手をお願いできます?
ありがとうございます!
@micnilこんにちは、あなたのソリューションが魅力として働いていた、あなたの助けに感謝をたくさん:) 他の誰かがそれを必要とする場合には、私は、実施例へのリンクを追加しました。 –
@micnilあなたは私のために何かを明確にすることができますか?私はこの例を勉強しています。本当にクールな効果が得られ、「ブラックホール」のシーンを構築する予定です。 ランダムなyとzの値を持つVector3である 'vertex.rotationAxis'は、粒子をランダムな方向に回転させますか?私は数日の間jsfiddleを突き刺してきましたが、球を形成する粒子の効果を作り出すものはまだ分かりません。私は 'applyAxisAngle'がこれを作る魔法であることを知っていますが、なぜ私は各パーティクルの' rotationAxis'のyとzを調整するのか理解していません。 –
@AlexFallenstedt基本的に、パーティクルが回転できるベクトルを作成しました。そのイメージと数字のないコメントでテキストで説明するのはちょっと難しいです。しかし、あなたのフィドルのこのバージョンを考えてみましょう:[https:// jsfiddle。net/qs6s0wv2/5 /](https://jsfiddle.net/qs6s0wv2/5/)。時間のカップリングを「実行」すると、回転軸が変化したときのパーティクルの動作がわかります。 – micnil