gpt4 book ai didi

javascript - 将用户上传的纹理加载到 three.js 中的几何体

转载 作者:搜寻专家 更新时间:2023-10-31 08:50:43 26 4
gpt4 key购买 nike

我是 three.js 和 javascript(一般编码)的新手,但我在尝试各种可能性时获得了很多乐趣,并创建了一些带有灯光的 Three.js 小场景,来自 3D JSON 模型的自定义几何图形发展我的技能,以实现构建 3D 网站的最终目标。

我目前完全停留在允许用户从 HTML“输入”文件标签上传图像文件,并让该图像出现在场景中已经存在的 PlaneGeometry 网格上的问题上,该网格已经具有虚拟纹理加载到 Material 中。

我可以让纹理图像毫无问题地出现在平面上,并且屏幕上出现 HTML“输入”文件按钮,我可以单击它并加载图像,但它没有链接到 three.js 中的任何内容,并且这就是我卡住的地方,我不知道如何继续。

我找到了这个 JSFIDDLE EXAMPLE我可以看到它有效,但我不知道如何使用它来将自定义纹理添加到已经存在的几何体和 Material 中。

<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>

有没有人介意分享一个示例,说明他们将如何允许将用户上传的纹理加载到现有的纹理、 Material 和对象上?

image of current three.js result with HTML loader at the top

最佳答案

使用addEventListener添加“更改”事件到"file"输入:

document.getElementById('userImage').addEventListener('change', function(e) {
.....
} );

新文件可以通过事件参数的target.files[0]属性获取:

var userImage = e.target.files[0];     

使用URL.createObjectURL创建一个包含 URL 的 DOMString:

var userImageURL = URL.createObjectURL( userImage );

我建议使用 THREE.TextureLoader用于加载纹理:

var loader = new THREE.TextureLoader();
loader.setCrossOrigin("");
var texture = loader.load(userImageURL);

查看示例,该示例基于您问题的代码:

init()

function init(){
document.getElementById('userImage').addEventListener('change', function(e) {

var userImage = e.target.files[0];
var userImageURL = URL.createObjectURL( userImage );

container = document.getElementById('container');
camera = new THREE.OrthographicCamera();
renderer = new THREE.WebGLRenderer({ antialias: false });
renderer.setSize(window.innerWidth, window.innerHeight);
container.appendChild(renderer.domElement);

var loader = new THREE.TextureLoader();
loader.setCrossOrigin("");
var texture = loader.load(userImageURL);

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));

animate();
function animate() {
requestAnimationFrame(animate);

renderer.render(scene, camera);
}
} );
}
<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="https://threejs.org/build/three.min.js"></script>

关于javascript - 将用户上传的纹理加载到 three.js 中的几何体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50431636/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com