#javascript #html #css #three.js
#язык JavaScript #HTML #CSS #three.js
Вопрос:
Я пытаюсь загрузить это изображение в виде карты PointsMaterial
с TextureLoader
, но безуспешно, оно не выдает ошибок, но текстура по какой-то причине не отображается. Я делаю что-то не так или что?
Код:
const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 1, 1000 ); const particleBufferGeometry = new THREE.BufferGeometry(); const positionArray = []; for (let i = 0; i lt; 10000; i ) { positionArray.push((Math.random() * 2 - 1) * 200); positionArray.push((Math.random() * 2 - 1) * 200); positionArray.push((Math.random() * 2 - 1) * 200); } particleBufferGeometry.setAttribute("position", new THREE.Float32BufferAttribute(positionArray, 3)); const particlePointsMaterial = new THREE.PointsMaterial({ size: 0.3, map: new THREE.TextureLoader().load("./sparkle.png"), transparent: true, }); const particlePoints = new THREE.Points(particleBufferGeometry, particlePointsMaterial); const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true, canvas: document.getElementById("three") }); renderer.setClearColor(0x000000, 0); renderer.setSize( window.innerWidth, window.innerHeight ); scene.add(particlePoints); renderer.render(scene, camera);
Комментарии:
1. Похоже, что ваша текстура загружается, но ваши точки настолько малы, что вы не видите деталей. Попробуйте увеличить свои очки.
2. Не помогает, что они все еще невидимы.
Ответ №1:
Другой вариант — использовать цикл анимации:
body{ overflow: hidden; margin: 0; }
lt;canvas id="three"gt;lt;/canvasgt; lt;script type="module"gt; import * as THREE from "https://cdn.skypack.dev/three@0.135.0"; const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 1, 1000 ); const positionArray = []; for (let i = 0; i lt; 10000; i ) { positionArray.push(new THREE.Vector3().random().subScalar(0.5).multiplyScalar(400)); } const particleBufferGeometry = new THREE.BufferGeometry().setFromPoints(positionArray); const particlePointsMaterial = new THREE.PointsMaterial({ size: 3, map: new THREE.TextureLoader().load("https://threejs.org/examples/textures/sprites/spark1.png"), transparent: true, }); const particlePoints = new THREE.Points(particleBufferGeometry, particlePointsMaterial); const renderer = new THREE.WebGLRenderer({ antialias: true, alpha: true, canvas: document.getElementById("three") }); renderer.setClearColor(0x000000, 1); renderer.setSize( window.innerWidth, window.innerHeight ); scene.add(particlePoints); renderer.setAnimationLoop(() =gt; { // animation loop renderer.render(scene, camera); }); lt;/scriptgt;
Ответ №2:
Я понял, почему это происходит. Я передавал текстуру в виде карты до ее загрузки.
Это неправильно.
const particlePointsMaterial = new THREE.PointsMaterial({ size: 0.3, map: new THREE.TextureLoader().load("./sparkle.png"), transparent: true, });
load()
функция TextureLoader
имеет второй параметр onLoad, который выполняется при загрузке текстуры. Таким образом, решение заключается в:
new THREE.TextureLoader().load("./sparkle.png", (texture) =gt; { const particlePointsMaterial = new THREE.PointsMaterial({ transparent: true, map: texture }); const particlePoints = new THREE.Points(particleBufferGeometry, particlePointsMaterial); scene.add(particlePoints); renderer.render(scene, camera); });
Комментарии:
1. «Это неправильно». Это не так, просто в этом случае автору нужен цикл анимации.