Я новичок в three.js и javascript (кодирование вообще), но мне очень интересно экспериментировать с возможностями, и я создал несколько небольших сцен Three.js со светом, пользовательской геометрией из 3D-моделей JSONчтобы развить свои навыки, чтобы справиться с моей конечной целью создания 3D-сайта.
В настоящее время я полностью застрял в вопросе о разрешении пользователю загружать файл изображения из тега HTML «входной» файл HTML.и чтобы это изображение появилось в сетке PlaneGeometry, которая уже существует в сцене с фиктивной текстурой, уже загруженной в материал.
Я могу иметь изображение текстуры, отображаемое на плоскости без проблем, и у меня есть HTMLНа экране появляется кнопка «Ввод», я могу нажать на нее, и она загрузит изображение, но оно не связано ни с чем в three.js, и вот где я застрял, я не понимаю, как действовать.
Я нашел этот JSFIDDLE EXAMPLE , который, как я вижу, работает, но я не могу понять, как его использовать для добавления пользовательской текстуры в аггеометрия и материал, который уже существует.
<body>
<!-- three.js container -->
<input id="userImage" type="file" />
<div id="container"></div>
<script type="x-shader/x-vertex" id="vertexShader">
varying vec2 vUv;
void main() {
vUv = uv;
gl_Position = vec4(uv * 2. - vec2(1, 1), 0., 1.);
}
</script>
<script type="x-shader/x-fragment" id="fragmentShader">
precision highp float;
varying vec2 vUv;
uniform sampler2D texture1;
void main() {
gl_FragColor = texture2D(texture1, vUv.xy);
}
</script>
<script type="text/javascript" src="js/jquery.min.js"></script>
<script type="text/javascript" src="js/three.min.js"></script>
<script>
init()
function init(){
$("#userImage").change(function () {
var image = document.createElement( 'img' );
var texture = new THREE.Texture( image );
image.onload = function() {
texture.needsUpdate = true;
};
userImage = $("#userImage")[0];
if (userImage.files && userImage.files[0]) {
var reader = new FileReader();
reader.onload = function (e) {
image.src = e.target.result;
};
reader.readAsDataURL(userImage.files[0]);
}
camera = new THREE.OrthographicCamera();
renderer = new THREE.WebGLRenderer({
antialias: false
});
renderer.setSize(window.innerWidth, window.innerHeight);
shader = new THREE.ShaderMaterial({
vertexShader: document.getElementById('vertexShader').textContent,
fragmentShader: document.getElementById('fragmentShader').textContent,
uniforms: {
texture1: {
type: "t",
value: texture
}
}
});
scene = new THREE.Scene();
scene.add(new THREE.Mesh(new THREE.PlaneGeometry(1), shader));
$('#container').append(renderer.domElement);
animate();
function animate() {
requestAnimationFrame(animate);
renderer.render(scene, camera);
}
});
}
</script>
Кто-нибудь возражал бы поделиться примером того, как они будут разрешать загрузку загруженной пользователем текстуры на уже существующую текстуру, материал иобъект ??
изображение текущего результата three.js с загрузчиком HTML вверху